Skip to content

Commit 30c48f1

Browse files
authored
Merge pull request #333 from tronprotocol/terminateInactivePeer
Terminate inactive peer
2 parents d0202f3 + 3c08018 commit 30c48f1

File tree

5 files changed

+89
-7
lines changed

5 files changed

+89
-7
lines changed

src/main/java/org/tron/common/overlay/message/ReasonCode.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,8 @@ public enum ReasonCode {
8080

8181
USER_REASON(0x10),
8282

83+
RESET(0x11),
84+
8385
/**
8486
* [0xFF] Reason not specified
8587
*/
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,14 @@
11
package org.tron.common.utils;
22

3+
import java.sql.Timestamp;
4+
35
public class Time {
46

57
public static long getCurrentMillis() {
68
return System.currentTimeMillis();
9+
}
710

11+
public static String getTimeString(long time) {
12+
return new Timestamp(time).toString();
813
}
914
}

src/main/java/org/tron/core/config/Parameter.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,17 @@ interface NodeConstant {
2121

2222
}
2323

24+
interface BlockConstant {
25+
long BLOCK_INTERVAL = 5000L;
26+
}
27+
28+
interface NetConstants {
29+
long ADV_TIME_OUT = 1000L;
30+
long SYNC_TIME_OUT = 5000L;
31+
long HEAD_NUM_MAX_DELTA = 1000L;
32+
long HEAD_NUM_CHECK_TIME = 60000L;
33+
}
34+
35+
2436

2537
}

src/main/java/org/tron/core/net/node/NodeImpl.java

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,26 @@
1313
import java.util.Queue;
1414
import java.util.Set;
1515
import java.util.concurrent.ConcurrentHashMap;
16+
import java.util.concurrent.Executors;
1617
import java.util.concurrent.LinkedBlockingQueue;
18+
import java.util.concurrent.ScheduledExecutorService;
19+
import java.util.concurrent.TimeUnit;
1720
import javafx.util.Pair;
1821
import lombok.extern.slf4j.Slf4j;
1922
import org.springframework.beans.factory.annotation.Autowired;
2023
import org.springframework.stereotype.Component;
2124
import org.tron.common.overlay.discover.NodeHandler;
2225
import org.tron.common.overlay.message.Message;
26+
import org.tron.common.overlay.message.ReasonCode;
2327
import org.tron.common.overlay.server.Channel.TronState;
24-
import org.tron.common.overlay.server.ChannelManager;
2528
import org.tron.common.overlay.server.SyncPool;
2629
import org.tron.common.utils.ExecutorLoop;
2730
import org.tron.common.utils.Sha256Hash;
2831
import org.tron.common.utils.Time;
2932
import org.tron.core.capsule.BlockCapsule;
3033
import org.tron.core.capsule.BlockCapsule.BlockId;
34+
import org.tron.core.config.Parameter.BlockConstant;
35+
import org.tron.core.config.Parameter.NetConstants;
3136
import org.tron.core.config.Parameter.NodeConstant;
3237
import org.tron.core.exception.BadBlockException;
3338
import org.tron.core.exception.BadTransactionException;
@@ -56,9 +61,6 @@ public class NodeImpl extends PeerConnectionDelegate implements Node {
5661
@Autowired
5762
private SyncPool pool;
5863

59-
@Autowired
60-
private ChannelManager channelManager;
61-
6264
class InvToSend {
6365

6466
private HashMap<PeerConnection, HashMap<InventoryType, LinkedList<Sha256Hash>>> send
@@ -112,6 +114,8 @@ public void sendFetch() {
112114

113115
private volatile boolean isHandleSyncBlockActive;
114116

117+
private ScheduledExecutorService disconnectInactiveExecutor = Executors.newSingleThreadScheduledExecutor();
118+
115119
//broadcast
116120
private ConcurrentHashMap<Sha256Hash, InventoryType> advObjToSpread = new ConcurrentHashMap<>();
117121

@@ -225,6 +229,7 @@ public void close() throws InterruptedException {
225229
advertiseLoopThread.join();
226230
advObjFetchLoopThread.join();
227231
handleSyncBlockLoop.join();
232+
disconnectInactiveExecutor.shutdown();
228233
}
229234

230235
@Override
@@ -379,8 +384,46 @@ private void activeTronPump() {
379384
advertiseLoopThread.start();
380385
advObjFetchLoopThread.start();
381386
handleSyncBlockLoop.start();
387+
388+
//terminate inactive loop
389+
disconnectInactiveExecutor.scheduleWithFixedDelay(() -> {
390+
disconnectInactive();
391+
}, 30000, BlockConstant.BLOCK_INTERVAL / 2, TimeUnit.MILLISECONDS);
392+
393+
}
394+
395+
private void disconnectInactive() {
396+
getActivePeer().forEach(peer -> {
397+
398+
final boolean[] isDisconnected = {false};
399+
400+
peer.getAdvObjWeRequested().values().stream()
401+
.filter(time -> time < Time.getCurrentMillis() - NetConstants.ADV_TIME_OUT)
402+
.findFirst().ifPresent(time -> isDisconnected[0] = true);
403+
404+
if (!isDisconnected[0]) {
405+
peer.getSyncBlockRequested().values().stream()
406+
.filter(time -> time < Time.getCurrentMillis() - NetConstants.SYNC_TIME_OUT)
407+
.findFirst().ifPresent(time -> isDisconnected[0] = true);
408+
}
409+
410+
//TODO:optimize here
411+
if (!isDisconnected[0]) {
412+
if (del.getHeadBlockId().getNum() - peer.getHeadBlockWeBothHave().getNum() > NetConstants.HEAD_NUM_MAX_DELTA
413+
&& peer.getConnectTime() < Time.getCurrentMillis() - NetConstants.HEAD_NUM_CHECK_TIME) {
414+
isDisconnected[0] = true;
415+
}
416+
}
417+
418+
419+
if (isDisconnected[0]) {
420+
disconnectPeer(peer, ReasonCode.RESET);
421+
}
422+
});
382423
}
383424

425+
426+
384427
private void onHandleInventoryMessage(PeerConnection peer, InventoryMessage msg) {
385428
//logger.info("on handle advertise inventory message");
386429
peer.cleanInvGarbage();
@@ -613,7 +656,7 @@ private void onHandleFetchDataMessage(PeerConnection peer, FetchInvDataMessage f
613656
}
614657

615658
private void banTraitorPeer(PeerConnection peer) {
616-
onDisconnectPeer(peer);
659+
disconnectPeer(peer, ReasonCode.BAD_PROTOCOL); //TODO: ban it
617660
}
618661

619662
private void onHandleChainInventoryMessage(PeerConnection peer, ChainInventoryMessage msg) {
@@ -848,7 +891,7 @@ private void syncNextBatchChainIds(PeerConnection peer) {
848891
peer.sendMessage(new SyncBlockChainMessage((LinkedList<BlockId>) chainSummary));
849892
} catch (Exception e) { //TODO: use tron excpetion here
850893
logger.debug(e.getMessage(), e);
851-
onDisconnectPeer(peer);
894+
disconnectPeer(peer, ReasonCode.BAD_PROTOCOL);//TODO: unlink?
852895
}
853896

854897
}
@@ -858,6 +901,7 @@ public void onConnectPeer(PeerConnection peer) {
858901
//TODO:when use new p2p framework, remove this
859902
logger.info("start sync with::" + peer);
860903
peer.setTronState(TronState.START_TO_SYNC);
904+
peer.setConnectTime(Time.getCurrentMillis());
861905
startSyncWithPeer(peer);
862906
// if (mapPeer.containsKey(peer.getAddress())) {
863907
// return;
@@ -873,7 +917,11 @@ public void onConnectPeer(PeerConnection peer) {
873917
@Override
874918
public void onDisconnectPeer(PeerConnection peer) {
875919
//TODO:when use new p2p framework, remove this
876-
//mapPeer.remove(peer.getAddress());
920+
//peer.disconnect(reason);
921+
}
922+
923+
private void disconnectPeer(PeerConnection peer, ReasonCode reason) {
924+
peer.disconnect(reason);
877925
}
878926
}
879927

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.tron.common.overlay.message.Message;
1515
import org.tron.common.overlay.server.Channel;
1616
import org.tron.common.utils.Sha256Hash;
17+
import org.tron.common.utils.Time;
1718
import org.tron.core.capsule.BlockCapsule.BlockId;
1819

1920
@Slf4j
@@ -26,6 +27,16 @@ public int hashCode() {
2627
return super.hashCode();
2728
}
2829

30+
public long getConnectTime() {
31+
return connectTime;
32+
}
33+
34+
public void setConnectTime(long connectTime) {
35+
this.connectTime = connectTime;
36+
}
37+
38+
private long connectTime;
39+
2940
//broadcast
3041
private Queue<Sha256Hash> invToUs = new LinkedBlockingQueue<>();
3142

@@ -188,22 +199,26 @@ public String logSyncStats() {
188199
// long lifeTime = System.currentTimeMillis() - connectedTime;
189200
return String.format(
190201
"Peer %s: [ %18s, ping %6s ms]-----------\n"
202+
+ "connect time: %s\n"
191203
+ "last know block num: %s\n "
192204
+ "needSyncFromPeer:%b\n "
193205
+ "needSyncFromUs:%b\n"
194206
+ "syncToFetchSize:%d\n"
195207
+ "syncBlockRequestedSize:%d\n"
196208
+ "unFetchSynNum:%d\n"
209+
+ "syncChainRequested:%s\n"
197210
+ "blockInPorc:%d\n",
198211
this.getNode().getHost() + ":" + this.getNode().getPort(),
199212
this.getPeerIdShort(),
200213
(int)this.getPeerStats().getAvgLatency(),
214+
Time.getTimeString(getConnectTime()),
201215
headBlockWeBothHave.getNum(),
202216
isNeedSyncFromPeer(),
203217
isNeedSyncFromUs(),
204218
syncBlockToFetch.size(),
205219
syncBlockRequested.size(),
206220
unfetchSyncNum,
221+
syncChainRequested == null ? "NULL" : Time.getTimeString(syncChainRequested.getValue()),
207222
blockInProc.size());
208223
}
209224

0 commit comments

Comments
 (0)