mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-01-18 22:35:39 +01:00
Merge bitcoin/bitcoin#31666: multi-peer orphan resolution followups
7426afbe62[p2p] assign just 1 random announcer in AddChildrenToWorkSet (glozow)4c1fa6b28ctest fix: make peer who sends MSG_TX announcement non-wtxidrelay (glozow)2da46b88f0pass P2PTxInvStore init args to P2PInterface init (glozow)e3bd51e4b5[doc] how unique_parents can be empty (glozow)32eb6dc758[refactor] assign local variable for wtxid (glozow)18820ccf6bmulti-announcer orphan handling test fixups (glozow)c4cc61db98[fuzz] GetCandidatePeers (glozow)7704139cf0[refactor] make GetCandidatePeers take uint256 and in-out vector (glozow)6e4d392a75[refactor] rename to OrphanResolutionCandidate to MaybeAdd* (glozow)57221ad979[refactor] move parent inv-adding to OrphanResolutionCandidate (glozow) Pull request description: Followup to #31397. Addressing (in order): https://github.com/bitcoin/bitcoin/pull/31397#discussion_r1906077380 https://github.com/bitcoin/bitcoin/pull/31397#discussion_r1881060842 https://github.com/bitcoin/bitcoin/pull/31397#discussion_r1905994963 https://github.com/bitcoin/bitcoin/pull/31397#discussion_r1905999581 https://github.com/bitcoin/bitcoin/pull/31397#discussion_r1906001592 https://github.com/bitcoin/bitcoin/pull/31397#discussion_r1905989913 https://github.com/bitcoin/bitcoin/pull/31397#discussion_r1905920861 https://github.com/bitcoin/bitcoin/pull/31658#pullrequestreview-2551617694 https://github.com/bitcoin/bitcoin/pull/31397#discussion_r1917559601 ACKs for top commit: instagibbs: reACK7426afbe62marcofleon: reACK7426afbe62mzumsande: Code Review ACK7426afbe62dergoegge: Code review ACK7426afbe62Tree-SHA512: bca8f576873fdaa20b758e1ee9708ce94e618ff14726864b29b50f0f9a4db58136a286d2b654af569b09433a028901fe6bcdda68dcbfea71e2d1271934725503
This commit is contained in:
@@ -33,7 +33,7 @@ void initialize_orphanage()
|
||||
FUZZ_TARGET(txorphan, .init = initialize_orphanage)
|
||||
{
|
||||
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
|
||||
FastRandomContext limit_orphans_rng{/*fDeterministic=*/true};
|
||||
FastRandomContext orphanage_rng{/*fDeterministic=*/true};
|
||||
SetMockTime(ConsumeTime(fuzzed_data_provider));
|
||||
|
||||
TxOrphanage orphanage;
|
||||
@@ -79,7 +79,7 @@ FUZZ_TARGET(txorphan, .init = initialize_orphanage)
|
||||
// previous loop and potentially the parent of this tx.
|
||||
if (ptx_potential_parent) {
|
||||
// Set up future GetTxToReconsider call.
|
||||
orphanage.AddChildrenToWorkSet(*ptx_potential_parent);
|
||||
orphanage.AddChildrenToWorkSet(*ptx_potential_parent, orphanage_rng);
|
||||
|
||||
// Check that all txns returned from GetChildrenFrom* are indeed a direct child of this tx.
|
||||
NodeId peer_id = fuzzed_data_provider.ConsumeIntegral<NodeId>();
|
||||
@@ -154,7 +154,7 @@ FUZZ_TARGET(txorphan, .init = initialize_orphanage)
|
||||
// test mocktime and expiry
|
||||
SetMockTime(ConsumeTime(fuzzed_data_provider));
|
||||
auto limit = fuzzed_data_provider.ConsumeIntegral<unsigned int>();
|
||||
orphanage.LimitOrphans(limit, limit_orphans_rng);
|
||||
orphanage.LimitOrphans(limit, orphanage_rng);
|
||||
Assert(orphanage.Size() <= limit);
|
||||
});
|
||||
|
||||
|
||||
@@ -295,6 +295,19 @@ public:
|
||||
tracked += m_announcements[txhash][peer].m_state != State::NOTHING;
|
||||
inflight += m_announcements[txhash][peer].m_state == State::REQUESTED;
|
||||
candidates += m_announcements[txhash][peer].m_state == State::CANDIDATE;
|
||||
|
||||
std::bitset<MAX_PEERS> expected_announcers;
|
||||
for (int peer = 0; peer < MAX_PEERS; ++peer) {
|
||||
if (m_announcements[txhash][peer].m_state == State::CANDIDATE || m_announcements[txhash][peer].m_state == State::REQUESTED) {
|
||||
expected_announcers[peer] = true;
|
||||
}
|
||||
}
|
||||
std::vector<NodeId> candidate_peers;
|
||||
m_tracker.GetCandidatePeers(TXHASHES[txhash], candidate_peers);
|
||||
assert(expected_announcers.count() == candidate_peers.size());
|
||||
for (const auto& peer : candidate_peers) {
|
||||
assert(expected_announcers[peer]);
|
||||
}
|
||||
}
|
||||
assert(m_tracker.Count(peer) == tracked);
|
||||
assert(m_tracker.CountInFlight(peer) == inflight);
|
||||
|
||||
@@ -532,19 +532,27 @@ BOOST_AUTO_TEST_CASE(peer_worksets)
|
||||
BOOST_CHECK(orphanage.HaveTxFromPeer(orphan_wtxid, node));
|
||||
}
|
||||
|
||||
// Parent accepted: add child to all 3 worksets.
|
||||
orphanage.AddChildrenToWorkSet(*tx_missing_parent);
|
||||
BOOST_CHECK_EQUAL(orphanage.GetTxToReconsider(node0), tx_orphan);
|
||||
BOOST_CHECK_EQUAL(orphanage.GetTxToReconsider(node1), tx_orphan);
|
||||
// Don't call GetTxToReconsider(node2) yet because it mutates the workset.
|
||||
// Parent accepted: child is added to 1 of 3 worksets.
|
||||
orphanage.AddChildrenToWorkSet(*tx_missing_parent, det_rand);
|
||||
int node0_reconsider = orphanage.HaveTxToReconsider(node0);
|
||||
int node1_reconsider = orphanage.HaveTxToReconsider(node1);
|
||||
int node2_reconsider = orphanage.HaveTxToReconsider(node2);
|
||||
BOOST_CHECK_EQUAL(node0_reconsider + node1_reconsider + node2_reconsider, 1);
|
||||
|
||||
NodeId assigned_peer;
|
||||
if (node0_reconsider) {
|
||||
assigned_peer = node0;
|
||||
} else if (node1_reconsider) {
|
||||
assigned_peer = node1;
|
||||
} else {
|
||||
BOOST_CHECK(node2_reconsider);
|
||||
assigned_peer = node2;
|
||||
}
|
||||
|
||||
// EraseForPeer also removes that tx from the workset.
|
||||
orphanage.EraseForPeer(node0);
|
||||
orphanage.EraseForPeer(assigned_peer);
|
||||
BOOST_CHECK_EQUAL(orphanage.GetTxToReconsider(node0), nullptr);
|
||||
|
||||
// However, the other peers' worksets are not touched.
|
||||
BOOST_CHECK_EQUAL(orphanage.GetTxToReconsider(node2), tx_orphan);
|
||||
|
||||
// Delete this tx, clearing the orphanage.
|
||||
BOOST_CHECK_EQUAL(orphanage.EraseTx(orphan_wtxid), 1);
|
||||
BOOST_CHECK_EQUAL(orphanage.Size(), 0);
|
||||
|
||||
Reference in New Issue
Block a user