From cdef16ecf7282078008d84f8ae6e8e1d520abb78 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Thu, 14 Oct 2021 13:55:23 +0000 Subject: [PATCH] crimson/net: add support for ms_learn_addr_from_peer. Signed-off-by: Radoslaw Zarzynski --- src/crimson/net/Socket.h | 4 ++++ src/crimson/net/SocketConnection.cc | 4 ++++ src/crimson/net/SocketConnection.h | 2 ++ src/crimson/net/SocketMessenger.cc | 37 ++++++++++++++++++++++------- 4 files changed, 39 insertions(+), 8 deletions(-) diff --git a/src/crimson/net/Socket.h b/src/crimson/net/Socket.h index 4e33122a43f..98e84a26c63 100644 --- a/src/crimson/net/Socket.h +++ b/src/crimson/net/Socket.h @@ -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; diff --git a/src/crimson/net/SocketConnection.cc b/src/crimson/net/SocketConnection.cc index 99abf890454..2fb2f1f1ec8 100644 --- a/src/crimson/net/SocketConnection.cc +++ b/src/crimson/net/SocketConnection.cc @@ -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) { diff --git a/src/crimson/net/SocketConnection.h b/src/crimson/net/SocketConnection.h index 4513e338f36..4aad9d65747 100644 --- a/src/crimson/net/SocketConnection.h +++ b/src/crimson/net/SocketConnection.h @@ -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; diff --git a/src/crimson/net/SocketMessenger.cc b/src/crimson/net/SocketMessenger.cc index 8f8ffd8f19a..b142828d16f 100644 --- a/src/crimson/net/SocketMessenger.cc +++ b/src/crimson/net/SocketMessenger.cc @@ -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 {}", -- 2.39.5