Skip to content
This repository was archived by the owner on Dec 5, 2024. It is now read-only.

Commit f93d484

Browse files
authored
Merge pull request #1120 from ethereum/fix/rc-active-peers
Fix/rc active peers
2 parents 5913b62 + 051fd73 commit f93d484

File tree

2 files changed

+36
-25
lines changed

2 files changed

+36
-25
lines changed

ethereumj-core/src/main/java/org/ethereum/net/MessageQueue.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,11 @@ public void setChannel(Channel channel) {
9797
}
9898

9999
public void sendMessage(Message msg) {
100+
if (channel.isDisconnected()) {
101+
logger.warn("{}: attempt to send [{}] message after disconnect", channel, msg.getCommand().name());
102+
return;
103+
}
104+
100105
if (msg instanceof PingMessage) {
101106
if (hasPing) return;
102107
hasPing = true;

ethereumj-core/src/main/java/org/ethereum/net/server/ChannelManager.java

Lines changed: 31 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -154,44 +154,48 @@ public Set<String> nodesInUse() {
154154
}
155155

156156
private void processNewPeers() {
157-
if (newPeers.isEmpty()) return;
157+
List<Runnable> noLockTasks = new ArrayList<>();
158158

159-
List<Channel> processed = new ArrayList<>();
159+
synchronized (this) {
160+
if (newPeers.isEmpty()) return;
160161

161-
int addCnt = 0;
162-
for(Channel peer : newPeers) {
162+
List<Channel> processed = new ArrayList<>();
163+
int addCnt = 0;
164+
for (Channel peer : newPeers) {
163165

164-
logger.debug("Processing new peer: " + peer);
166+
logger.debug("Processing new peer: " + peer);
165167

166-
if(peer.isProtocolsInitialized()) {
168+
if (peer.isProtocolsInitialized()) {
167169

168-
logger.debug("Protocols initialized");
170+
logger.debug("Protocols initialized");
169171

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())) {
174176

175-
// restricting inbound connections unless this is a trusted peer
177+
// restricting inbound connections unless this is a trusted peer
176178

177-
disconnect(peer, TOO_MANY_PEERS);
179+
noLockTasks.add(() -> disconnect(peer, TOO_MANY_PEERS));
180+
} else {
181+
process(peer);
182+
}
178183
} else {
179-
process(peer);
180-
addCnt++;
184+
noLockTasks.add(() -> disconnect(peer, DUPLICATE_PEER));
181185
}
182-
} else {
183-
disconnect(peer, DUPLICATE_PEER);
186+
187+
processed.add(peer);
184188
}
189+
}
185190

186-
processed.add(peer);
191+
if (addCnt > 0) {
192+
logger.info("New peers processed: " + processed + ", active peers added: " + addCnt + ", total active peers: " + activePeers.size());
187193
}
188-
}
189194

190-
if (addCnt > 0) {
191-
logger.info("New peers processed: " + processed + ", active peers added: " + addCnt + ", total active peers: " + activePeers.size());
195+
newPeers.removeAll(processed);
192196
}
193197

194-
newPeers.removeAll(processed);
198+
noLockTasks.forEach(Runnable::run);
195199
}
196200

197201
public void disconnect(Channel peer, ReasonCode reason) {
@@ -339,7 +343,7 @@ private void sendNewBlock(Block block, Channel receivedFrom) {
339343
}
340344
}
341345

342-
public void add(Channel peer) {
346+
public synchronized void add(Channel peer) {
343347
logger.debug("New peer in ChannelManager {}", peer);
344348
newPeers.add(peer);
345349
}
@@ -348,8 +352,10 @@ public void notifyDisconnect(Channel channel) {
348352
logger.debug("Peer {}: notifies about disconnect", channel);
349353
channel.onDisconnect();
350354
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+
}
353359
}
354360

355361
public void onSyncDone(boolean done) {

0 commit comments

Comments
 (0)