Skip to content

Commit 59e92c8

Browse files
committed
don't disconnect from high peer if its number <=1
1 parent 6c3a526 commit 59e92c8

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed

framework/src/main/java/org/tron/core/net/service/effective/ResilienceService.java

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -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;

framework/src/test/java/org/tron/core/net/services/ResilienceServiceTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -62,36 +62,36 @@ public void testDisconnectRandom() {
6262
PeerManager.add(context, c1);
6363
}
6464
for (PeerConnection peer : PeerManager.getPeers()
65-
.subList(0, ResilienceService.broadcastPeerSize)) {
65+
.subList(0, ResilienceService.minBroadcastPeerSize)) {
6666
peer.setNeedSyncFromPeer(false);
6767
peer.setNeedSyncFromUs(false);
6868
peer.setLastInteractiveTime(System.currentTimeMillis() - 1000);
6969
}
7070
for (PeerConnection peer : PeerManager.getPeers()
71-
.subList(ResilienceService.broadcastPeerSize, maxConnection + 1)) {
71+
.subList(ResilienceService.minBroadcastPeerSize, maxConnection + 1)) {
7272
peer.setNeedSyncFromPeer(false);
7373
peer.setNeedSyncFromUs(true);
7474
}
7575
int size1 = (int) PeerManager.getPeers().stream()
7676
.filter(peer -> !peer.isNeedSyncFromUs() && !peer.isNeedSyncFromPeer())
7777
.count();
78-
Assert.assertEquals(ResilienceService.broadcastPeerSize, size1);
78+
Assert.assertEquals(ResilienceService.minBroadcastPeerSize, size1);
7979
Assert.assertEquals(maxConnection + 1, PeerManager.getPeers().size());
8080

8181
//disconnect from broadcasting peer
8282
ReflectUtils.invokeMethod(service, "disconnectRandom");
8383
size1 = (int) PeerManager.getPeers().stream()
8484
.filter(peer -> !peer.isNeedSyncFromUs() && !peer.isNeedSyncFromPeer())
8585
.count();
86-
Assert.assertEquals(ResilienceService.broadcastPeerSize - 1, size1);
86+
Assert.assertEquals(ResilienceService.minBroadcastPeerSize - 1, size1);
8787
Assert.assertEquals(maxConnection, PeerManager.getPeers().size());
8888

8989
//disconnect from syncing peer
9090
ReflectUtils.invokeMethod(service, "disconnectRandom");
9191
size1 = (int) PeerManager.getPeers().stream()
9292
.filter(peer -> !peer.isNeedSyncFromUs() && !peer.isNeedSyncFromPeer())
9393
.count();
94-
Assert.assertEquals(ResilienceService.broadcastPeerSize - 1, size1);
94+
Assert.assertEquals(ResilienceService.minBroadcastPeerSize - 1, size1);
9595
Assert.assertEquals(maxConnection - 1, PeerManager.getPeers().size());
9696
}
9797

0 commit comments

Comments
 (0)