From 5efd69bad43ec5a8b8b974d6f10cda6e4e850bd1 Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Mon, 1 Feb 2016 20:10:40 +0100 Subject: [PATCH] stop when shutdown --- .../p2p/peers/PeerExchangeManager.java | 26 ++++--- .../p2p/peers/RequestDataManager.java | 78 ++++++++++--------- 2 files changed, 56 insertions(+), 48 deletions(-) diff --git a/network/src/main/java/io/bitsquare/p2p/peers/PeerExchangeManager.java b/network/src/main/java/io/bitsquare/p2p/peers/PeerExchangeManager.java index 4a4f8199a2..ac7a7a203e 100644 --- a/network/src/main/java/io/bitsquare/p2p/peers/PeerExchangeManager.java +++ b/network/src/main/java/io/bitsquare/p2p/peers/PeerExchangeManager.java @@ -28,6 +28,7 @@ public class PeerExchangeManager implements MessageListener, ConnectionListener private final ScheduledThreadPoolExecutor executor; private final Map peerExchangeHandshakeMap = new HashMap<>(); private Timer connectToMorePeersTimer, maintainConnectionsTimer; + private boolean shutDownInProgress; /////////////////////////////////////////////////////////////////////////////////////////// @@ -46,6 +47,7 @@ public class PeerExchangeManager implements MessageListener, ConnectionListener public void shutDown() { Log.traceCall(); + shutDownInProgress = true; networkNode.removeMessageListener(this); stopConnectToMorePeersTimer(); @@ -148,17 +150,19 @@ public class PeerExchangeManager implements MessageListener, ConnectionListener peerExchangeHandshakeMap.remove(nodeAddress); peerManager.penalizeUnreachablePeer(nodeAddress); - if (!remainingNodeAddresses.isEmpty()) { - log.info("There are remaining nodes available for requesting peers. " + - "We will try getReportedPeers again."); - requestReportedPeersFromRandomPeer(remainingNodeAddresses); - } else { - log.info("There is no remaining node available for requesting peers. " + - "That is expected if no other node is online.\n\t" + - "We will try again after a random pause."); - if (connectToMorePeersTimer == null) - connectToMorePeersTimer = UserThread.runAfterRandomDelay( - PeerExchangeManager.this::connectToMorePeers, 20, 30); + if (!shutDownInProgress) { + if (!remainingNodeAddresses.isEmpty()) { + log.info("There are remaining nodes available for requesting peers. " + + "We will try getReportedPeers again."); + requestReportedPeersFromRandomPeer(remainingNodeAddresses); + } else { + log.info("There is no remaining node available for requesting peers. " + + "That is expected if no other node is online.\n\t" + + "We will try again after a random pause."); + if (connectToMorePeersTimer == null) + connectToMorePeersTimer = UserThread.runAfterRandomDelay( + PeerExchangeManager.this::connectToMorePeers, 20, 30); + } } } }); diff --git a/network/src/main/java/io/bitsquare/p2p/peers/RequestDataManager.java b/network/src/main/java/io/bitsquare/p2p/peers/RequestDataManager.java index a066bb8078..47dea93945 100644 --- a/network/src/main/java/io/bitsquare/p2p/peers/RequestDataManager.java +++ b/network/src/main/java/io/bitsquare/p2p/peers/RequestDataManager.java @@ -52,6 +52,7 @@ public class RequestDataManager implements MessageListener { private Optional nodeOfPreliminaryDataRequest = Optional.empty(); private Timer requestDataTimer; private boolean dataUpdateRequested; + private boolean shutDownInProgress; /////////////////////////////////////////////////////////////////////////////////////////// @@ -72,6 +73,7 @@ public class RequestDataManager implements MessageListener { public void shutDown() { Log.traceCall(); + shutDownInProgress = true; stopRequestDataTimer(); networkNode.removeMessageListener(this); requestDataHandshakeMap.values().stream().forEach(RequestDataHandshake::shutDown); @@ -175,46 +177,48 @@ public class RequestDataManager implements MessageListener { peerManager.penalizeUnreachablePeer(nodeAddress); - if (!remainingNodeAddresses.isEmpty()) { - log.info("There are remaining nodes available for requesting data. " + - "We will try requestDataFromPeers again."); - NodeAddress nextCandidate = remainingNodeAddresses.get(0); - remainingNodeAddresses.remove(nextCandidate); - requestData(nextCandidate, remainingNodeAddresses); - } else { - log.info("There is no remaining node available for requesting data. " + - "That is expected if no other node is online.\n\t" + - "We will try to use reported peers (if no available we use persisted peers) " + - "and try again to request data from our seed nodes after a random pause."); + if (!shutDownInProgress) { + if (!remainingNodeAddresses.isEmpty()) { + log.info("There are remaining nodes available for requesting data. " + + "We will try requestDataFromPeers again."); + NodeAddress nextCandidate = remainingNodeAddresses.get(0); + remainingNodeAddresses.remove(nextCandidate); + requestData(nextCandidate, remainingNodeAddresses); + } else { + log.info("There is no remaining node available for requesting data. " + + "That is expected if no other node is online.\n\t" + + "We will try to use reported peers (if no available we use persisted peers) " + + "and try again to request data from our seed nodes after a random pause."); - // try again after a pause - stopRequestDataTimer(); - requestDataTimer = UserThread.runAfterRandomDelay(() -> { - log.trace("requestDataAfterDelayTimer called"); - // We want to keep it sorted but avoid duplicates - // We don't filter out already established connections for seed nodes as it might be that - // we got from the other seed node contacted but we still have not requested the initial - // data set - List list = new ArrayList<>(seedNodeAddresses); - Collections.shuffle(list); - list.addAll(getFilteredAndSortedList(peerManager.getReportedPeers(), list)); - list.addAll(getFilteredAndSortedList(peerManager.getPersistedPeers(), list)); - checkArgument(!list.isEmpty(), "seedNodeAddresses must not be empty."); - NodeAddress nextCandidate = list.get(0); - list.remove(nextCandidate); - requestData(nextCandidate, list); - }, - 10, 15, TimeUnit.SECONDS); - } + // try again after a pause + stopRequestDataTimer(); + requestDataTimer = UserThread.runAfterRandomDelay(() -> { + log.trace("requestDataAfterDelayTimer called"); + // We want to keep it sorted but avoid duplicates + // We don't filter out already established connections for seed nodes as it might be that + // we got from the other seed node contacted but we still have not requested the initial + // data set + List list = new ArrayList<>(seedNodeAddresses); + Collections.shuffle(list); + list.addAll(getFilteredAndSortedList(peerManager.getReportedPeers(), list)); + list.addAll(getFilteredAndSortedList(peerManager.getPersistedPeers(), list)); + checkArgument(!list.isEmpty(), "seedNodeAddresses must not be empty."); + NodeAddress nextCandidate = list.get(0); + list.remove(nextCandidate); + requestData(nextCandidate, list); + }, + 10, 15, TimeUnit.SECONDS); + } - requestDataHandshakeMap.remove(nodeAddress); + requestDataHandshakeMap.remove(nodeAddress); - // Notify listeners - if (!nodeOfPreliminaryDataRequest.isPresent()) { - if (peerManager.isSeedNode(nodeAddress)) - listener.onNoSeedNodeAvailable(); - else - listener.onNoPeersAvailable(); + // Notify listeners + if (!nodeOfPreliminaryDataRequest.isPresent()) { + if (peerManager.isSeedNode(nodeAddress)) + listener.onNoSeedNodeAvailable(); + else + listener.onNoPeersAvailable(); + } } } });