@@ -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 }
0 commit comments