diff --git a/src/xrpld/overlay/detail/PeerImp.cpp b/src/xrpld/overlay/detail/PeerImp.cpp index 10e16161af..b7319862d1 100644 --- a/src/xrpld/overlay/detail/PeerImp.cpp +++ b/src/xrpld/overlay/detail/PeerImp.cpp @@ -44,6 +44,7 @@ #include #include +#include #include #include #include @@ -3018,20 +3019,27 @@ PeerImp::checkValidation( static std::shared_ptr getPeerWithTree(OverlayImpl& ov, uint256 const& rootHash, PeerImp const* skip) { - std::shared_ptr ret; - int retScore = 0; - + std::vector> candidates; ov.for_each([&](std::shared_ptr&& p) { if (p->hasTxSet(rootHash) && p.get() != skip) - { - auto score = p->getScore(true); - if (!ret || (score > retScore)) - { - ret = std::move(p); - retScore = score; - } - } + candidates.push_back(std::move(p)); }); + std::sort( + candidates.begin(), + candidates.end(), + [](auto const& lhs, auto const& rhs) { return lhs->id() < rhs->id(); }); + + std::shared_ptr ret; + int retScore = 0; + for (auto& p : candidates) + { + auto score = p->getScore(true); + if (!ret || (score > retScore)) + { + ret = std::move(p); + retScore = score; + } + } return ret; } @@ -3046,20 +3054,27 @@ getPeerWithLedger( LedgerIndex ledger, PeerImp const* skip) { - std::shared_ptr ret; - int retScore = 0; - + std::vector> candidates; ov.for_each([&](std::shared_ptr&& p) { if (p->hasLedger(ledgerHash, ledger) && p.get() != skip) - { - auto score = p->getScore(true); - if (!ret || (score > retScore)) - { - ret = std::move(p); - retScore = score; - } - } + candidates.push_back(std::move(p)); }); + std::sort( + candidates.begin(), + candidates.end(), + [](auto const& lhs, auto const& rhs) { return lhs->id() < rhs->id(); }); + + std::shared_ptr ret; + int retScore = 0; + for (auto& p : candidates) + { + auto score = p->getScore(true); + if (!ret || (score > retScore)) + { + ret = std::move(p); + retScore = score; + } + } return ret; } @@ -3433,7 +3448,7 @@ PeerImp::getScore(bool haveItem) const // Penalty for unknown latency; should be roughly spRandomMax static const int spNoLatency = 8000; - int score = rand_int(spRandomMax); + int score = rand_int(app_.getPrng(), spRandomMax); if (haveItem) score += spHaveItem; diff --git a/src/xrpld/overlay/detail/PeerSet.cpp b/src/xrpld/overlay/detail/PeerSet.cpp index 909b20c307..9bf707704f 100644 --- a/src/xrpld/overlay/detail/PeerSet.cpp +++ b/src/xrpld/overlay/detail/PeerSet.cpp @@ -21,6 +21,7 @@ #include #include #include +#include namespace ripple { @@ -73,12 +74,18 @@ PeerSetImpl::addPeers( std::vector pairs; pairs.reserve(overlay.size()); - overlay.foreach([&](auto const& peer) { - auto const score = peer->getScore(hasItem(peer)); - pairs.emplace_back(score, std::move(peer)); - }); - + overlay.foreach( + [&](auto const& peer) { pairs.emplace_back(0, std::move(peer)); }); std::sort( + pairs.begin(), + pairs.end(), + [](ScoredPeer const& lhs, ScoredPeer const& rhs) { + return lhs.second->id() < rhs.second->id(); + }); + for (auto& pair : pairs) + pair.first = pair.second->getScore(hasItem(pair.second)); + + std::stable_sort( pairs.begin(), pairs.end(), [](ScoredPeer const& lhs, ScoredPeer const& rhs) {