diff --git a/src/avalanche/test/processor_tests.cpp b/src/avalanche/test/processor_tests.cpp --- a/src/avalanche/test/processor_tests.cpp +++ b/src/avalanche/test/processor_tests.cpp @@ -418,6 +418,14 @@ BOOST_CHECK(vrinflight.registerPoll()); BOOST_CHECK(!vrinflight.shouldPoll()); } + + vrinflight.clearInflightRequest(AVALANCHE_MAX_INFLIGHT_POLL); + BOOST_CHECK(vrinflight.shouldPoll()); + + // Check that clearing too many inflight requests still leaves us in a good + // state. + vrinflight.clearInflightRequest(); + BOOST_CHECK(vrinflight.shouldPoll()); } BOOST_AUTO_TEST_CASE(block_update) { diff --git a/src/avalanche/voterecord.h b/src/avalanche/voterecord.h --- a/src/avalanche/voterecord.h +++ b/src/avalanche/voterecord.h @@ -91,7 +91,7 @@ /** * Clear `count` inflight requests. */ - void clearInflightRequest(uint8_t count = 1) { inflight -= count; } + void clearInflightRequest(uint8_t count = 1); private: /** diff --git a/src/avalanche/voterecord.cpp b/src/avalanche/voterecord.cpp --- a/src/avalanche/voterecord.cpp +++ b/src/avalanche/voterecord.cpp @@ -100,4 +100,13 @@ return false; } +void VoteRecord::clearInflightRequest(uint8_t count) { + uint8_t currentInflight = inflight.load(); + while (currentInflight > 0 && + !inflight.compare_exchange_weak( + currentInflight, + count >= currentInflight ? 0 : currentInflight - count)) { + } +} + } // namespace avalanche