22
33import java .util .ArrayList ;
44import java .util .Collections ;
5+ import java .util .Comparator ;
56import java .util .List ;
67import java .util .concurrent .Executors ;
78import java .util .concurrent .ScheduledExecutorService ;
1314import org .springframework .stereotype .Service ;
1415import org .tron .common .overlay .discover .node .statistics .NodeStatistics ;
1516import org .tron .core .config .args .Args ;
17+ import org .tron .core .db .Manager ;
1618import org .tron .core .net .peer .PeerConnection ;
1719import org .tron .protos .Protocol .ReasonCode ;
1820
@@ -23,21 +25,28 @@ public class PeerConnectionCheckService {
2325 public static final long CHECK_TIME = 5 * 60 * 1000L ;
2426 private double disconnectNumberFactor = Args .getInstance ().getDisconnectNumberFactor ();
2527 private double maxConnectNumberFactor = Args .getInstance ().getMaxConnectNumberFactor ();
28+ private static long beforeBlockNum = -1 ;
2629
2730 @ Autowired
2831 private SyncPool pool ;
2932
3033 @ Autowired
3134 private ChannelManager channelManager ;
3235
33- private ScheduledExecutorService scheduledExecutorService = Executors .newScheduledThreadPool (1 ,
36+ @ Autowired
37+ private Manager manager ;
38+
39+ private ScheduledExecutorService scheduledExecutorService = Executors .newScheduledThreadPool (2 ,
3440 r -> new Thread (r , "check-peer-connect" ));
3541
3642 @ PostConstruct
3743 public void check () {
3844 logger .info ("start the PeerConnectionCheckService" );
45+ beforeBlockNum = manager .getHeadBlockNum ();
3946 scheduledExecutorService
4047 .scheduleWithFixedDelay (new CheckDataTransferTask (), 5 , 5 , TimeUnit .MINUTES );
48+ scheduledExecutorService
49+ .scheduleWithFixedDelay (new CheckBlockNumberHighTask (), 300 , 5 , TimeUnit .SECONDS );
4150 }
4251
4352 @ PreDestroy
@@ -81,4 +90,27 @@ public void run() {
8190 }
8291 }
8392
93+ private class CheckBlockNumberHighTask implements Runnable {
94+
95+ @ Override
96+ public void run () {
97+ if (beforeBlockNum == manager .getHeadBlockNum ()) {
98+ logger .error ("block number not change, now block number is : {}" , beforeBlockNum );
99+ //disconnect some score low peer
100+ List <PeerConnection > peerList = new ArrayList <>(pool .getActivePeers ());
101+ peerList .sort (Comparator .comparingInt (o -> o .getNodeStatistics ().getReputation ()));
102+ if (pool .getActivePeers ().size () >= Args .getInstance ().getNodeMaxActiveNodes () * Args
103+ .getInstance ().getActiveConnectFactor ()) {
104+ for (int i = 0 ; i < peerList .size () * 0.9 ; i ++) {
105+ logger .error ("block number not change, disconnect the peer : {}" ,
106+ peerList .get (i ).getInetAddress ());
107+ peerList .get (i ).disconnect (ReasonCode .RESET );
108+ }
109+ }
110+ } else {
111+ beforeBlockNum = manager .getHeadBlockNum ();
112+ }
113+ }
114+ }
115+
84116}
0 commit comments