From e3b19deb13a2b85996a922c6e46fb3ff90cbc420 Mon Sep 17 00:00:00 2001 From: Ko Chanhyuck Date: Mon, 20 Jan 2020 17:02:01 +0900 Subject: [PATCH] Guarantee minimum when selecting peers to broadcast --- Libplanet/Net/Protocols/RoutingTable.cs | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/Libplanet/Net/Protocols/RoutingTable.cs b/Libplanet/Net/Protocols/RoutingTable.cs index 31e21ecd3d..b0bcb7a9ce 100644 --- a/Libplanet/Net/Protocols/RoutingTable.cs +++ b/Libplanet/Net/Protocols/RoutingTable.cs @@ -7,6 +7,9 @@ namespace Libplanet.Net.Protocols { internal class RoutingTable { + // FIXME: This would be configurable. + private const int _minPeersToBroadcast = 10; + private readonly Address _address; private readonly int _tableSize; private readonly int _bucketSize; @@ -80,9 +83,18 @@ private IEnumerable NonEmptyBuckets public IEnumerable PeersToBroadcast(Address? except) { - return NonEmptyBuckets + var peers = NonEmptyBuckets .Select(bucket => bucket.GetRandomPeer(except)) - .Where(peer => !(peer is null)); + .Where(peer => !(peer is null)).ToList(); + var count = peers.Count; + if (count < _minPeersToBroadcast) + { + peers.AddRange(Peers + .Where(peer => except is null || !peer.Address.Equals(except.Value)) + .Take(_minPeersToBroadcast - count)); + } + + return peers; } public IEnumerable PeersToRefresh(TimeSpan maxAge)