From: Ricardo Dias Date: Tue, 30 Oct 2018 16:41:52 +0000 (+0000) Subject: msg/async: asyncconnection: update the source address info X-Git-Tag: v14.1.0~271^2~57 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=f9d2328a505e0d70418ed2723e9ed828daef517d;p=ceph.git msg/async: asyncconnection: update the source address info Signed-off-by: Ricardo Dias --- diff --git a/src/msg/async/AsyncConnection.cc b/src/msg/async/AsyncConnection.cc index 13711c98bc933..ebdfa3fd9426f 100644 --- a/src/msg/async/AsyncConnection.cc +++ b/src/msg/async/AsyncConnection.cc @@ -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 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 diff --git a/src/msg/async/AsyncConnection.h b/src/msg/async/AsyncConnection.h index c30b6d4432896..519ebb739eecc 100644 --- a/src/msg/async/AsyncConnection.h +++ b/src/msg/async/AsyncConnection.h @@ -136,6 +136,8 @@ class AsyncConnection : public Connection { return target_addr; } + bool update_socket_addr(uint32_t type); + private: enum { STATE_NONE, diff --git a/src/msg/async/ProtocolV1.cc b/src/msg/async/ProtocolV1.cc index 73911839a5ad3..cccaa6183b855 100644 --- a/src/msg/async/ProtocolV1.cc +++ b/src/msg/async/ProtocolV1.cc @@ -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;