Page Menu
Home
Phabricator
Search
Configure Global Search
Log In
Files
F14362645
D10031.id32520.diff
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
2 KB
Subscribers
None
D10031.id32520.diff
View Options
diff --git a/src/avalanche/peermanager.h b/src/avalanche/peermanager.h
--- a/src/avalanche/peermanager.h
+++ b/src/avalanche/peermanager.h
@@ -94,6 +94,11 @@
result_type operator()(const Peer &p) const { return p.proof->getId(); }
};
+struct score_index {
+ using result_type = uint32_t;
+ result_type operator()(const Peer &p) const { return p.getScore(); }
+};
+
struct next_request_time {};
struct PendingNode {
@@ -106,6 +111,7 @@
struct by_proofid;
struct by_nodeid;
+struct by_score;
enum class ProofRegistrationResult {
NONE = 0,
@@ -137,7 +143,10 @@
bmi::hashed_unique<bmi::member<Peer, PeerId, &Peer::peerid>>,
// index by proof
bmi::hashed_unique<bmi::tag<by_proofid>, proof_index,
- SaltedProofIdHasher>>>;
+ SaltedProofIdHasher>,
+ // ordered by score, decreasing order
+ bmi::ordered_non_unique<bmi::tag<by_score>, score_index,
+ std::greater<uint32_t>>>>;
PeerId nextPeerId = 0;
PeerSet peers;
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
@@ -41,6 +41,17 @@
auto it = pview.find(proof->getId());
return it == pview.end() ? NO_PEER : it->peerid;
}
+
+ static std::vector<uint32_t> getOrderedScores(const PeerManager &pm) {
+ std::vector<uint32_t> scores;
+
+ auto &peerView = pm.peers.get<by_score>();
+ for (const Peer &peer : peerView) {
+ scores.push_back(peer.getScore());
+ }
+
+ return scores;
+ }
};
} // namespace
} // namespace avalanche
@@ -1510,4 +1521,29 @@
BOOST_CHECK(!pm.shouldRequestMoreNodes());
}
+BOOST_AUTO_TEST_CASE(score_ordering) {
+ avalanche::PeerManager pm;
+
+ std::vector<uint32_t> expectedScores(10);
+ // Expect the peers to be ordered by descending score
+ std::generate(expectedScores.rbegin(), expectedScores.rend(),
+ [n = 1]() mutable { return n++ * MIN_VALID_PROOF_SCORE; });
+
+ std::vector<ProofRef> proofs;
+ proofs.reserve(expectedScores.size());
+ for (uint32_t score : expectedScores) {
+ proofs.push_back(buildRandomProof(score));
+ }
+
+ // Shuffle the proofs so they are registered in a random score order
+ Shuffle(proofs.begin(), proofs.end(), FastRandomContext());
+ for (auto &proof : proofs) {
+ BOOST_CHECK(pm.registerProof(proof));
+ }
+
+ auto peersScores = TestPeerManager::getOrderedScores(pm);
+ BOOST_CHECK_EQUAL_COLLECTIONS(peersScores.begin(), peersScores.end(),
+ expectedScores.begin(), expectedScores.end());
+}
+
BOOST_AUTO_TEST_SUITE_END()
File Metadata
Details
Attached
Mime Type
text/plain
Expires
Mon, May 12, 01:37 (4 h, 1 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
5777026
Default Alt Text
D10031.id32520.diff (2 KB)
Attached To
D10031: [avalanche] Order the peer set by score
Event Timeline
Log In to Comment