]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
msg/async: asyncconnection: update the source address info
authorRicardo Dias <rdias@suse.com>
Tue, 30 Oct 2018 16:41:52 +0000 (16:41 +0000)
committerRicardo Dias <rdias@suse.com>
Wed, 23 Jan 2019 13:59:23 +0000 (13:59 +0000)
Signed-off-by: Ricardo Dias <rdias@suse.com>
src/msg/async/AsyncConnection.cc
src/msg/async/AsyncConnection.h
src/msg/async/ProtocolV1.cc

index 13711c98bc933a3ae4ba2c84c4467a7ba3afa421..ebdfa3fd9426f9cc41b6856588ed1aecbac6d9eb 100644 (file)
@@ -406,6 +406,11 @@ void AsyncConnection::process() {
       }
 
       center->delete_file_event(cs.fd(), EVENT_WRITABLE);
+
+      update_socket_addr(target_addr.get_type());
+      lock.unlock();
+      async_msgr->learned_addr(socket_addr);
+      lock.lock();
       ldout(async_msgr->cct, 10)
           << __func__ << " connect successfully, ready to send banner" << dendl;
       state = STATE_CONNECTION_ESTABLISHED;
@@ -444,6 +449,28 @@ bool AsyncConnection::is_connected() {
   return protocol->is_connected();
 }
 
+bool AsyncConnection::update_socket_addr(uint32_t type) {
+  sockaddr_storage ss;
+  socklen_t slen = sizeof(ss);
+  int r = getsockname(cs.fd(), (sockaddr *)&ss, &slen);
+  if (r == 0) {
+    entity_addr_t bind_addr;
+    bind_addr.set_type(type);
+    bind_addr.set_sockaddr((sockaddr*)&ss);
+    for (auto a : async_msgr->get_myaddrs().v) {
+      if (a.is_same_host(bind_addr) && a.get_port() == bind_addr.get_port()) {
+        socket_addr = a;
+        break;
+      }
+    }
+    if (socket_addr.is_blank_ip()) {
+      socket_addr = bind_addr;
+    }
+    return true;
+  }
+  return false;
+}
+
 void AsyncConnection::connect(const entity_addrvec_t &addrs, int type,
                               entity_addr_t &target) {
 
@@ -476,9 +503,13 @@ void AsyncConnection::accept(ConnectedSocket socket,
   ceph_assert(socket.fd() >= 0);
 
   std::lock_guard<std::mutex> l(lock);
+
   cs = std::move(socket);
-  socket_addr = listen_addr;
+  if (!update_socket_addr(listen_addr.get_type())) {
+    socket_addr = listen_addr;
+  }
   target_addr = peer_addr; // until we know better
+
   state = STATE_ACCEPTING;
   protocol->accept();
   // rescheduler connection in order to avoid lock dep
index c30b6d443289622c2baaede33b397247a589739d..519ebb739eecc62ec1009002fa3fd138f50aac70 100644 (file)
@@ -136,6 +136,8 @@ class AsyncConnection : public Connection {
    return target_addr;
  }
 
+ bool update_socket_addr(uint32_t type);
+
  private:
   enum {
     STATE_NONE,
index 73911839a5ad38286031108aa231a7c187d2148c..cccaa6183b855fccf0f69dbd2c11aeaa56efe5ad 100644 (file)
@@ -1779,7 +1779,7 @@ CtPtr ProtocolV1::handle_client_banner(char *buffer, int r) {
     peer_addr.set_port(port);
 
     ldout(cct, 0) << __func__ << " accept peer addr is really " << peer_addr
-                  << " (socket is " << connection->socket_addr << ")" << dendl;
+                  << " (socket is " << connection->target_addr << ")" << dendl;
   }
   connection->set_peer_addr(peer_addr);  // so that connection_state gets set up
   connection->target_addr = peer_addr;