From 4b840547cff8caf4303b7adbc359331a92f69a5e Mon Sep 17 00:00:00 2001 From: Simon Dudley Date: Tue, 23 Jul 2024 12:00:48 +1000 Subject: [PATCH 1/8] TrieLogPruner preload with 30 second timeout Signed-off-by: Simon Dudley --- .../common/trielog/TrieLogPruner.java | 70 ++++++++++++++++--- 1 file changed, 59 insertions(+), 11 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java index cea5c1a327d..8674add1fd4 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java @@ -25,7 +25,14 @@ import org.hyperledger.besu.plugin.services.trielogs.TrieLogEvent; import java.util.Comparator; +import java.util.List; import java.util.Optional; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.TimeoutException; +import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; import java.util.stream.Stream; @@ -40,6 +47,7 @@ public class TrieLogPruner implements TrieLogEvent.TrieLogObserver { private static final Logger LOG = LoggerFactory.getLogger(TrieLogPruner.class); + private static final int PRELOAD_TIMEOUT_IN_SECONDS = 30; private final int pruningLimit; private final int loadingLimit; @@ -83,25 +91,56 @@ public TrieLogPruner( BesuMetricCategory.PRUNER, "trie_log_pruned_orphan", "trie log pruned orphan"); } - public int initialize() { - return preloadQueue(); + public void initialize() { + preloadQueueWithTimeout(); } - private int preloadQueue() { + private void preloadQueueWithTimeout() { LOG.atInfo() - .setMessage("Loading first {} trie logs from database...") + .setMessage("Attempting to load first {} trie logs from database...") .addArgument(loadingLimit) .log(); - try (final Stream trieLogKeys = rootWorldStateStorage.streamTrieLogKeys(loadingLimit)) { - final AtomicLong count = new AtomicLong(); + + final AtomicBoolean timeoutOccurred = new AtomicBoolean(false); + final Runnable timeoutTask = + () -> { + timeoutOccurred.set(true); + LOG.atWarn() + .setMessage("Timeout occurred while loading {} trie logs from database") + .addArgument(loadingLimit) + .log(); + }; + + try (final Stream trieLogKeysStream = + rootWorldStateStorage.streamTrieLogKeys(loadingLimit); + final ScheduledExecutorService preloadExecutor = Executors.newScheduledThreadPool(1)) { + + final List trieLogKeys = trieLogKeysStream.toList(); + + LOG.atInfo().log( + "Loaded {} trie logs from database, determining if any can be pruned...", + trieLogKeys.size()); + LOG.atInfo() + .setMessage( + "Trie log loading will timeout after {} seconds. If this is timing out, consider using `besu storage trie-log prune` subcommand, see https://besu.hyperledger.org/public-networks/how-to/bonsai-limit-trie-logs") + .addArgument(PRELOAD_TIMEOUT_IN_SECONDS) + .log(); + final ScheduledFuture timeoutFuture = + preloadExecutor.schedule(timeoutTask, PRELOAD_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS); + + final AtomicLong addToPruneQueueCount = new AtomicLong(); final AtomicLong orphansPruned = new AtomicLong(); trieLogKeys.forEach( blockHashAsBytes -> { + if (timeoutOccurred.get()) { + throw new RuntimeException( + new TimeoutException("Timeout occurred while preloading trie log prune queue")); + } final Hash blockHash = Hash.wrap(Bytes32.wrap(blockHashAsBytes)); final Optional header = blockchain.getBlockHeader(blockHash); if (header.isPresent()) { addToPruneQueue(header.get().getNumber(), blockHash); - count.getAndIncrement(); + addToPruneQueueCount.getAndIncrement(); } else { // prune orphaned blocks (sometimes created during block production) rootWorldStateStorage.pruneTrieLog(blockHash); @@ -109,12 +148,21 @@ private int preloadQueue() { prunedOrphanCounter.inc(); } }); + + timeoutFuture.cancel(true); LOG.atDebug().log("Pruned {} orphaned trie logs from database...", orphansPruned.intValue()); - LOG.atInfo().log("Loaded {} trie logs from database", count); - return pruneFromQueue() + orphansPruned.intValue(); + LOG.atInfo().log( + "Added {} trie logs to prune queue. Commencing pruning of eligible trie logs...", + addToPruneQueueCount.intValue()); + int prunedCount = pruneFromQueue(); + LOG.atInfo().log("Pruned {} trie logs.", prunedCount); } catch (Exception e) { - LOG.error("Error loading trie logs from database, nothing pruned", e); - return 0; + if (e.getCause() != null && e.getCause() instanceof TimeoutException) { + int prunedCount = pruneFromQueue(); + LOG.atInfo().log("Operation timed out, but still pruned {} trie logs.", prunedCount); + } else { + LOG.error("Error loading trie logs from database, nothing pruned", e); + } } } From 3f91cda50525140cf6f0e7ed0aa11df03065db2c Mon Sep 17 00:00:00 2001 From: Simon Dudley Date: Tue, 23 Jul 2024 12:33:49 +1000 Subject: [PATCH 2/8] Schedule timeout task before key streaming begins Signed-off-by: Simon Dudley --- .../common/trielog/TrieLogPruner.java | 96 ++++++++++--------- 1 file changed, 51 insertions(+), 45 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java index 8674add1fd4..8ff1ff77b8e 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java @@ -96,10 +96,6 @@ public void initialize() { } private void preloadQueueWithTimeout() { - LOG.atInfo() - .setMessage("Attempting to load first {} trie logs from database...") - .addArgument(loadingLimit) - .log(); final AtomicBoolean timeoutOccurred = new AtomicBoolean(false); final Runnable timeoutTask = @@ -111,57 +107,67 @@ private void preloadQueueWithTimeout() { .log(); }; - try (final Stream trieLogKeysStream = - rootWorldStateStorage.streamTrieLogKeys(loadingLimit); - final ScheduledExecutorService preloadExecutor = Executors.newScheduledThreadPool(1)) { + LOG.atInfo() + .setMessage("Attempting to load first {} trie logs from database...") + .addArgument(loadingLimit) + .log(); - final List trieLogKeys = trieLogKeysStream.toList(); + try (final ScheduledExecutorService preloadExecutor = Executors.newScheduledThreadPool(1)) { - LOG.atInfo().log( - "Loaded {} trie logs from database, determining if any can be pruned...", - trieLogKeys.size()); + final ScheduledFuture timeoutFuture = + preloadExecutor.schedule(timeoutTask, PRELOAD_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS); LOG.atInfo() .setMessage( "Trie log loading will timeout after {} seconds. If this is timing out, consider using `besu storage trie-log prune` subcommand, see https://besu.hyperledger.org/public-networks/how-to/bonsai-limit-trie-logs") .addArgument(PRELOAD_TIMEOUT_IN_SECONDS) .log(); - final ScheduledFuture timeoutFuture = - preloadExecutor.schedule(timeoutTask, PRELOAD_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS); - final AtomicLong addToPruneQueueCount = new AtomicLong(); - final AtomicLong orphansPruned = new AtomicLong(); - trieLogKeys.forEach( - blockHashAsBytes -> { - if (timeoutOccurred.get()) { - throw new RuntimeException( - new TimeoutException("Timeout occurred while preloading trie log prune queue")); - } - final Hash blockHash = Hash.wrap(Bytes32.wrap(blockHashAsBytes)); - final Optional header = blockchain.getBlockHeader(blockHash); - if (header.isPresent()) { - addToPruneQueue(header.get().getNumber(), blockHash); - addToPruneQueueCount.getAndIncrement(); - } else { - // prune orphaned blocks (sometimes created during block production) - rootWorldStateStorage.pruneTrieLog(blockHash); - orphansPruned.getAndIncrement(); - prunedOrphanCounter.inc(); - } - }); + try (final Stream trieLogKeysStream = + rootWorldStateStorage.streamTrieLogKeys(loadingLimit)) { + + final List trieLogKeys = trieLogKeysStream.toList(); + + LOG.atInfo() + .setMessage("Loaded {} trie logs from database, determining if any can be pruned...") + .addArgument(trieLogKeys.size()) + .log(); + + final AtomicLong addToPruneQueueCount = new AtomicLong(); + final AtomicLong orphansPruned = new AtomicLong(); + trieLogKeys.forEach( + blockHashAsBytes -> { + if (timeoutOccurred.get()) { + throw new RuntimeException( + new TimeoutException("Timeout occurred while preloading trie log prune queue")); + } + final Hash blockHash = Hash.wrap(Bytes32.wrap(blockHashAsBytes)); + final Optional header = blockchain.getBlockHeader(blockHash); + if (header.isPresent()) { + addToPruneQueue(header.get().getNumber(), blockHash); + addToPruneQueueCount.getAndIncrement(); + } else { + // prune orphaned blocks (sometimes created during block production) + rootWorldStateStorage.pruneTrieLog(blockHash); + orphansPruned.getAndIncrement(); + prunedOrphanCounter.inc(); + } + }); - timeoutFuture.cancel(true); - LOG.atDebug().log("Pruned {} orphaned trie logs from database...", orphansPruned.intValue()); - LOG.atInfo().log( - "Added {} trie logs to prune queue. Commencing pruning of eligible trie logs...", - addToPruneQueueCount.intValue()); - int prunedCount = pruneFromQueue(); - LOG.atInfo().log("Pruned {} trie logs.", prunedCount); - } catch (Exception e) { - if (e.getCause() != null && e.getCause() instanceof TimeoutException) { + timeoutFuture.cancel(true); + LOG.atDebug().log( + "Pruned {} orphaned trie logs from database...", orphansPruned.intValue()); + LOG.atInfo().log( + "Added {} trie logs to prune queue. Commencing pruning of eligible trie logs...", + addToPruneQueueCount.intValue()); int prunedCount = pruneFromQueue(); - LOG.atInfo().log("Operation timed out, but still pruned {} trie logs.", prunedCount); - } else { - LOG.error("Error loading trie logs from database, nothing pruned", e); + LOG.atInfo().log("Pruned {} trie logs.", prunedCount); + } catch (Exception e) { + if (e.getCause() != null && e.getCause() instanceof TimeoutException) { + int prunedCount = pruneFromQueue(); + LOG.atInfo().log("Operation timed out, but still pruned {} trie logs.", prunedCount); + } else { + LOG.error("Error loading trie logs from database, nothing pruned", e); + } } } } From 5ba166db6916dd8ce4a1c2a5ec80c45b214ca2dc Mon Sep 17 00:00:00 2001 From: Simon Dudley Date: Tue, 23 Jul 2024 14:01:26 +1000 Subject: [PATCH 3/8] Maintain stream instead of terminating with toList Signed-off-by: Simon Dudley --- .../common/trielog/TrieLogPruner.java | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java index 8ff1ff77b8e..ebcbf550b08 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java @@ -25,7 +25,6 @@ import org.hyperledger.besu.plugin.services.trielogs.TrieLogEvent; import java.util.Comparator; -import java.util.List; import java.util.Optional; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; @@ -97,16 +96,6 @@ public void initialize() { private void preloadQueueWithTimeout() { - final AtomicBoolean timeoutOccurred = new AtomicBoolean(false); - final Runnable timeoutTask = - () -> { - timeoutOccurred.set(true); - LOG.atWarn() - .setMessage("Timeout occurred while loading {} trie logs from database") - .addArgument(loadingLimit) - .log(); - }; - LOG.atInfo() .setMessage("Attempting to load first {} trie logs from database...") .addArgument(loadingLimit) @@ -114,6 +103,17 @@ private void preloadQueueWithTimeout() { try (final ScheduledExecutorService preloadExecutor = Executors.newScheduledThreadPool(1)) { + final AtomicBoolean timeoutOccurred = new AtomicBoolean(false); + final Runnable timeoutTask = + () -> { + timeoutOccurred.set(true); + LOG.atWarn() + .setMessage( + "Timeout occurred while loading and processing {} trie logs from database") + .addArgument(loadingLimit) + .log(); + }; + final ScheduledFuture timeoutFuture = preloadExecutor.schedule(timeoutTask, PRELOAD_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS); LOG.atInfo() @@ -122,14 +122,11 @@ private void preloadQueueWithTimeout() { .addArgument(PRELOAD_TIMEOUT_IN_SECONDS) .log(); - try (final Stream trieLogKeysStream = + try (final Stream trieLogKeys = rootWorldStateStorage.streamTrieLogKeys(loadingLimit)) { - final List trieLogKeys = trieLogKeysStream.toList(); - LOG.atInfo() - .setMessage("Loaded {} trie logs from database, determining if any can be pruned...") - .addArgument(trieLogKeys.size()) + .setMessage("Loaded trie logs from database, determining if any can be pruned...") .log(); final AtomicLong addToPruneQueueCount = new AtomicLong(); From b94c6c28387339e644a34fa490846ad45fa17804 Mon Sep 17 00:00:00 2001 From: Simon Dudley Date: Tue, 23 Jul 2024 14:18:12 +1000 Subject: [PATCH 4/8] Refactor Signed-off-by: Simon Dudley --- .../common/trielog/TrieLogPruner.java | 84 ++++++++++--------- 1 file changed, 44 insertions(+), 40 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java index ebcbf550b08..88d32be475c 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java @@ -118,53 +118,57 @@ private void preloadQueueWithTimeout() { preloadExecutor.schedule(timeoutTask, PRELOAD_TIMEOUT_IN_SECONDS, TimeUnit.SECONDS); LOG.atInfo() .setMessage( - "Trie log loading will timeout after {} seconds. If this is timing out, consider using `besu storage trie-log prune` subcommand, see https://besu.hyperledger.org/public-networks/how-to/bonsai-limit-trie-logs") + "Trie log pruning will timeout after {} seconds. If this is timing out, consider using `besu storage trie-log prune` subcommand, see https://besu.hyperledger.org/public-networks/how-to/bonsai-limit-trie-logs") .addArgument(PRELOAD_TIMEOUT_IN_SECONDS) .log(); - try (final Stream trieLogKeys = - rootWorldStateStorage.streamTrieLogKeys(loadingLimit)) { + preloadQueue(timeoutOccurred, timeoutFuture); + } + } + + private void preloadQueue( + final AtomicBoolean timeoutOccurred, final ScheduledFuture timeoutFuture) { + + try (final Stream trieLogKeys = rootWorldStateStorage.streamTrieLogKeys(loadingLimit)) { - LOG.atInfo() - .setMessage("Loaded trie logs from database, determining if any can be pruned...") - .log(); + LOG.atInfo() + .setMessage("Loaded trie logs from database, determining if any can be pruned...") + .log(); - final AtomicLong addToPruneQueueCount = new AtomicLong(); - final AtomicLong orphansPruned = new AtomicLong(); - trieLogKeys.forEach( - blockHashAsBytes -> { - if (timeoutOccurred.get()) { - throw new RuntimeException( - new TimeoutException("Timeout occurred while preloading trie log prune queue")); - } - final Hash blockHash = Hash.wrap(Bytes32.wrap(blockHashAsBytes)); - final Optional header = blockchain.getBlockHeader(blockHash); - if (header.isPresent()) { - addToPruneQueue(header.get().getNumber(), blockHash); - addToPruneQueueCount.getAndIncrement(); - } else { - // prune orphaned blocks (sometimes created during block production) - rootWorldStateStorage.pruneTrieLog(blockHash); - orphansPruned.getAndIncrement(); - prunedOrphanCounter.inc(); - } - }); + final AtomicLong addToPruneQueueCount = new AtomicLong(); + final AtomicLong orphansPruned = new AtomicLong(); + trieLogKeys.forEach( + blockHashAsBytes -> { + if (timeoutOccurred.get()) { + throw new RuntimeException( + new TimeoutException("Timeout occurred while preloading trie log prune queue")); + } + final Hash blockHash = Hash.wrap(Bytes32.wrap(blockHashAsBytes)); + final Optional header = blockchain.getBlockHeader(blockHash); + if (header.isPresent()) { + addToPruneQueue(header.get().getNumber(), blockHash); + addToPruneQueueCount.getAndIncrement(); + } else { + // prune orphaned blocks (sometimes created during block production) + rootWorldStateStorage.pruneTrieLog(blockHash); + orphansPruned.getAndIncrement(); + prunedOrphanCounter.inc(); + } + }); - timeoutFuture.cancel(true); - LOG.atDebug().log( - "Pruned {} orphaned trie logs from database...", orphansPruned.intValue()); - LOG.atInfo().log( - "Added {} trie logs to prune queue. Commencing pruning of eligible trie logs...", - addToPruneQueueCount.intValue()); + timeoutFuture.cancel(true); + LOG.atDebug().log("Pruned {} orphaned trie logs from database...", orphansPruned.intValue()); + LOG.atInfo().log( + "Added {} trie logs to prune queue. Commencing pruning of eligible trie logs...", + addToPruneQueueCount.intValue()); + int prunedCount = pruneFromQueue(); + LOG.atInfo().log("Pruned {} trie logs.", prunedCount); + } catch (Exception e) { + if (e.getCause() != null && e.getCause() instanceof TimeoutException) { int prunedCount = pruneFromQueue(); - LOG.atInfo().log("Pruned {} trie logs.", prunedCount); - } catch (Exception e) { - if (e.getCause() != null && e.getCause() instanceof TimeoutException) { - int prunedCount = pruneFromQueue(); - LOG.atInfo().log("Operation timed out, but still pruned {} trie logs.", prunedCount); - } else { - LOG.error("Error loading trie logs from database, nothing pruned", e); - } + LOG.atInfo().log("Operation timed out, but still pruned {} trie logs.", prunedCount); + } else { + LOG.error("Error loading trie logs from database, nothing pruned", e); } } } From 06c5beecfc53c44ee970a09d7117cd290f69376d Mon Sep 17 00:00:00 2001 From: Simon Dudley Date: Tue, 23 Jul 2024 15:01:09 +1000 Subject: [PATCH 5/8] Reduce pruning window from 30_000 to 5_000 Signed-off-by: Simon Dudley --- .../besu/ethereum/worldstate/DataStorageConfiguration.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java index 615b5bad6eb..8d767f442aa 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java @@ -25,7 +25,7 @@ public interface DataStorageConfiguration { long DEFAULT_BONSAI_MAX_LAYERS_TO_LOAD = 512; boolean DEFAULT_BONSAI_LIMIT_TRIE_LOGS_ENABLED = true; long MINIMUM_BONSAI_TRIE_LOG_RETENTION_LIMIT = DEFAULT_BONSAI_MAX_LAYERS_TO_LOAD; - int DEFAULT_BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE = 30_000; + int DEFAULT_BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE = 5_000; boolean DEFAULT_RECEIPT_COMPACTION_ENABLED = false; DataStorageConfiguration DEFAULT_CONFIG = From b24eb1a1bb4a162bf1ff1cba3b1ece4d4d75b56b Mon Sep 17 00:00:00 2001 From: Simon Dudley Date: Tue, 23 Jul 2024 16:02:55 +1000 Subject: [PATCH 6/8] remove redundant log Signed-off-by: Simon Dudley --- .../ethereum/trie/diffbased/common/trielog/TrieLogPruner.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java index 88d32be475c..98bc4246ebe 100644 --- a/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java +++ b/ethereum/core/src/main/java/org/hyperledger/besu/ethereum/trie/diffbased/common/trielog/TrieLogPruner.java @@ -131,10 +131,6 @@ private void preloadQueue( try (final Stream trieLogKeys = rootWorldStateStorage.streamTrieLogKeys(loadingLimit)) { - LOG.atInfo() - .setMessage("Loaded trie logs from database, determining if any can be pruned...") - .log(); - final AtomicLong addToPruneQueueCount = new AtomicLong(); final AtomicLong orphansPruned = new AtomicLong(); trieLogKeys.forEach( From 8a5b6319fd880caa1c31896ea000fad13d18c17d Mon Sep 17 00:00:00 2001 From: Simon Dudley Date: Fri, 26 Jul 2024 11:48:57 +1000 Subject: [PATCH 7/8] changelog Signed-off-by: Simon Dudley --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 813cf6804b8..da6ae993789 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -31,6 +31,7 @@ ### Bug fixes - Fix `eth_call` deserialization to correctly ignore unknown fields in the transaction object. [#7323](https://github.com/hyperledger/besu/pull/7323) - Prevent Besu from starting up with sync-mode=FULL and bonsai-limit-trie-logs-enabled=true for private networks [#7357](https://github.com/hyperledger/besu/pull/7357) +- Add 30 second timeout to trie log pruner preload [#7365](https://github.com/hyperledger/besu/pull/7365) - Avoid executing pruner preload during trie log subcommands [#7366](https://github.com/hyperledger/besu/pull/7366) ## 24.7.0 From 95c41041edb81be4065fd4bfc24d6798ddf4658e Mon Sep 17 00:00:00 2001 From: Simon Dudley Date: Fri, 26 Jul 2024 11:50:49 +1000 Subject: [PATCH 8/8] changelog again Signed-off-by: Simon Dudley --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index da6ae993789..4d3f9eb4012 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -26,6 +26,7 @@ - Add trie log pruner metrics [#7352](https://github.com/hyperledger/besu/pull/7352) - Force bonsai-limit-trie-logs-enabled=false when sync-mode=FULL instead of startup error [#7357](https://github.com/hyperledger/besu/pull/7357) - `--Xbonsai-parallel-tx-processing-enabled` option enables executing transactions in parallel during block processing for Bonsai nodes +- Reduce default trie log pruning window size from 30,000 to 5,000 [#7365](https://github.com/hyperledger/besu/pull/7365) - Add option `--poa-discovery-retry-bootnodes` for PoA networks to always use bootnodes during peer refresh, not just on first start [#7314](https://github.com/hyperledger/besu/pull/7314) ### Bug fixes