From 704b985121fd18a66aa35c54751e574d4fcd88fa Mon Sep 17 00:00:00 2001 From: Ivan Vilata-i-Balaguer Date: Thu, 5 May 2016 09:36:49 +0200 Subject: [PATCH] Avoid race condition on timer creation in ``PeerExchangeHandler.sendGetPeersRequest()`` If the timer is created after sending the message and establishing callbacks, they may have already run on timer creation so it would be pointless (and issue a warning when triggered). --- .../peerexchange/PeerExchangeHandler.java | 31 ++++++++++--------- 1 file changed, 16 insertions(+), 15 deletions(-) diff --git a/network/src/main/java/io/bitsquare/p2p/peers/peerexchange/PeerExchangeHandler.java b/network/src/main/java/io/bitsquare/p2p/peers/peerexchange/PeerExchangeHandler.java index 8cf25d0b77..73cc630f8c 100644 --- a/network/src/main/java/io/bitsquare/p2p/peers/peerexchange/PeerExchangeHandler.java +++ b/network/src/main/java/io/bitsquare/p2p/peers/peerexchange/PeerExchangeHandler.java @@ -84,6 +84,22 @@ class PeerExchangeHandler implements MessageListener { if (!stopped) { if (networkNode.getNodeAddress() != null) { GetPeersRequest getPeersRequest = new GetPeersRequest(networkNode.getNodeAddress(), nonce, peerManager.getConnectedNonSeedNodeReportedPeers(nodeAddress)); + + if (timeoutTimer == null) { // setup before sending to avoid race conditions + timeoutTimer = UserThread.runAfter(() -> { + if (!stopped) { + String errorMessage = "A timeout occurred at sending getPeersRequest:" + getPeersRequest + " for nodeAddress:" + nodeAddress; + log.info(errorMessage + " / PeerExchangeHandler=" + + PeerExchangeHandler.this); + log.info("timeoutTimer called on " + this); + handleFault(errorMessage, CloseConnectionReason.SEND_MSG_TIMEOUT, nodeAddress); + } else { + log.trace("We have stopped that handler already. We ignore that timeoutTimer.run call."); + } + }, + TIME_OUT_SEC, TimeUnit.SECONDS); + } + SettableFuture future = networkNode.sendMessage(nodeAddress, getPeersRequest); Futures.addCallback(future, new FutureCallback() { @Override @@ -116,21 +132,6 @@ class PeerExchangeHandler implements MessageListener { } } }); - - if (timeoutTimer == null) { - timeoutTimer = UserThread.runAfter(() -> { - if (!stopped) { - String errorMessage = "A timeout occurred at sending getPeersRequest:" + getPeersRequest + " for nodeAddress:" + nodeAddress; - log.info(errorMessage + " / PeerExchangeHandler=" + - PeerExchangeHandler.this); - log.info("timeoutTimer called on " + this); - handleFault(errorMessage, CloseConnectionReason.SEND_MSG_TIMEOUT, nodeAddress); - } else { - log.trace("We have stopped that handler already. We ignore that timeoutTimer.run call."); - } - }, - TIME_OUT_SEC, TimeUnit.SECONDS); - } } else { log.debug("My node address is still null at sendGetPeersRequest. We ignore that call."); }