From df3f16ccf1c68f89eec696f37beab7374c62341e Mon Sep 17 00:00:00 2001 From: catbref Date: Sun, 10 Apr 2022 16:08:47 +0100 Subject: [PATCH] EPC-fixes: Improve Network shutdown by exiting fast during broadcast and skipping callbacks during peer disconnect. --- src/main/java/org/qortal/network/Network.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/qortal/network/Network.java b/src/main/java/org/qortal/network/Network.java index a82107ec..725d336f 100644 --- a/src/main/java/org/qortal/network/Network.java +++ b/src/main/java/org/qortal/network/Network.java @@ -132,6 +132,8 @@ public class Network { private String ourExternalIpAddress = null; private int ourExternalPort = Settings.getInstance().getListenPort(); + private volatile boolean isShuttingDown = false; + // Constructors private Network() { @@ -835,8 +837,6 @@ public class Network { } public void onDisconnect(Peer peer) { - // Notify Controller - Controller.getInstance().onPeerDisconnect(peer); if (peer.getConnectionEstablishedTime() > 0L) { LOGGER.debug("[{}] Disconnected from peer {}", peer.getPeerConnectionId(), peer); } else { @@ -846,6 +846,10 @@ public class Network { this.removeConnectedPeer(peer); this.channelsPendingWrite.remove(peer.getSocketChannel()); + if (this.isShuttingDown) + // No need to do any further processing, like re-enabling listen socket or notifying Controller + return; + if (getImmutableConnectedPeers().size() < maxPeers - 1 && serverSelectionKey.isValid() && (serverSelectionKey.interestOps() & SelectionKey.OP_ACCEPT) == 0) { @@ -856,6 +860,9 @@ public class Network { LOGGER.error("Failed to re-enable accepting of incoming connections: {}", e.getMessage()); } } + + // Notify Controller + Controller.getInstance().onPeerDisconnect(peer); } public void peerMisbehaved(Peer peer) { @@ -1454,6 +1461,9 @@ public class Network { public void broadcast(Function peerMessageBuilder) { for (Peer peer : getImmutableHandshakedPeers()) { + if (this.isShuttingDown) + return; + Message message = peerMessageBuilder.apply(peer); if (message == null) { @@ -1469,6 +1479,8 @@ public class Network { // Shutdown public void shutdown() { + this.isShuttingDown = true; + // Close listen socket to prevent more incoming connections if (this.serverChannel.isOpen()) { try {