2727import java .util .concurrent .ScheduledExecutorService ;
2828import java .util .concurrent .TimeUnit ;
2929import java .util .function .Predicate ;
30+
31+ import com .google .common .cache .Cache ;
32+ import com .google .common .cache .CacheBuilder ;
3033import org .slf4j .Logger ;
3134import org .slf4j .LoggerFactory ;
3235import org .springframework .beans .factory .annotation .Autowired ;
3639import org .tron .common .overlay .discover .Node ;
3740import org .tron .common .overlay .discover .NodeHandler ;
3841import org .tron .common .overlay .discover .NodeManager ;
42+ import org .tron .common .utils .Sha256Hash ;
3943import org .tron .core .config .args .Args ;
44+ import org .tron .core .net .message .TransactionMessage ;
4045import org .tron .core .net .peer .PeerConnection ;
4146import org .tron .core .net .peer .PeerConnectionDelegate ;
4247
@@ -49,6 +54,9 @@ public class SyncPool {
4954
5055 private final List <PeerConnection > activePeers = Collections .synchronizedList (new ArrayList <PeerConnection >());
5156
57+ private Cache <NodeHandler , Long > nodeHandlerCache = CacheBuilder .newBuilder ()
58+ .maximumSize (1000 ).expireAfterWrite (120 , TimeUnit .SECONDS ).recordStats ().build ();
59+
5260 @ Autowired
5361 private NodeManager nodeManager ;
5462
@@ -102,7 +110,10 @@ private void fillUp() {
102110 nodesInUse .add (nodeManager .getPublicHomeNode ().getHexId ());
103111
104112 List <NodeHandler > newNodes = nodeManager .getNodes (new NodeSelector (nodesInUse ), lackSize );
105- newNodes .forEach (n -> peerClient .connectAsync (n , false ));
113+ newNodes .forEach (n -> {
114+ peerClient .connectAsync (n , false );
115+ nodeHandlerCache .put (n , System .currentTimeMillis ());
116+ });
106117 }
107118
108119 // for test only
@@ -112,17 +123,17 @@ public void addActivePeers(PeerConnection p) {
112123
113124
114125 synchronized void logActivePeers () {
126+
115127 logger .info ("-------- active node {}" , nodeManager .dumpActiveNodes ().size ());
116- nodeManager .dumpActiveNodes ().forEach (handler -> {
128+ nodeManager .dumpActiveNodes ().forEach (handler -> {
117129 if (handler .getNode ().getPort () == 18888 ) {
118130 logger .info ("address: {}:{}, ID:{} {}" ,
119- handler .getNode ().getHost (), handler .getNode ().getPort (),
120- handler .getNode ().getHexIdShort (), handler .getNodeStatistics ().toString ());
131+ handler .getNode ().getHost (), handler .getNode ().getPort (),
132+ handler .getNode ().getHexIdShort (), handler .getNodeStatistics ().toString ());
121133 }
122- });
134+ });
123135
124- logger .info ("-------- active channel {}, node in user size {}" , channelManager .getActivePeers ().size (),
125- channelManager .nodesInUse ().size ());
136+ logger .info ("-------- active channel {}" , channelManager .getActivePeers ().size ());
126137 for (Channel channel : channelManager .getActivePeers ()){
127138 logger .info (channel .toString ());
128139 }
@@ -203,6 +214,10 @@ public boolean test(NodeHandler handler) {
203214 return false ;
204215 }
205216
217+ if (nodeHandlerCache .getIfPresent (handler ) != null ){
218+ return false ;
219+ }
220+
206221 if (handler .getNodeStatistics ().getReputation () < 100 ) {
207222 return false ;
208223 }
0 commit comments