Skip to content

Commit b90d0ed

Browse files
authored
Reuse --bonsai-historical-block-limit for limit trie logs feature (#6445)
Renames and tidy-up Add change log for feature --------- Signed-off-by: Simon Dudley <simon.dudley@consensys.net>
1 parent 3fc3fb1 commit b90d0ed

File tree

11 files changed

+356
-259
lines changed

11 files changed

+356
-259
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,8 @@
3535
- Upgrade Mockito [#6397](https://github.com/hyperledger/besu/pull/6397)
3636
- Upgrade `tech.pegasys.discovery:discovery` [#6414](https://github.com/hyperledger/besu/pull/6414)
3737
- Options to tune the max allowed time that can be spent selecting transactions during block creation are now stable [#6423](https://github.com/hyperledger/besu/pull/6423)
38+
- Introduce `--Xbonsai-limit-trie-logs-enabled` experimental feature which by default will only retain the latest 512 trie logs, saving about 3GB per week in database growth [#5390](https://github.com/hyperledger/besu/issues/5390)
39+
- Introduce `besu storage x-trie-log prune` experimental offline subcommand which will prune all redundant trie logs except the latest 512 [#6303](https://github.com/hyperledger/besu/pull/6303)
3840

3941
### Bug fixes
4042
- INTERNAL_ERROR from `eth_estimateGas` JSON/RPC calls [#6344](https://github.com/hyperledger/besu/issues/6344)

besu/src/main/java/org/hyperledger/besu/cli/BesuCommand.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3555,12 +3555,12 @@ private String generateConfigurationOverview() {
35553555
builder.setHighSpecEnabled();
35563556
}
35573557

3558-
if (dataStorageOptions.toDomainObject().getUnstable().getBonsaiTrieLogPruningEnabled()) {
3559-
builder.setTrieLogPruningEnabled();
3560-
builder.setTrieLogRetentionThreshold(
3561-
dataStorageOptions.toDomainObject().getUnstable().getBonsaiTrieLogRetentionThreshold());
3562-
builder.setTrieLogPruningLimit(
3563-
dataStorageOptions.toDomainObject().getUnstable().getBonsaiTrieLogPruningLimit());
3558+
if (dataStorageOptions.toDomainObject().getUnstable().getBonsaiLimitTrieLogsEnabled()) {
3559+
builder.setLimitTrieLogsEnabled();
3560+
builder.setTrieLogRetentionLimit(
3561+
dataStorageOptions.toDomainObject().getBonsaiMaxLayersToLoad());
3562+
builder.setTrieLogsPruningWindowSize(
3563+
dataStorageOptions.toDomainObject().getUnstable().getBonsaiTrieLogPruningWindowSize());
35643564
}
35653565

35663566
builder.setTxPoolImplementation(buildTransactionPoolConfiguration().getTxPoolImplementation());

besu/src/main/java/org/hyperledger/besu/cli/ConfigurationOverviewBuilder.java

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,9 @@ public class ConfigurationOverviewBuilder {
5252
private Collection<String> engineApis;
5353
private String engineJwtFilePath;
5454
private boolean isHighSpec = false;
55-
private boolean isTrieLogPruningEnabled = false;
56-
private long trieLogRetentionThreshold = 0;
57-
private Integer trieLogPruningLimit = null;
55+
private boolean isBonsaiLimitTrieLogsEnabled = false;
56+
private long trieLogRetentionLimit = 0;
57+
private Integer trieLogsPruningWindowSize = null;
5858
private TransactionPoolConfiguration.Implementation txPoolImplementation;
5959
private EvmConfiguration.WorldUpdaterMode worldStateUpdateMode;
6060
private Map<String, String> environment;
@@ -199,34 +199,34 @@ public ConfigurationOverviewBuilder setHighSpecEnabled() {
199199
}
200200

201201
/**
202-
* Sets trie log pruning enabled
202+
* Sets limit trie logs enabled
203203
*
204204
* @return the builder
205205
*/
206-
public ConfigurationOverviewBuilder setTrieLogPruningEnabled() {
207-
isTrieLogPruningEnabled = true;
206+
public ConfigurationOverviewBuilder setLimitTrieLogsEnabled() {
207+
isBonsaiLimitTrieLogsEnabled = true;
208208
return this;
209209
}
210210

211211
/**
212-
* Sets trie log retention threshold
212+
* Sets trie log retention limit
213213
*
214-
* @param threshold the number of blocks to retain trie logs for
214+
* @param limit the number of blocks to retain trie logs for
215215
* @return the builder
216216
*/
217-
public ConfigurationOverviewBuilder setTrieLogRetentionThreshold(final long threshold) {
218-
trieLogRetentionThreshold = threshold;
217+
public ConfigurationOverviewBuilder setTrieLogRetentionLimit(final long limit) {
218+
trieLogRetentionLimit = limit;
219219
return this;
220220
}
221221

222222
/**
223-
* Sets trie log pruning limit
223+
* Sets trie logs pruning window size
224224
*
225-
* @param limit the max number of blocks to load and prune trie logs for at startup
225+
* @param size the max number of blocks to load and prune trie logs for at startup
226226
* @return the builder
227227
*/
228-
public ConfigurationOverviewBuilder setTrieLogPruningLimit(final int limit) {
229-
trieLogPruningLimit = limit;
228+
public ConfigurationOverviewBuilder setTrieLogsPruningWindowSize(final int size) {
229+
trieLogsPruningWindowSize = size;
230230
return this;
231231
}
232232

@@ -339,13 +339,13 @@ public String build() {
339339

340340
lines.add("Using " + worldStateUpdateMode + " worldstate update mode");
341341

342-
if (isTrieLogPruningEnabled) {
342+
if (isBonsaiLimitTrieLogsEnabled) {
343343
final StringBuilder trieLogPruningString = new StringBuilder();
344344
trieLogPruningString
345-
.append("Trie log pruning enabled: retention: ")
346-
.append(trieLogRetentionThreshold);
347-
if (trieLogPruningLimit != null) {
348-
trieLogPruningString.append("; prune limit: ").append(trieLogPruningLimit);
345+
.append("Limit trie logs enabled: retention: ")
346+
.append(trieLogRetentionLimit);
347+
if (trieLogsPruningWindowSize != null) {
348+
trieLogPruningString.append("; prune window: ").append(trieLogsPruningWindowSize);
349349
}
350350
lines.add(trieLogPruningString.toString());
351351
}

besu/src/main/java/org/hyperledger/besu/cli/options/stable/DataStorageOptions.java

Lines changed: 42 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,9 @@
1717
package org.hyperledger.besu.cli.options.stable;
1818

1919
import static org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration.DEFAULT_BONSAI_MAX_LAYERS_TO_LOAD;
20-
import static org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration.Unstable.DEFAULT_BONSAI_TRIE_LOG_PRUNING_ENABLED;
21-
import static org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration.Unstable.DEFAULT_BONSAI_TRIE_LOG_PRUNING_LIMIT;
22-
import static org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration.Unstable.DEFAULT_BONSAI_TRIE_LOG_RETENTION_THRESHOLD;
23-
import static org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration.Unstable.MINIMUM_BONSAI_TRIE_LOG_RETENTION_THRESHOLD;
20+
import static org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration.Unstable.DEFAULT_BONSAI_LIMIT_TRIE_LOGS_ENABLED;
21+
import static org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration.Unstable.DEFAULT_BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE;
22+
import static org.hyperledger.besu.ethereum.worldstate.DataStorageConfiguration.Unstable.MINIMUM_BONSAI_TRIE_LOG_RETENTION_LIMIT;
2423

2524
import org.hyperledger.besu.cli.options.CLIOptions;
2625
import org.hyperledger.besu.cli.util.CommandLineUtils;
@@ -39,7 +38,8 @@ public class DataStorageOptions implements CLIOptions<DataStorageConfiguration>
3938

4039
private static final String DATA_STORAGE_FORMAT = "--data-storage-format";
4140

42-
private static final String BONSAI_STORAGE_FORMAT_MAX_LAYERS_TO_LOAD =
41+
/** The maximum number of historical layers to load. */
42+
public static final String BONSAI_STORAGE_FORMAT_MAX_LAYERS_TO_LOAD =
4343
"--bonsai-historical-block-limit";
4444

4545
// Use Bonsai DB
@@ -54,39 +54,37 @@ public class DataStorageOptions implements CLIOptions<DataStorageConfiguration>
5454
names = {BONSAI_STORAGE_FORMAT_MAX_LAYERS_TO_LOAD, "--bonsai-maximum-back-layers-to-load"},
5555
paramLabel = "<LONG>",
5656
description =
57-
"Limit of historical layers that can be loaded with BONSAI (default: ${DEFAULT-VALUE}).",
57+
"Limit of historical layers that can be loaded with BONSAI (default: ${DEFAULT-VALUE}). When using "
58+
+ Unstable.BONSAI_LIMIT_TRIE_LOGS_ENABLED
59+
+ " it will also be used as the number of layers of trie logs to retain.",
5860
arity = "1")
5961
private Long bonsaiMaxLayersToLoad = DEFAULT_BONSAI_MAX_LAYERS_TO_LOAD;
6062

6163
@CommandLine.ArgGroup(validate = false)
6264
private final DataStorageOptions.Unstable unstableOptions = new Unstable();
6365

64-
static class Unstable {
66+
/** The unstable options for data storage. */
67+
public static class Unstable {
6568
private static final String BONSAI_LIMIT_TRIE_LOGS_ENABLED =
6669
"--Xbonsai-limit-trie-logs-enabled";
67-
private static final String BONSAI_TRIE_LOGS_RETENTION_THRESHOLD =
68-
"--Xbonsai-trie-logs-retention-threshold";
69-
private static final String BONSAI_TRIE_LOG_PRUNING_LIMIT = "--Xbonsai-trie-logs-pruning-limit";
7070

71-
@CommandLine.Option(
72-
hidden = true,
73-
names = {BONSAI_LIMIT_TRIE_LOGS_ENABLED},
74-
description = "Enable trie log pruning. (default: ${DEFAULT-VALUE})")
75-
private boolean bonsaiTrieLogPruningEnabled = DEFAULT_BONSAI_TRIE_LOG_PRUNING_ENABLED;
71+
/** The bonsai trie logs pruning window size. */
72+
public static final String BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE =
73+
"--Xbonsai-trie-logs-pruning-window-size";
7674

7775
@CommandLine.Option(
7876
hidden = true,
79-
names = {BONSAI_TRIE_LOGS_RETENTION_THRESHOLD},
77+
names = {BONSAI_LIMIT_TRIE_LOGS_ENABLED},
8078
description =
81-
"The number of blocks for which to retain trie logs. (default: ${DEFAULT-VALUE})")
82-
private long bonsaiTrieLogRetentionThreshold = DEFAULT_BONSAI_TRIE_LOG_RETENTION_THRESHOLD;
79+
"Limit the number of trie logs that are retained. (default: ${DEFAULT-VALUE})")
80+
private boolean bonsaiLimitTrieLogsEnabled = DEFAULT_BONSAI_LIMIT_TRIE_LOGS_ENABLED;
8381

8482
@CommandLine.Option(
8583
hidden = true,
86-
names = {BONSAI_TRIE_LOG_PRUNING_LIMIT},
84+
names = {BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE},
8785
description =
8886
"The max number of blocks to load and prune trie logs for at startup. (default: ${DEFAULT-VALUE})")
89-
private int bonsaiTrieLogPruningLimit = DEFAULT_BONSAI_TRIE_LOG_PRUNING_LIMIT;
87+
private int bonsaiTrieLogPruningWindowSize = DEFAULT_BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE;
9088
}
9189
/**
9290
* Create data storage options.
@@ -103,21 +101,31 @@ public static DataStorageOptions create() {
103101
* @param commandLine the full commandLine to check all the options specified by the user
104102
*/
105103
public void validate(final CommandLine commandLine) {
106-
if (unstableOptions.bonsaiTrieLogPruningEnabled) {
107-
if (unstableOptions.bonsaiTrieLogRetentionThreshold
108-
< MINIMUM_BONSAI_TRIE_LOG_RETENTION_THRESHOLD) {
104+
if (unstableOptions.bonsaiLimitTrieLogsEnabled) {
105+
if (bonsaiMaxLayersToLoad < MINIMUM_BONSAI_TRIE_LOG_RETENTION_LIMIT) {
106+
throw new CommandLine.ParameterException(
107+
commandLine,
108+
String.format(
109+
BONSAI_STORAGE_FORMAT_MAX_LAYERS_TO_LOAD + " minimum value is %d",
110+
MINIMUM_BONSAI_TRIE_LOG_RETENTION_LIMIT));
111+
}
112+
if (unstableOptions.bonsaiTrieLogPruningWindowSize <= 0) {
109113
throw new CommandLine.ParameterException(
110114
commandLine,
111115
String.format(
112-
"--Xbonsai-trie-log-retention-threshold minimum value is %d",
113-
MINIMUM_BONSAI_TRIE_LOG_RETENTION_THRESHOLD));
116+
Unstable.BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE + "=%d must be greater than 0",
117+
unstableOptions.bonsaiTrieLogPruningWindowSize));
114118
}
115-
if (unstableOptions.bonsaiTrieLogPruningLimit <= 0) {
119+
if (unstableOptions.bonsaiTrieLogPruningWindowSize <= bonsaiMaxLayersToLoad) {
116120
throw new CommandLine.ParameterException(
117121
commandLine,
118122
String.format(
119-
"--Xbonsai-trie-log-pruning-limit=%d must be greater than 0",
120-
unstableOptions.bonsaiTrieLogPruningLimit));
123+
Unstable.BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE
124+
+ "=%d must be greater than "
125+
+ BONSAI_STORAGE_FORMAT_MAX_LAYERS_TO_LOAD
126+
+ "=%d",
127+
unstableOptions.bonsaiTrieLogPruningWindowSize,
128+
bonsaiMaxLayersToLoad));
121129
}
122130
}
123131
}
@@ -126,12 +134,10 @@ static DataStorageOptions fromConfig(final DataStorageConfiguration domainObject
126134
final DataStorageOptions dataStorageOptions = DataStorageOptions.create();
127135
dataStorageOptions.dataStorageFormat = domainObject.getDataStorageFormat();
128136
dataStorageOptions.bonsaiMaxLayersToLoad = domainObject.getBonsaiMaxLayersToLoad();
129-
dataStorageOptions.unstableOptions.bonsaiTrieLogPruningEnabled =
130-
domainObject.getUnstable().getBonsaiTrieLogPruningEnabled();
131-
dataStorageOptions.unstableOptions.bonsaiTrieLogRetentionThreshold =
132-
domainObject.getUnstable().getBonsaiTrieLogRetentionThreshold();
133-
dataStorageOptions.unstableOptions.bonsaiTrieLogPruningLimit =
134-
domainObject.getUnstable().getBonsaiTrieLogPruningLimit();
137+
dataStorageOptions.unstableOptions.bonsaiLimitTrieLogsEnabled =
138+
domainObject.getUnstable().getBonsaiLimitTrieLogsEnabled();
139+
dataStorageOptions.unstableOptions.bonsaiTrieLogPruningWindowSize =
140+
domainObject.getUnstable().getBonsaiTrieLogPruningWindowSize();
135141

136142
return dataStorageOptions;
137143
}
@@ -143,9 +149,8 @@ public DataStorageConfiguration toDomainObject() {
143149
.bonsaiMaxLayersToLoad(bonsaiMaxLayersToLoad)
144150
.unstable(
145151
ImmutableDataStorageConfiguration.Unstable.builder()
146-
.bonsaiTrieLogPruningEnabled(unstableOptions.bonsaiTrieLogPruningEnabled)
147-
.bonsaiTrieLogRetentionThreshold(unstableOptions.bonsaiTrieLogRetentionThreshold)
148-
.bonsaiTrieLogPruningLimit(unstableOptions.bonsaiTrieLogPruningLimit)
152+
.bonsaiLimitTrieLogsEnabled(unstableOptions.bonsaiLimitTrieLogsEnabled)
153+
.bonsaiTrieLogPruningWindowSize(unstableOptions.bonsaiTrieLogPruningWindowSize)
149154
.build())
150155
.build();
151156
}

0 commit comments

Comments
 (0)