diff --git a/src/avalanche/processor.h b/src/avalanche/processor.h --- a/src/avalanche/processor.h +++ b/src/avalanche/processor.h @@ -243,8 +243,7 @@ } /** Handle removal of a node */ - void FinalizeNode(const ::Config &config, const CNode &node, - bool &update_connection_time) override; + void FinalizeNode(const ::Config &config, const CNode &node) override; private: void runEventLoop(); diff --git a/src/avalanche/processor.cpp b/src/avalanche/processor.cpp --- a/src/avalanche/processor.cpp +++ b/src/avalanche/processor.cpp @@ -774,8 +774,7 @@ return true; } -void Processor::FinalizeNode(const ::Config &config, const CNode &node, - bool &update_connection_time) { +void Processor::FinalizeNode(const ::Config &config, const CNode &node) { WITH_LOCK(cs_peerManager, peerManager->removeNode(node.GetId())); } diff --git a/src/net.h b/src/net.h --- a/src/net.h +++ b/src/net.h @@ -897,8 +897,7 @@ virtual void InitializeNode(const Config &config, CNode *pnode) = 0; /** Handle removal of a peer (clear state) */ - virtual void FinalizeNode(const Config &config, const CNode &node, - bool &update_connection_time) = 0; + virtual void FinalizeNode(const Config &config, const CNode &node) = 0; /** * Process protocol messages received from a given node diff --git a/src/net.cpp b/src/net.cpp --- a/src/net.cpp +++ b/src/net.cpp @@ -3171,12 +3171,8 @@ void CConnman::DeleteNode(CNode *pnode) { assert(pnode); - bool fUpdateConnectionTime = false; for (auto interface : m_msgproc) { - interface->FinalizeNode(*config, *pnode, fUpdateConnectionTime); - } - if (fUpdateConnectionTime) { - addrman.Connected(pnode->addr); + interface->FinalizeNode(*config, *pnode); } delete pnode; } diff --git a/src/net_processing.cpp b/src/net_processing.cpp --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -484,8 +484,7 @@ /** Implement NetEventsInterface */ void InitializeNode(const Config &config, CNode *pnode) override; - void FinalizeNode(const Config &config, const CNode &node, - bool &fUpdateConnectionTime) override; + void FinalizeNode(const Config &config, const CNode &node) override; bool ProcessMessages(const Config &config, CNode *pfrom, std::atomic &interrupt) override; bool SendMessages(const Config &config, CNode *pto) override @@ -1791,13 +1790,11 @@ avalanchePeriodicNetworkingInterval); } -void PeerManagerImpl::FinalizeNode(const Config &config, const CNode &node, - bool &fUpdateConnectionTime) { +void PeerManagerImpl::FinalizeNode(const Config &config, const CNode &node) { NodeId nodeid = node.GetId(); - fUpdateConnectionTime = false; + int misbehavior{0}; { LOCK(cs_main); - int misbehavior{0}; { // We remove the PeerRef from g_peer_map here, but we don't always // destruct the Peer. Sometimes another thread is still holding a @@ -1818,12 +1815,6 @@ nSyncStarted--; } - if (node.fSuccessfullyConnected && misbehavior == 0 && - !node.IsBlockOnlyConn() && !node.IsInboundConn()) { - // Only change visible addrman state for outbound, full-relay peers - fUpdateConnectionTime = true; - } - for (const QueuedBlock &entry : state->vBlocksInFlight) { mapBlocksInFlight.erase(entry.hash); } @@ -1849,6 +1840,14 @@ } } + if (node.fSuccessfullyConnected && misbehavior == 0 && + !node.IsBlockOnlyConn() && !node.IsInboundConn()) { + // Only change visible addrman state for full outbound peers. We don't + // call Connected() for feeler connections since they don't have + // fSuccessfullyConnected set. + m_addrman.Connected(node.addr); + } + WITH_LOCK(cs_proofrequest, m_proofrequest.DisconnectedPeer(nodeid)); LogPrint(BCLog::NET, "Cleared nodestate for peer=%d\n", nodeid); diff --git a/src/test/denialofservice_tests.cpp b/src/test/denialofservice_tests.cpp --- a/src/test/denialofservice_tests.cpp +++ b/src/test/denialofservice_tests.cpp @@ -126,8 +126,7 @@ BOOST_CHECK(dummyNode1.fDisconnect == true); SetMockTime(0); - bool dummy; - peerLogic->FinalizeNode(config, dummyNode1, dummy); + peerLogic->FinalizeNode(config, dummyNode1); } static void AddRandomOutboundPeer(const Config &config, @@ -227,9 +226,8 @@ BOOST_CHECK(vNodes[max_outbound_full_relay - 1]->fDisconnect == true); BOOST_CHECK(vNodes.back()->fDisconnect == false); - bool dummy; for (const CNode *node : vNodes) { - peerLogic->FinalizeNode(config, *node, dummy); + peerLogic->FinalizeNode(config, *node); } connman->ClearNodes(); @@ -295,9 +293,8 @@ BOOST_CHECK(banman->IsDiscouraged(addr1)); // Expect both 1 and 2 BOOST_CHECK(banman->IsDiscouraged(addr2)); // to be discouraged now - bool dummy; - peerLogic->FinalizeNode(config, dummyNode1, dummy); - peerLogic->FinalizeNode(config, dummyNode2, dummy); + peerLogic->FinalizeNode(config, dummyNode1); + peerLogic->FinalizeNode(config, dummyNode2); } BOOST_AUTO_TEST_CASE(DoS_bantime) { @@ -334,8 +331,7 @@ } BOOST_CHECK(banman->IsDiscouraged(addr)); - bool dummy; - peerLogic->FinalizeNode(config, dummyNode, dummy); + peerLogic->FinalizeNode(config, dummyNode); } class TxOrphanageTest : public TxOrphanage {