]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/net: add support for ms_learn_addr_from_peer. 43542/head
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 14 Oct 2021 13:55:23 +0000 (13:55 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 8 Dec 2021 08:46:50 +0000 (08:46 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/net/Socket.h
src/crimson/net/SocketConnection.cc
src/crimson/net/SocketConnection.h
src/crimson/net/SocketMessenger.cc

index 4e33122a43fbf014fc719e4f297d31e8421011ae..98e84a26c637fd49a749323badabb4831ad710d4 100644 (file)
@@ -127,6 +127,10 @@ class Socket
     ephemeral_port = port;
   }
 
+  seastar::socket_address get_local_address() const {
+    return socket.local_address();
+  }
+
  private:
   const seastar::shard_id sid;
   seastar::connected_socket socket;
index 99abf890454d0e2a41eb5ba2d74adeb9ffe0622f..2fb2f1f1ec8fd81854eb6956dc998de8a70207b3 100644 (file)
@@ -131,6 +131,10 @@ seastar::shard_id SocketConnection::shard_id() const {
   return messenger.shard_id();
 }
 
+seastar::socket_address SocketConnection::get_local_address() const {
+  return protocol->socket->get_local_address();
+}
+
 void SocketConnection::print(ostream& out) const {
     messenger.print(out);
     if (!protocol->socket) {
index 4513e338f369a9500eec695d9fecbc39b6b95b28..4aad9d65747c638ccff83fcf6f9e643f184e3ed6 100644 (file)
@@ -96,6 +96,8 @@ class SocketConnection : public Connection {
     return policy.lossy;
   }
 
+  seastar::socket_address get_local_address() const;
+
   friend class Protocol;
   friend class ProtocolV1;
   friend class ProtocolV2;
index 8f8ffd8f19ae041006c1db18d97bf759447e67f0..b142828d16f827ff1d4fb3b461c9ecfed24e8a50 100644 (file)
@@ -250,6 +250,29 @@ seastar::future<> SocketMessenger::shutdown()
   });
 }
 
+static entity_addr_t choose_addr(
+  const entity_addr_t &peer_addr_for_me,
+  const SocketConnection& conn)
+{
+  using crimson::common::local_conf;
+  // XXX: a syscall is here
+  if (const auto local_addr = conn.get_local_address();
+      local_conf()->ms_learn_addr_from_peer) {
+    logger().info("{} peer {} says I am {} (socket says {})",
+                  conn, conn.get_peer_socket_addr(), peer_addr_for_me,
+                  local_addr);
+    return peer_addr_for_me;
+  } else {
+    const auto local_addr_for_me = conn.get_local_address();
+    logger().info("{} socket to {} says I am {} (peer says {})",
+                  conn, conn.get_peer_socket_addr(),
+                  local_addr, peer_addr_for_me);
+    entity_addr_t addr;
+    addr.set_sockaddr(&local_addr_for_me.as_posix_sockaddr());
+    return addr;
+  }
+}
+
 seastar::future<> SocketMessenger::learned_addr(const entity_addr_t &peer_addr_for_me, const SocketConnection& conn)
 {
   assert(seastar::this_shard_id() == master_sid);
@@ -268,14 +291,13 @@ seastar::future<> SocketMessenger::learned_addr(const entity_addr_t &peer_addr_f
 
   if (get_myaddr().get_type() == entity_addr_t::TYPE_NONE) {
     // Not bound
-    entity_addr_t addr = peer_addr_for_me;
+    auto addr = choose_addr(peer_addr_for_me, conn);
     addr.set_type(entity_addr_t::TYPE_ANY);
     addr.set_port(0);
     need_addr = false;
     return set_myaddrs(entity_addrvec_t{addr}
-    ).then([this, &conn, peer_addr_for_me] {
-      logger().info("{} learned myaddr={} (unbound) from {}",
-                    conn, get_myaddr(), peer_addr_for_me);
+    ).then([this, &conn] {
+      logger().info("{} learned myaddr={} (unbound)", conn, get_myaddr());
     });
   } else {
     // Already bound
@@ -293,14 +315,13 @@ seastar::future<> SocketMessenger::learned_addr(const entity_addr_t &peer_addr_f
           make_error_code(crimson::net::error::bad_peer_address));
     }
     if (get_myaddr().is_blank_ip()) {
-      entity_addr_t addr = peer_addr_for_me;
+      auto addr = choose_addr(peer_addr_for_me, conn);
       addr.set_type(get_myaddr().get_type());
       addr.set_port(get_myaddr().get_port());
       need_addr = false;
       return set_myaddrs(entity_addrvec_t{addr}
-      ).then([this, &conn, peer_addr_for_me] {
-        logger().info("{} learned myaddr={} (blank IP) from {}",
-                      conn, get_myaddr(), peer_addr_for_me);
+      ).then([this, &conn] {
+        logger().info("{} learned myaddr={} (blank IP)", conn, get_myaddr());
       });
     } else if (!get_myaddr().is_same_host(peer_addr_for_me)) {
       logger().warn("{} peer_addr_for_me {} IP doesn't match myaddr {}",