diff --git a/src/avalanche/peermanager.h b/src/avalanche/peermanager.h --- a/src/avalanche/peermanager.h +++ b/src/avalanche/peermanager.h @@ -12,11 +12,18 @@ static constexpr size_t NO_PEER = ~size_t(0); struct Slot { +private: uint64_t start; uint64_t stop; +public: Slot(uint64_t startIn, uint64_t stopIn) : start(startIn), stop(stopIn) {} + Slot withScore(uint64_t score) { return Slot(start, start + score); } + + uint64_t getStart() const { return start; } + uint64_t getStop() const { return stop; } + bool contains(uint64_t slot) const { return start <= slot && slot < stop; } bool precedes(uint64_t slot) const { return slot >= stop; } bool follows(uint64_t slot) const { return start > slot; } diff --git a/src/avalanche/peermanager.cpp b/src/avalanche/peermanager.cpp --- a/src/avalanche/peermanager.cpp +++ b/src/avalanche/peermanager.cpp @@ -16,22 +16,22 @@ void PeerManager::rescorePeer(size_t i, uint64_t score) { assert(i < slots.size()); - const uint64_t start = slots[i].start; - const uint64_t stop = start + score; + const uint64_t start = slots[i].getStart(); // If this is the last element, we can extend/shrink easily. if (i + 1 == slots.size()) { - slots[i].stop = stop; - slotCount = stop; + slots[i] = slots[i].withScore(score); + slotCount = slots[i].getStop(); return; } - const uint64_t nextStart = slots[i + 1].start; + const uint64_t stop = start + score; + const uint64_t nextStart = slots[i + 1].getStart(); // We can extend in place. if (stop <= nextStart) { - fragmentation += (slots[i].stop - stop); - slots[i].stop = stop; + fragmentation += (slots[i].getStop() - stop); + slots[i] = slots[i].withScore(score); return; } @@ -79,14 +79,14 @@ // We undershooted. if (slots[i].precedes(slot)) { begin = i + 1; - bottom = slots[begin].start; + bottom = slots[begin].getStart(); continue; } // We overshooted. if (slots[i].follows(slot)) { end = i; - top = slots[end].start; + top = slots[end].getStart(); continue; } 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 @@ -83,7 +83,7 @@ BOOST_CHECK_EQUAL(selectPeerImpl(slots, max, max), NO_PEER); // Update the slots to be heavily skewed toward the last element. - slots.rbegin()->stop = 300; + slots[99] = Slot(slots[99].getStart(), 300); max = 300; for (int i = 0; i < 100; i++) { @@ -98,12 +98,11 @@ // Update the slots to be heavily skewed toward the first element. for (int i = 0; i < 100; i++) { - slots[i].start += 100; - slots[i].stop += 100; + slots[i] = Slot(slots[i].getStart() + 100, slots[i].getStop() + 100); } - slots.begin()->start = 1; - slots.rbegin()->stop = 300; + slots[0] = Slot(1, slots[0].getStop()); + slots[99] = Slot(slots[99].getStart(), 300); BOOST_CHECK_EQUAL(selectPeerImpl(slots, 0, max), NO_PEER); BOOST_CHECK_EQUAL(selectPeerImpl(slots, 1, max), 0);