diff --git a/src/avalanche/peermanager.h b/src/avalanche/peermanager.h --- a/src/avalanche/peermanager.h +++ b/src/avalanche/peermanager.h @@ -93,6 +93,8 @@ std::chrono::seconds registration_time; std::chrono::seconds nextPossibleConflictTime; + double availabilityScore = 0.0; + /** * Consider dropping the peer if no node is attached after this timeout * expired. @@ -378,6 +380,26 @@ uint32_t getTotalPeersScore() const { return totalPeersScore; } uint32_t getConnectedPeersScore() const { return connectedPeersScore; } + template + void updateAvailabilityScores(const double decayFactor, + Callable &&getNodeAvailabilityScore) { + for (auto it = peers.begin(); it != peers.end(); it++) { + peers.modify(it, [&](Peer &peer) { + // Calculate average of current node scores + double peerScore{0.0}; + forEachNode(peer, [&](const avalanche::Node &node) { + peerScore += getNodeAvailabilityScore(node.nodeid); + }); + peerScore /= peer.node_count; + + // Calculate exponential moving average of averaged node scores + peer.availabilityScore = + decayFactor * peerScore + + (1. - decayFactor) * peer.availabilityScore; + }); + } + } + /**************************************************** * Functions which are public for testing purposes. * ****************************************************/ 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 @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include