3
0
mirror of https://github.com/Qortal/qortal.git synced 2025-02-14 11:15:49 +00:00

EPC-fixes: Improve Network shutdown by exiting fast during broadcast and skipping callbacks during peer disconnect.

This commit is contained in:
catbref 2022-04-10 16:08:47 +01:00
parent 22aa5c41b5
commit df3f16ccf1

View File

@ -132,6 +132,8 @@ public class Network {
private String ourExternalIpAddress = null; private String ourExternalIpAddress = null;
private int ourExternalPort = Settings.getInstance().getListenPort(); private int ourExternalPort = Settings.getInstance().getListenPort();
private volatile boolean isShuttingDown = false;
// Constructors // Constructors
private Network() { private Network() {
@ -835,8 +837,6 @@ public class Network {
} }
public void onDisconnect(Peer peer) { public void onDisconnect(Peer peer) {
// Notify Controller
Controller.getInstance().onPeerDisconnect(peer);
if (peer.getConnectionEstablishedTime() > 0L) { if (peer.getConnectionEstablishedTime() > 0L) {
LOGGER.debug("[{}] Disconnected from peer {}", peer.getPeerConnectionId(), peer); LOGGER.debug("[{}] Disconnected from peer {}", peer.getPeerConnectionId(), peer);
} else { } else {
@ -846,6 +846,10 @@ public class Network {
this.removeConnectedPeer(peer); this.removeConnectedPeer(peer);
this.channelsPendingWrite.remove(peer.getSocketChannel()); 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 if (getImmutableConnectedPeers().size() < maxPeers - 1
&& serverSelectionKey.isValid() && serverSelectionKey.isValid()
&& (serverSelectionKey.interestOps() & SelectionKey.OP_ACCEPT) == 0) { && (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()); LOGGER.error("Failed to re-enable accepting of incoming connections: {}", e.getMessage());
} }
} }
// Notify Controller
Controller.getInstance().onPeerDisconnect(peer);
} }
public void peerMisbehaved(Peer peer) { public void peerMisbehaved(Peer peer) {
@ -1454,6 +1461,9 @@ public class Network {
public void broadcast(Function<Peer, Message> peerMessageBuilder) { public void broadcast(Function<Peer, Message> peerMessageBuilder) {
for (Peer peer : getImmutableHandshakedPeers()) { for (Peer peer : getImmutableHandshakedPeers()) {
if (this.isShuttingDown)
return;
Message message = peerMessageBuilder.apply(peer); Message message = peerMessageBuilder.apply(peer);
if (message == null) { if (message == null) {
@ -1469,6 +1479,8 @@ public class Network {
// Shutdown // Shutdown
public void shutdown() { public void shutdown() {
this.isShuttingDown = true;
// Close listen socket to prevent more incoming connections // Close listen socket to prevent more incoming connections
if (this.serverChannel.isOpen()) { if (this.serverChannel.isOpen()) {
try { try {