@@ -31,7 +31,7 @@ public class ResilienceService {
3131 //when node is isolated, retention percent peers will not be disconnected
3232 public static final double retentionPercent = 0.8 ;
3333 private static final int initialDelay = 300 ;
34- public static final int broadcastPeerSize = 3 ;
34+ public static final int minBroadcastPeerSize = 3 ;
3535 private static final String esName = "resilience-service" ;
3636 private final ScheduledExecutorService executor = ExecutorServiceManager
3737 .newSingleThreadScheduledExecutor (esName );
@@ -82,25 +82,35 @@ private void disconnectRandom() {
8282 .filter (peer -> !peer .isNeedSyncFromUs () && !peer .isNeedSyncFromPeer ())
8383 .collect (Collectors .toList ());
8484
85- if (peers .size () >= broadcastPeerSize ) {
85+ if (peers .size () >= minBroadcastPeerSize ) {
8686 long now = System .currentTimeMillis ();
8787 Map <Object , Integer > weights = new HashMap <>();
88- peers .forEach (peer -> weights .put (peer ,
89- (int ) Math .ceil ((double ) (now - peer .getLastInteractiveTime ()) / 500 )));
88+ peers .forEach (peer -> {
89+ int weight = (int ) Math .ceil ((double ) (now - peer .getLastInteractiveTime ()) / 500 );
90+ weights .put (peer , Math .max (weight , 1 ));
91+ });
9092 WeightedRandom weightedRandom = new WeightedRandom (weights );
91- PeerConnection one ;
92- try {
93- one = (PeerConnection ) weightedRandom .next ();
94- } catch (Exception e ) {
95- logger .warn ("Get random peer failed: {}" , e .getMessage ());
96- return ;
97- }
93+ PeerConnection one = (PeerConnection ) weightedRandom .next ();
9894 disconnectFromPeer (one , ReasonCode .RANDOM_ELIMINATION , DisconnectCause .RANDOM_ELIMINATION );
99- } else {
95+ return ;
96+ }
97+
98+ int needSyncFromPeerCount = (int ) tronNetDelegate .getActivePeer ().stream ()
99+ .filter (peer -> !peer .getChannel ().isTrustPeer ())
100+ .filter (PeerConnection ::isNeedSyncFromPeer )
101+ .count ();
102+ if (needSyncFromPeerCount >= 2 ) {
100103 peers = tronNetDelegate .getActivePeer ().stream ()
101104 .filter (peer -> !peer .getChannel ().isTrustPeer ())
102105 .filter (peer -> peer .isNeedSyncFromUs () || peer .isNeedSyncFromPeer ())
103106 .collect (Collectors .toList ());
107+ } else {
108+ peers = tronNetDelegate .getActivePeer ().stream ()
109+ .filter (peer -> !peer .getChannel ().isTrustPeer ())
110+ .filter (PeerConnection ::isNeedSyncFromUs )
111+ .collect (Collectors .toList ());
112+ }
113+ if (!peers .isEmpty ()) {
104114 int index = new Random ().nextInt (peers .size ());
105115 disconnectFromPeer (peers .get (index ), ReasonCode .RANDOM_ELIMINATION ,
106116 DisconnectCause .RANDOM_ELIMINATION );
@@ -220,7 +230,7 @@ private enum DisconnectCause {
220230 ISOLATE2_PASSIVE ,
221231 }
222232
223- class WeightedRandom {
233+ static class WeightedRandom {
224234
225235 private final Map <Object , Integer > weights ;
226236 private final Random random ;
0 commit comments