diff --git a/src/avalanche/peermanager.cpp b/src/avalanche/peermanager.cpp --- a/src/avalanche/peermanager.cpp +++ b/src/avalanche/peermanager.cpp @@ -235,7 +235,8 @@ if (danglingProofIds.contains(proofid) && pendingNodes.count(proofid) == 0) { // Don't attempt to register a proof that we already evicted because it - // was dangling. + // was dangling, but rather attempt to retrieve an associated node. + needMoreNodes = true; return invalidate(ProofRegistrationResult::DANGLING, "dangling-proof"); } diff --git a/src/avalanche/test/peermanager_tests.cpp b/src/avalanche/test/peermanager_tests.cpp --- a/src/avalanche/test/peermanager_tests.cpp +++ b/src/avalanche/test/peermanager_tests.cpp @@ -1488,6 +1488,18 @@ BOOST_CHECK(!pm.shouldRequestMoreNodes()); } + // Attempt to register the dangling proof again. This should fail but + // trigger a request for more nodes. + ProofRegistrationState state; + BOOST_CHECK(!pm.registerProof(proof2, state)); + BOOST_CHECK(state.GetResult() == ProofRegistrationResult::DANGLING); + BOOST_CHECK(pm.shouldRequestMoreNodes()); + + for (size_t i = 0; i < 10; i++) { + // The flag will not trigger again until the condition is met again + BOOST_CHECK(!pm.shouldRequestMoreNodes()); + } + // Attach a node to that proof BOOST_CHECK(!pm.addNode(11, proof2->getId())); BOOST_CHECK(pm.registerProof(proof2));