From f518c104446e4ebc5c77d8ed68e61ed51cc81149 Mon Sep 17 00:00:00 2001 From: SpyCheese Date: Mon, 15 Jul 2024 16:21:01 +0300 Subject: [PATCH] Improve selection neighbours in overlay --- overlay/overlay-peers.cpp | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/overlay/overlay-peers.cpp b/overlay/overlay-peers.cpp index c61e4965..a2176861 100644 --- a/overlay/overlay-peers.cpp +++ b/overlay/overlay-peers.cpp @@ -216,7 +216,7 @@ void OverlayImpl::add_peer(OverlayNode node) { CHECK(X); if (peer_list_.neighbours_.size() < max_neighbours() && - !(X->get_node()->flags() & OverlayMemberFlags::DoNotReceiveBroadcasts)) { + !(X->get_node()->flags() & OverlayMemberFlags::DoNotReceiveBroadcasts) && X->get_id() != local_id_) { peer_list_.neighbours_.push_back(X->get_id()); X->set_neighbour(true); } @@ -622,9 +622,17 @@ std::vector OverlayImpl::get_neighbours(td::uint32 max_si return peer_list_.neighbours_; } else { std::vector vec; + std::vector ul; for (td::uint32 i = 0; i < max_size; i++) { - vec.push_back( - peer_list_.neighbours_[td::Random::fast(0, static_cast(peer_list_.neighbours_.size()) - 1)]); + td::uint32 t = td::Random::fast(0, static_cast(peer_list_.neighbours_.size()) - 1 - i); + td::uint32 j; + for (j = 0; j < i; j++) { + if (ul[j] <= t) { + t++; + } + } + ul.emplace(ul.begin() + j, t); + vec.push_back(peer_list_.neighbours_[t]); } return vec; }