Skip to content

Commit 424a3dd

Browse files
authored
Merge pull request #5944 from 317787106/feature/test_isolated3
feat(net): add some log for isolated2 disconnection
2 parents 21f0cb5 + 14a0750 commit 424a3dd

4 files changed

Lines changed: 85 additions & 58 deletions

File tree

framework/src/main/java/org/tron/core/config/args/Args.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -848,6 +848,9 @@ public static void setParam(final String[] args, final String confFileName) {
848848

849849
PARAMETER.inactiveThreshold = config.hasPath(Constant.NODE_INACTIVE_THRESHOLD)
850850
? config.getInt(Constant.NODE_INACTIVE_THRESHOLD) : 600;
851+
if (PARAMETER.inactiveThreshold < 1) {
852+
PARAMETER.inactiveThreshold = 1;
853+
}
851854

852855
PARAMETER.maxTransactionPendingSize = config.hasPath(Constant.NODE_MAX_TRANSACTION_PENDING_SIZE)
853856
? config.getInt(Constant.NODE_MAX_TRANSACTION_PENDING_SIZE) : 2000;

framework/src/main/java/org/tron/core/net/peer/PeerConnection.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,7 @@ public String log() {
230230
+ "syncBlockRequestedSize:%d\n"
231231
+ "remainNum:%d\n"
232232
+ "syncChainRequested:%d\n"
233+
+ "inactiveSeconds:%d\n"
233234
+ "blockInProcess:%d\n",
234235
channel.getInetSocketAddress(),
235236
(now - channel.getStartTime()) / Constant.ONE_THOUSAND,
@@ -244,6 +245,7 @@ public String log() {
244245
remainNum,
245246
requested == null ? 0 : (now - requested.getValue())
246247
/ Constant.ONE_THOUSAND,
248+
(now - lastActiveTime) / Constant.ONE_THOUSAND,
247249
syncBlockInProcess.size());
248250
}
249251

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

Lines changed: 72 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public class ResilienceService {
2424

2525
private static final long inactiveThreshold =
2626
CommonParameter.getInstance().getInactiveThreshold() * 1000L;
27-
public static final long blockNotChangeThreshold = 90 * 1000L;
27+
public static final long blockNotChangeThreshold = 60 * 1000L;
2828

2929
//when node is isolated, retention percent peers will not be disconnected
3030
public static final double retentionPercent = 0.8;
@@ -74,75 +74,81 @@ private void disconnectRandom() {
7474
if (peerSize >= CommonParameter.getInstance().getMaxConnections()) {
7575
long now = System.currentTimeMillis();
7676
List<PeerConnection> peers = tronNetDelegate.getActivePeer().stream()
77-
.filter(peer -> !peer.isDisconnect())
7877
.filter(peer -> now - peer.getLastActiveTime() >= inactiveThreshold)
7978
.filter(peer -> !peer.getChannel().isTrustPeer())
79+
.filter(peer -> !peer.isNeedSyncFromUs() && !peer.isNeedSyncFromPeer())
8080
.collect(Collectors.toList());
8181
if (!peers.isEmpty()) {
8282
int index = new Random().nextInt(peers.size());
83-
disconnectFromPeer(peers.get(index), ReasonCode.RANDOM_ELIMINATION);
83+
disconnectFromPeer(peers.get(index), ReasonCode.RANDOM_ELIMINATION,
84+
DisconnectCause.RANDOM_ELIMINATION);
8485
}
8586
}
8687
}
8788

8889
private void disconnectLan() {
89-
if (isLanNode()) {
90-
// disconnect from the node that has keep inactive for more than inactiveThreshold
91-
// and its lastActiveTime is smallest
92-
int peerSize = tronNetDelegate.getActivePeer().size();
93-
if (peerSize >= CommonParameter.getInstance().getMinConnections()) {
94-
long now = System.currentTimeMillis();
95-
List<PeerConnection> peers = tronNetDelegate.getActivePeer().stream()
96-
.filter(peer -> !peer.isDisconnect())
97-
.filter(peer -> now - peer.getLastActiveTime() >= inactiveThreshold)
98-
.filter(peer -> !peer.getChannel().isTrustPeer())
99-
.collect(Collectors.toList());
100-
Optional<PeerConnection> one = getEarliestPeer(peers);
101-
one.ifPresent(peer -> disconnectFromPeer(peer, ReasonCode.BAD_PROTOCOL));
102-
}
90+
if (!isLanNode()) {
91+
return;
92+
}
93+
// disconnect from the node that has keep inactive for more than inactiveThreshold
94+
// and its lastActiveTime is smallest
95+
int peerSize = tronNetDelegate.getActivePeer().size();
96+
if (peerSize >= CommonParameter.getInstance().getMinConnections()) {
97+
long now = System.currentTimeMillis();
98+
List<PeerConnection> peers = tronNetDelegate.getActivePeer().stream()
99+
.filter(peer -> now - peer.getLastActiveTime() >= inactiveThreshold)
100+
.filter(peer -> !peer.isNeedSyncFromPeer() && !peer.isNeedSyncFromUs())
101+
.filter(peer -> !peer.getChannel().isTrustPeer())
102+
.collect(Collectors.toList());
103+
Optional<PeerConnection> one = getEarliestPeer(peers);
104+
one.ifPresent(
105+
peer -> disconnectFromPeer(peer, ReasonCode.BAD_PROTOCOL, DisconnectCause.LAN_NODE));
103106
}
104107
}
105108

106109
private void disconnectIsolated2() {
107-
if (isIsolateLand2()) {
108-
logger.info("Node is isolated, try to disconnect from peers");
109-
int peerSize = tronNetDelegate.getActivePeer().size();
110-
111-
//disconnect from the node whose lastActiveTime is smallest
112-
if (peerSize >= CommonParameter.getInstance().getMinActiveConnections()) {
113-
List<PeerConnection> peers = tronNetDelegate.getActivePeer().stream()
114-
.filter(peer -> !peer.isDisconnect())
115-
.filter(peer -> !peer.getChannel().isTrustPeer())
116-
.filter(peer -> peer.getChannel().isActive())
117-
.collect(Collectors.toList());
118-
119-
Optional<PeerConnection> one = getEarliestPeer(peers);
120-
one.ifPresent(peer -> disconnectFromPeer(peer, ReasonCode.BAD_PROTOCOL));
121-
}
110+
if (!isIsolateLand2()) {
111+
return;
112+
}
113+
logger.warn("Node is isolated, try to disconnect from peers");
114+
int peerSize = tronNetDelegate.getActivePeer().size();
122115

123-
//disconnect from some passive nodes, make sure retention nodes' num <= 0.8 * maxConnection,
124-
//so new peers can come in
125-
peerSize = tronNetDelegate.getActivePeer().size();
126-
int threshold = (int) (CommonParameter.getInstance().getMaxConnections() * retentionPercent);
127-
if (peerSize > threshold) {
128-
int disconnectSize = peerSize - threshold;
129-
List<PeerConnection> peers = tronNetDelegate.getActivePeer().stream()
130-
.filter(peer -> !peer.isDisconnect())
131-
.filter(peer -> !peer.getChannel().isTrustPeer())
132-
.filter(peer -> !peer.getChannel().isActive())
133-
.collect(Collectors.toList());
134-
try {
135-
peers.sort(Comparator.comparing(PeerConnection::getLastActiveTime, Long::compareTo));
136-
} catch (Exception e) {
137-
logger.warn("Sort disconnectIsolated2 peers failed: {}", e.getMessage());
138-
return;
139-
}
116+
//disconnect from the node whose lastActiveTime is smallest
117+
if (peerSize >= CommonParameter.getInstance().getMinActiveConnections()) {
118+
List<PeerConnection> peers = tronNetDelegate.getActivePeer().stream()
119+
.filter(peer -> !peer.getChannel().isTrustPeer())
120+
.filter(peer -> peer.getChannel().isActive())
121+
.collect(Collectors.toList());
140122

141-
if (peers.size() > disconnectSize) {
142-
peers = peers.subList(0, disconnectSize);
143-
}
144-
peers.forEach(peer -> disconnectFromPeer(peer, ReasonCode.BAD_PROTOCOL));
123+
Optional<PeerConnection> one = getEarliestPeer(peers);
124+
one.ifPresent(peer -> disconnectFromPeer(peer, ReasonCode.BAD_PROTOCOL,
125+
DisconnectCause.ISOLATE2_ACTIVE));
126+
}
127+
128+
//disconnect from some passive nodes, make sure retention nodes' num <= 0.8 * maxConnection,
129+
//so new peers can come in
130+
peerSize = tronNetDelegate.getActivePeer().size();
131+
int threshold = (int) (CommonParameter.getInstance().getMaxConnections() * retentionPercent);
132+
if (peerSize > threshold) {
133+
int disconnectSize = peerSize - threshold;
134+
List<PeerConnection> peers = tronNetDelegate.getActivePeer().stream()
135+
.filter(peer -> !peer.getChannel().isTrustPeer())
136+
.filter(peer -> !peer.getChannel().isActive())
137+
.collect(Collectors.toList());
138+
try {
139+
peers.sort(Comparator.comparing(PeerConnection::getLastActiveTime, Long::compareTo));
140+
} catch (Exception e) {
141+
logger.warn("Sort disconnectIsolated2 peers failed: {}", e.getMessage());
142+
return;
145143
}
144+
int candidateSize = peers.size();
145+
if (peers.size() > disconnectSize) {
146+
peers = peers.subList(0, disconnectSize);
147+
}
148+
logger.info("All peer Size:{}, plan size:{}, candidate size:{}, real size:{}", peerSize,
149+
disconnectSize, candidateSize, peers.size());
150+
peers.forEach(peer -> disconnectFromPeer(peer, ReasonCode.BAD_PROTOCOL,
151+
DisconnectCause.ISOLATE2_PASSIVE));
146152
}
147153
}
148154

@@ -162,7 +168,8 @@ private boolean isLanNode() {
162168
int activePeerSize = (int) tronNetDelegate.getActivePeer().stream()
163169
.filter(peer -> peer.getChannel().isActive())
164170
.count();
165-
return peerSize > 0 && peerSize == activePeerSize;
171+
return peerSize >= CommonParameter.getInstance().getMinActiveConnections()
172+
&& peerSize == activePeerSize;
166173
}
167174

168175
private boolean isIsolateLand2() {
@@ -173,13 +180,21 @@ private boolean isIsolateLand2() {
173180
return advPeerCount >= 1 && diff >= blockNotChangeThreshold;
174181
}
175182

176-
private void disconnectFromPeer(PeerConnection peer, ReasonCode reasonCode) {
183+
private void disconnectFromPeer(PeerConnection peer, ReasonCode reasonCode,
184+
DisconnectCause cause) {
177185
int inactiveSeconds = (int) ((System.currentTimeMillis() - peer.getLastActiveTime()) / 1000);
178-
logger.info("Disconnect from peer {}, inactive seconds {}", peer.getInetSocketAddress(),
179-
inactiveSeconds);
186+
logger.info("Disconnect from peer {}, inactive seconds {}, cause: {}",
187+
peer.getInetSocketAddress(), inactiveSeconds, cause);
180188
peer.disconnect(reasonCode);
181189
}
182190

191+
private enum DisconnectCause {
192+
RANDOM_ELIMINATION,
193+
LAN_NODE,
194+
ISOLATE2_ACTIVE,
195+
ISOLATE2_PASSIVE,
196+
}
197+
183198
public void close() {
184199
ExecutorServiceManager.shutdownAndAwaitTermination(executor, esName);
185200
}

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

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,10 @@ public void testDisconnectRandom() {
6161

6262
PeerManager.add(context, c1);
6363
}
64+
for (PeerConnection peer : PeerManager.getPeers()) {
65+
peer.setNeedSyncFromPeer(false);
66+
peer.setNeedSyncFromUs(false);
67+
}
6468
ReflectUtils.invokeMethod(service, "disconnectRandom");
6569
Assert.assertEquals(maxConnection, PeerManager.getPeers().size());
6670

@@ -93,7 +97,10 @@ public void testDisconnectLan() {
9397

9498
PeerManager.add(context, c1);
9599
}
96-
100+
for (PeerConnection peer : PeerManager.getPeers()) {
101+
peer.setNeedSyncFromPeer(false);
102+
peer.setNeedSyncFromUs(false);
103+
}
97104
Assert.assertEquals(9, PeerManager.getPeers().size());
98105

99106
boolean isLan = ReflectUtils.invokeMethod(service, "isLanNode");

0 commit comments

Comments
 (0)