From 06a7d2c6ae38304564213bb44fece501aa178de6 Mon Sep 17 00:00:00 2001 From: Nicholas Dudfield Date: Fri, 18 Sep 2026 10:55:11 +0700 Subject: [PATCH] fix(overlay): isolate relay duplicate tracking per Slots instance --- src/test/overlay/reduce_relay_test.cpp | 35 ++++++++++++++++++++++++++ src/xrpld/overlay/Slot.h | 2 +- 2 files changed, 36 insertions(+), 1 deletion(-) diff --git a/src/test/overlay/reduce_relay_test.cpp b/src/test/overlay/reduce_relay_test.cpp index e0edae5489..ce01c898e6 100644 --- a/src/test/overlay/reduce_relay_test.cpp +++ b/src/test/overlay/reduce_relay_test.cpp @@ -1410,6 +1410,40 @@ vp_squelched=1 mutable int maxDuration_; }; + void + testIndependentHashRouters() + { + testcase("Duplicate-message tracking belongs to each Slots instance"); + Handler handler; + reduce_relay::Slots first(env_.app().logs(), handler); + reduce_relay::Slots second(env_.app().logs(), handler); + auto const validator = network_.validator(0); + constexpr Peer::id_t peer = 42; + + for (std::uint64_t n = 1; n <= 2; ++n) + { + uint256 const message{0x5A710000ULL + n}; + first.updateSlotAndSquelch( + message, validator, peer, protocol::MessageType::mtVALIDATION); + second.updateSlotAndSquelch( + message, validator, peer, protocol::MessageType::mtVALIDATION); + } + + for (auto* slots : {&first, &second}) + { + auto const peers = slots->getPeers(validator); + if (BEAST_EXPECT(peers.size() == 1 && peers.contains(peer))) + BEAST_EXPECT(std::get<1>(peers.at(peer)) == 1); + // A duplicate is still suppressed within its own instance. + slots->updateSlotAndSquelch( + uint256{0x5A710002ULL}, + validator, + peer, + protocol::MessageType::mtVALIDATION); + BEAST_EXPECT(slots->getPeers(validator) == peers); + } + } + void testRandomSquelch(bool l) { @@ -1575,6 +1609,7 @@ public: testSelectedPeerDisconnects(log); testSelectedPeerStopsRelaying(log); testInternalHashRouter(log); + testIndependentHashRouters(); testRandomSquelch(log); testHandshake(log); } diff --git a/src/xrpld/overlay/Slot.h b/src/xrpld/overlay/Slot.h index 92ec09de12..644d6565cf 100644 --- a/src/xrpld/overlay/Slot.h +++ b/src/xrpld/overlay/Slot.h @@ -658,7 +658,7 @@ private: // to discard duplicate message from the same peer. A message // is aged after IDLED seconds. A message received IDLED seconds // after it was relayed is ignored by PeerImp. - inline static messages peersWithMessage_{ + messages peersWithMessage_{ beast::get_abstract_clock()}; };