@@ -154,44 +154,48 @@ public Set<String> nodesInUse() {
154
154
}
155
155
156
156
private void processNewPeers () {
157
- if ( newPeers . isEmpty ()) return ;
157
+ List < Runnable > noLockTasks = new ArrayList <>() ;
158
158
159
- List <Channel > processed = new ArrayList <>();
159
+ synchronized (this ) {
160
+ if (newPeers .isEmpty ()) return ;
160
161
161
- int addCnt = 0 ;
162
- for (Channel peer : newPeers ) {
162
+ List <Channel > processed = new ArrayList <>();
163
+ int addCnt = 0 ;
164
+ for (Channel peer : newPeers ) {
163
165
164
- logger .debug ("Processing new peer: " + peer );
166
+ logger .debug ("Processing new peer: " + peer );
165
167
166
- if (peer .isProtocolsInitialized ()) {
168
+ if (peer .isProtocolsInitialized ()) {
167
169
168
- logger .debug ("Protocols initialized" );
170
+ logger .debug ("Protocols initialized" );
169
171
170
- if (!activePeers .containsKey (peer .getNodeIdWrapper ())) {
171
- if (!peer .isActive () &&
172
- activePeers .size () >= maxActivePeers &&
173
- !trustedPeers .accept (peer .getNode ())) {
172
+ if (!activePeers .containsKey (peer .getNodeIdWrapper ())) {
173
+ if (!peer .isActive () &&
174
+ activePeers .size () >= maxActivePeers &&
175
+ !trustedPeers .accept (peer .getNode ())) {
174
176
175
- // restricting inbound connections unless this is a trusted peer
177
+ // restricting inbound connections unless this is a trusted peer
176
178
177
- disconnect (peer , TOO_MANY_PEERS );
179
+ noLockTasks .add (() -> disconnect (peer , TOO_MANY_PEERS ));
180
+ } else {
181
+ process (peer );
182
+ }
178
183
} else {
179
- process (peer );
180
- addCnt ++;
184
+ noLockTasks .add (() -> disconnect (peer , DUPLICATE_PEER ));
181
185
}
182
- } else {
183
- disconnect (peer , DUPLICATE_PEER );
186
+
187
+ processed . add (peer );
184
188
}
189
+ }
185
190
186
- processed .add (peer );
191
+ if (addCnt > 0 ) {
192
+ logger .info ("New peers processed: " + processed + ", active peers added: " + addCnt + ", total active peers: " + activePeers .size ());
187
193
}
188
- }
189
194
190
- if (addCnt > 0 ) {
191
- logger .info ("New peers processed: " + processed + ", active peers added: " + addCnt + ", total active peers: " + activePeers .size ());
195
+ newPeers .removeAll (processed );
192
196
}
193
197
194
- newPeers . removeAll ( processed );
198
+ noLockTasks . forEach ( Runnable :: run );
195
199
}
196
200
197
201
public void disconnect (Channel peer , ReasonCode reason ) {
@@ -339,7 +343,7 @@ private void sendNewBlock(Block block, Channel receivedFrom) {
339
343
}
340
344
}
341
345
342
- public void add (Channel peer ) {
346
+ public synchronized void add (Channel peer ) {
343
347
logger .debug ("New peer in ChannelManager {}" , peer );
344
348
newPeers .add (peer );
345
349
}
@@ -348,8 +352,10 @@ public void notifyDisconnect(Channel channel) {
348
352
logger .debug ("Peer {}: notifies about disconnect" , channel );
349
353
channel .onDisconnect ();
350
354
syncPool .onDisconnect (channel );
351
- activePeers .values ().remove (channel );
352
- newPeers .remove (channel );
355
+ synchronized (this ) {
356
+ activePeers .values ().remove (channel );
357
+ newPeers .remove (channel );
358
+ }
353
359
}
354
360
355
361
public void onSyncDone (boolean done ) {
0 commit comments