From 0908c6d61f90e5a46f1c24d443327c58df67c01a Mon Sep 17 00:00:00 2001 From: Manfred Karrer Date: Tue, 23 Feb 2016 13:04:49 +0100 Subject: [PATCH] Improve broadcast listener handling, add randomized delay for messages to all connected peers --- .../trade/offer/OpenOfferManager.java | 70 +++--- .../io/bitsquare/gui/main/MainViewModel.java | 4 +- .../settings/network/NetworkSettingsView.fxml | 5 +- .../settings/network/NetworkSettingsView.java | 4 +- .../java/io/bitsquare/p2p/P2PService.java | 93 +++---- .../io/bitsquare/p2p/network/Statistic.java | 4 + .../bitsquare/p2p/peers/BroadcastHandler.java | 233 ++++++++++++++++++ .../io/bitsquare/p2p/peers/Broadcaster.java | 116 +-------- .../p2p/peers/keepalive/KeepAliveHandler.java | 15 +- .../p2p/peers/keepalive/KeepAliveManager.java | 8 +- .../peerexchange/PeerExchangeHandler.java | 12 +- .../peerexchange/PeerExchangeManager.java | 2 +- .../bitsquare/p2p/storage/P2PDataStorage.java | 88 +++---- 13 files changed, 405 insertions(+), 249 deletions(-) create mode 100644 network/src/main/java/io/bitsquare/p2p/peers/BroadcastHandler.java diff --git a/core/src/main/java/io/bitsquare/trade/offer/OpenOfferManager.java b/core/src/main/java/io/bitsquare/trade/offer/OpenOfferManager.java index 91076c3421..0452378a97 100644 --- a/core/src/main/java/io/bitsquare/trade/offer/OpenOfferManager.java +++ b/core/src/main/java/io/bitsquare/trade/offer/OpenOfferManager.java @@ -360,35 +360,39 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe if (!stopped) { stopPeriodicRefreshOffersTimer(); - openOffers.stream().forEach(openOffer -> { - offerBookService.republishOffers(openOffer.getOffer(), - () -> { - if (!stopped) { - log.debug("Successful added offer to P2P network"); - // Refresh means we send only the dat needed to refresh the TTL (hash, signature and sequence nr.) - if (periodicRefreshOffersTimer == null) - startPeriodicRefreshOffersTimer(); - } else { - log.warn("We have stopped already. We ignore that offerBookService.republishOffers.onSuccess call."); - } - }, - errorMessage -> { - if (!stopped) { - log.error("Add offer to P2P network failed. " + errorMessage); - stopRetryRepublishOffersTimer(); - retryRepublishOffersTimer = UserThread.runAfter(OpenOfferManager.this::republishOffers, - RETRY_REPUBLISH_DELAY_SEC); - } else { - log.warn("We have stopped already. We ignore that offerBookService.republishOffers.onFault call."); - } - }); - openOffer.setStorage(openOffersStorage); - }); + openOffers.stream().forEach(openOffer -> + UserThread.runAfterRandomDelay(() -> + republishOffer(openOffer), 1, 1000, TimeUnit.MILLISECONDS)); } else { log.warn("We have stopped already. We ignore that republishOffers call."); } } + private void republishOffer(OpenOffer openOffer) { + offerBookService.republishOffers(openOffer.getOffer(), + () -> { + if (!stopped) { + log.debug("Successful added offer to P2P network"); + // Refresh means we send only the dat needed to refresh the TTL (hash, signature and sequence nr.) + if (periodicRefreshOffersTimer == null) + startPeriodicRefreshOffersTimer(); + } else { + log.warn("We have stopped already. We ignore that offerBookService.republishOffers.onSuccess call."); + } + }, + errorMessage -> { + if (!stopped) { + log.error("Add offer to P2P network failed. " + errorMessage); + stopRetryRepublishOffersTimer(); + retryRepublishOffersTimer = UserThread.runAfter(OpenOfferManager.this::republishOffers, + RETRY_REPUBLISH_DELAY_SEC); + } else { + log.warn("We have stopped already. We ignore that offerBookService.republishOffers.onFault call."); + } + }); + openOffer.setStorage(openOffersStorage); + } + private void startPeriodicRepublishOffersTimer() { Log.traceCall(); stopped = false; @@ -403,7 +407,7 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe REPUBLISH_INTERVAL_MILLIS, TimeUnit.MILLISECONDS); else - log.warn("periodicRepublishOffersTimer already stated"); + log.trace("periodicRepublishOffersTimer already stated"); } private void startPeriodicRefreshOffersTimer() { @@ -414,11 +418,9 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe periodicRefreshOffersTimer = UserThread.runPeriodically(() -> { if (!stopped) { Log.traceCall("Number of offer for refresh: " + openOffers.size()); - openOffers.stream().forEach(openOffer -> { - offerBookService.refreshOffer(openOffer.getOffer(), - () -> log.debug("Successful refreshed TTL for offer"), - errorMessage -> log.error("Refresh TTL for offer failed. " + errorMessage)); - }); + openOffers.stream().forEach(openOffer -> + UserThread.runAfterRandomDelay(() -> + refreshOffer(openOffer), 1, 5000, TimeUnit.MILLISECONDS)); } else { log.warn("We have stopped already. We ignore that periodicRefreshOffersTimer.run call."); } @@ -426,7 +428,13 @@ public class OpenOfferManager implements PeerManager.Listener, DecryptedDirectMe REFRESH_INTERVAL_MILLIS, TimeUnit.MILLISECONDS); else - log.warn("periodicRefreshOffersTimer already stated"); + log.trace("periodicRefreshOffersTimer already stated"); + } + + private void refreshOffer(OpenOffer openOffer) { + offerBookService.refreshOffer(openOffer.getOffer(), + () -> log.debug("Successful refreshed TTL for offer"), + errorMessage -> log.error("Refresh TTL for offer failed. " + errorMessage)); } private void restart() { diff --git a/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java b/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java index 5442ac0b6e..e126087e7e 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java +++ b/gui/src/main/java/io/bitsquare/gui/main/MainViewModel.java @@ -204,8 +204,8 @@ public class MainViewModel implements ViewModel { new Popup().warning("The application could not startup after 3 minutes.\n" + "There might be some network connection problems or a unstable Tor path.\n\n" + "Please restart and try again.") - .closeButtonText("Shut down") - .onClose(BitsquareApp.shutDownHandler::run) + .actionButtonText("Shut down and start again") + .onAction(BitsquareApp.shutDownHandler::run) .show(); }, 3, TimeUnit.MINUTES); diff --git a/gui/src/main/java/io/bitsquare/gui/main/settings/network/NetworkSettingsView.fxml b/gui/src/main/java/io/bitsquare/gui/main/settings/network/NetworkSettingsView.fxml index 6a1f74adea..fcec5d42c0 100644 --- a/gui/src/main/java/io/bitsquare/gui/main/settings/network/NetworkSettingsView.fxml +++ b/gui/src/main/java/io/bitsquare/gui/main/settings/network/NetworkSettingsView.fxml @@ -42,7 +42,7 @@