From 9999c28a37ede00b33703c75c7dc66be5dd21104 Mon Sep 17 00:00:00 2001 From: Chalith Desaman Date: Fri, 12 Mar 2021 19:01:58 +0530 Subject: [PATCH] Remove self connection on peer discovery (#269) * Resetting last shard syncing flags when sync is abandoned. (#268) * Remove self loopback connection when self is added by peer discovery * Resolved PR comments Co-authored-by: Savinda Senevirathne --- src/p2p/p2p.cpp | 25 +++++++++++++++++++++++++ src/p2p/self_node.cpp | 2 ++ src/p2p/self_node.hpp | 2 ++ 3 files changed, 29 insertions(+) diff --git a/src/p2p/p2p.cpp b/src/p2p/p2p.cpp index 54228346..18fa7ff7 100644 --- a/src/p2p/p2p.cpp +++ b/src/p2p/p2p.cpp @@ -112,6 +112,24 @@ namespace p2p if (res == 0) { LOG_DEBUG << "Pubkey violation. Rejecting new peer connection [" << session.display_name() << "]"; + + // It's possible, Self node might've been added to the known peers by peer discovery. + // If so remove the self from known peers. + if (session.known_ipport.has_value()) + { + // We set self ip port values so that we can remove self from the future known peer responses. + self::ip_port = conf::peer_ip_port{session.known_ipport->host_address, session.known_ipport->port}; + { + std::scoped_lock lock(ctx.server->req_known_remotes_mutex); + ctx.server->req_known_remotes.erase(std::remove_if(ctx.server->req_known_remotes.begin(), ctx.server->req_known_remotes.end(), + [&](const p2p::peer_properties &peer) { + return peer.ip_port.port == session.known_ipport->port; + })); + ctx.server->known_remote_count = ctx.server->req_known_remotes.size(); + } + LOG_DEBUG << "Loopback connection detected: Removed self from the peer list."; + } + return -1; } @@ -413,6 +431,13 @@ namespace p2p for (const peer_properties &peer : peers) { + // If the peer is self, we won't add to the known peer list. + if (self::ip_port.has_value() && self::ip_port == peer.ip_port) + { + LOG_DEBUG << "Rejecting " + peer.ip_port.host_address + ":" + std::to_string(peer.ip_port.port) + ". Loopback connection."; + continue; + } + const auto itr = std::find_if(ctx.server->req_known_remotes.begin(), ctx.server->req_known_remotes.end(), [&](peer_properties &p) { return p.ip_port == peer.ip_port; }); // If the new peer is not in the peer list then add to the req_known_remotes diff --git a/src/p2p/self_node.cpp b/src/p2p/self_node.cpp index b62d8688..33cb66e6 100644 --- a/src/p2p/self_node.cpp +++ b/src/p2p/self_node.cpp @@ -6,6 +6,8 @@ namespace p2p::self // Holds self messages waiting to be processed. moodycamel::ConcurrentQueue msg_queue; + std::optional ip_port; + /** * Processes the next queued message (if any). * @return 0 if no messages in queue. 1 if message was processed successfully. -1 on error. diff --git a/src/p2p/self_node.hpp b/src/p2p/self_node.hpp index f26e16b6..8e86a43c 100644 --- a/src/p2p/self_node.hpp +++ b/src/p2p/self_node.hpp @@ -5,6 +5,8 @@ namespace p2p::self { + extern std::optional ip_port; + int process_next_message(); void send(std::string_view message);