From 9378fe4603d2a0839e38baa03187a8cb0c1f5fb0 Mon Sep 17 00:00:00 2001 From: jmacxx <47253594+jmacxx@users.noreply.github.com> Date: Thu, 23 Dec 2021 14:40:11 -0600 Subject: [PATCH 1/3] Patch from chimp1984 improving the DaoState persistence --- .../monitoring/DaoStateMonitoringService.java | 2 +- .../main/java/bisq/core/dao/node/BsqNode.java | 1 + .../dao/state/DaoStateSnapshotService.java | 3 ++ .../state/storage/DaoStateStorageService.java | 53 +++++++++++++------ 4 files changed, 43 insertions(+), 16 deletions(-) diff --git a/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java index cb8d0b95331..ad446bac3fa 100644 --- a/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java +++ b/core/src/main/java/bisq/core/dao/monitoring/DaoStateMonitoringService.java @@ -127,7 +127,7 @@ public interface Listener { @Nullable private Runnable createSnapshotHandler; // Lookup map - private Map daoStateBlockByHeight = new HashMap<>(); + private final Map daoStateBlockByHeight = new HashMap<>(); /////////////////////////////////////////////////////////////////////////////////////////// diff --git a/core/src/main/java/bisq/core/dao/node/BsqNode.java b/core/src/main/java/bisq/core/dao/node/BsqNode.java index 43ece4ec1f6..5262b125fd3 100644 --- a/core/src/main/java/bisq/core/dao/node/BsqNode.java +++ b/core/src/main/java/bisq/core/dao/node/BsqNode.java @@ -157,6 +157,7 @@ public void setWarnMessageHandler(@SuppressWarnings("NullableProblems") Consumer public void shutDown() { exportJsonFilesService.shutDown(); + daoStateSnapshotService.shutDown(); } diff --git a/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java b/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java index 7e455158c86..5ee7111249a 100644 --- a/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java +++ b/core/src/main/java/bisq/core/dao/state/DaoStateSnapshotService.java @@ -122,6 +122,9 @@ public void addListeners() { public void start() { } + public void shutDown() { + daoStateStorageService.shutDown(); + } /////////////////////////////////////////////////////////////////////////////////////////// // DaoStateListener diff --git a/core/src/main/java/bisq/core/dao/state/storage/DaoStateStorageService.java b/core/src/main/java/bisq/core/dao/state/storage/DaoStateStorageService.java index 05148f4b0bb..dfb78ac4c83 100644 --- a/core/src/main/java/bisq/core/dao/state/storage/DaoStateStorageService.java +++ b/core/src/main/java/bisq/core/dao/state/storage/DaoStateStorageService.java @@ -33,11 +33,18 @@ import javax.inject.Inject; import javax.inject.Named; +import com.google.common.util.concurrent.MoreExecutors; + import java.io.File; import java.io.IOException; import java.util.LinkedList; import java.util.List; +import java.util.Optional; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; +import java.util.concurrent.TimeUnit; import lombok.extern.slf4j.Slf4j; @@ -53,6 +60,8 @@ public class DaoStateStorageService extends StoreService { private final BsqBlocksStorageService bsqBlocksStorageService; private final File storageDir; private final LinkedList blocks = new LinkedList<>(); + private final ExecutorService executorService = Executors.newSingleThreadExecutor(); + private Optional> future = Optional.empty(); /////////////////////////////////////////////////////////////////////////////////////////// @@ -94,22 +103,36 @@ public void requestPersistence(protobuf.DaoState daoStateAsProto, return; } - new Thread(() -> { - Thread.currentThread().setName("Write-blocks-and-DaoState"); - bsqBlocksStorageService.persistBlocks(blocks); + if (future.isPresent() && !future.get().isDone()) { + UserThread.runAfter(() -> requestPersistence(daoStateAsProto, blocks, daoStateHashChain, completeHandler), 2); + return; + } - store.setDaoStateAsProto(daoStateAsProto); - store.setDaoStateHashChain(daoStateHashChain); - long ts = System.currentTimeMillis(); - persistenceManager.persistNow(() -> { - // After we have written to disk we remove the daoStateAsProto in the store to avoid that it stays in - // memory there until the next persist call. - log.info("Persist daoState took {} ms", System.currentTimeMillis() - ts); - store.releaseMemory(); - GcUtil.maybeReleaseMemory(); - UserThread.execute(completeHandler); - }); - }).start(); + future = Optional.of(executorService.submit(() -> { + try { + Thread.currentThread().setName("Write-blocks-and-DaoState"); + bsqBlocksStorageService.persistBlocks(blocks); + store.setDaoStateAsProto(daoStateAsProto); + store.setDaoStateHashChain(daoStateHashChain); + long ts = System.currentTimeMillis(); + persistenceManager.persistNow(() -> { + // After we have written to disk we remove the daoStateAsProto in the store to avoid that it stays in + // memory there until the next persist call. + log.info("Persist daoState took {} ms", System.currentTimeMillis() - ts); + store.releaseMemory(); + GcUtil.maybeReleaseMemory(); + UserThread.execute(completeHandler); + }); + } catch (Exception e) { + log.error("Exception at persisting BSQ blocks and DaoState", e); + } + })); + } + + public void shutDown() { + executorService.shutdown(); + // noinspection UnstableApiUsage + MoreExecutors.shutdownAndAwaitTermination(executorService, 10, TimeUnit.SECONDS); } @Override From 0b66fdcbef461cc3353fa33234bb034b6200d1e7 Mon Sep 17 00:00:00 2001 From: jmacxx <47253594+jmacxx@users.noreply.github.com> Date: Thu, 23 Dec 2021 14:42:18 -0600 Subject: [PATCH 2/3] Statistics logging changes Add thread count to periodic logged statistics Increase the statistic logging interval from 5 minutes to 1 hour --- .../main/java/bisq/network/p2p/network/Statistic.java | 10 ++++++---- .../main/java/bisq/network/p2p/peers/PeerManager.java | 2 +- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/p2p/src/main/java/bisq/network/p2p/network/Statistic.java b/p2p/src/main/java/bisq/network/p2p/network/Statistic.java index a81ca090a29..a0553d47bbf 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/Statistic.java +++ b/p2p/src/main/java/bisq/network/p2p/network/Statistic.java @@ -72,7 +72,7 @@ public class Statistic { totalReceivedBytesPerSec.set(((double) totalReceivedBytes.get()) / passed); }, 1); - // We log statistics every 5 minutes + // We log statistics every 60 minutes UserThread.runPeriodically(() -> { String ls = System.lineSeparator(); log.info("Accumulated network statistics:" + ls + @@ -81,14 +81,16 @@ public class Statistic { "Number of sent messages per sec: {};" + ls + "Bytes received: {}" + ls + "Number of received messages/Received messages: {} / {};" + ls + - "Number of received messages per sec: {};" + ls, + "Number of received messages per sec: {};" + ls + + "Number of threads: {}" + ls, Utilities.readableFileSize(totalSentBytes.get()), numTotalSentMessages.get(), totalSentMessages, numTotalSentMessagesPerSec.get(), Utilities.readableFileSize(totalReceivedBytes.get()), numTotalReceivedMessages.get(), totalReceivedMessages, - numTotalReceivedMessagesPerSec.get()); - }, TimeUnit.MINUTES.toSeconds(5)); + numTotalReceivedMessagesPerSec.get(), + Thread.getAllStackTraces().keySet().size()); + }, TimeUnit.MINUTES.toSeconds(60)); } public static LongProperty totalSentBytesProperty() { diff --git a/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java b/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java index ac887a15ae2..ebc581bbe2e 100644 --- a/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java +++ b/p2p/src/main/java/bisq/network/p2p/peers/PeerManager.java @@ -174,7 +174,7 @@ public void onAwakeFromStandby(long missedMs) { }; clockWatcher.addListener(clockWatcherListener); - printStatisticsTimer = UserThread.runPeriodically(this::printStatistics, TimeUnit.MINUTES.toSeconds(5)); + printStatisticsTimer = UserThread.runPeriodically(this::printStatistics, TimeUnit.MINUTES.toSeconds(60)); } public void shutDown() { From 30706f05e27c34c7a980f154f03879cb9486df5a Mon Sep 17 00:00:00 2001 From: jmacxx <47253594+jmacxx@users.noreply.github.com> Date: Fri, 24 Dec 2021 12:40:49 -0600 Subject: [PATCH 3/3] No. of threads is already logged every 10 minutes from printSystemLoad --- p2p/src/main/java/bisq/network/p2p/network/Statistic.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/p2p/src/main/java/bisq/network/p2p/network/Statistic.java b/p2p/src/main/java/bisq/network/p2p/network/Statistic.java index a0553d47bbf..2f17a0fdb01 100644 --- a/p2p/src/main/java/bisq/network/p2p/network/Statistic.java +++ b/p2p/src/main/java/bisq/network/p2p/network/Statistic.java @@ -81,15 +81,13 @@ public class Statistic { "Number of sent messages per sec: {};" + ls + "Bytes received: {}" + ls + "Number of received messages/Received messages: {} / {};" + ls + - "Number of received messages per sec: {};" + ls + - "Number of threads: {}" + ls, + "Number of received messages per sec: {}" + ls, Utilities.readableFileSize(totalSentBytes.get()), numTotalSentMessages.get(), totalSentMessages, numTotalSentMessagesPerSec.get(), Utilities.readableFileSize(totalReceivedBytes.get()), numTotalReceivedMessages.get(), totalReceivedMessages, - numTotalReceivedMessagesPerSec.get(), - Thread.getAllStackTraces().keySet().size()); + numTotalReceivedMessagesPerSec.get()); }, TimeUnit.MINUTES.toSeconds(60)); }