Skip to content

Commit e8e5dc5

Browse files
jframegconnect
authored andcommitted
Change default for receipt compaction to be enabled (hyperledger#7450)
Signed-off-by: Jason Frame <jason.frame@consensys.net> Signed-off-by: gconnect <agatevureglory@gmail.com>
1 parent 7b7819e commit e8e5dc5

File tree

11 files changed

+49
-54
lines changed

11 files changed

+49
-54
lines changed

CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
### Upcoming Breaking Changes
66

77
### Breaking Changes
8+
- Receipt compaction is enabled by default. It will no longer be possible to downgrade Besu to versions prior to 24.5.1.
89

910
### Additions and Improvements
1011
- Add 'inbound' field to admin_peers JSON-RPC Call [#7461](https://github.com/hyperledger/besu/pull/7461)

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

+2-2
Original file line numberDiff line numberDiff line change
@@ -95,8 +95,8 @@ public class DataStorageOptions implements CLIOptions<DataStorageConfiguration>
9595

9696
@Option(
9797
names = "--receipt-compaction-enabled",
98-
description = "Enables compact storing of receipts (default: ${DEFAULT-VALUE}).",
99-
arity = "1")
98+
description = "Enables compact storing of receipts (default: ${DEFAULT-VALUE})",
99+
fallbackValue = "true")
100100
private Boolean receiptCompactionEnabled = DEFAULT_RECEIPT_COMPACTION_ENABLED;
101101

102102
@CommandLine.ArgGroup(validate = false)

besu/src/test/java/org/hyperledger/besu/cli/options/stable/DataStorageOptionsTest.java

+10-4
Original file line numberDiff line numberDiff line change
@@ -126,22 +126,28 @@ public void bonsaiCodeUsingCodeHashEnabledCanBeDisabled() {
126126
"false");
127127
}
128128

129+
@Test
130+
public void receiptCompactionCanBeEnabledWithImplicitTrueValue() {
131+
internalTestSuccess(
132+
dataStorageConfiguration ->
133+
assertThat(dataStorageConfiguration.getReceiptCompactionEnabled()).isEqualTo(true),
134+
"--receipt-compaction-enabled");
135+
}
136+
129137
@Test
130138
public void receiptCompactionCanBeEnabled() {
131139
internalTestSuccess(
132140
dataStorageConfiguration ->
133141
assertThat(dataStorageConfiguration.getReceiptCompactionEnabled()).isEqualTo(true),
134-
"--receipt-compaction-enabled",
135-
"true");
142+
"--receipt-compaction-enabled=true");
136143
}
137144

138145
@Test
139146
public void receiptCompactionCanBeDisabled() {
140147
internalTestSuccess(
141148
dataStorageConfiguration ->
142149
assertThat(dataStorageConfiguration.getReceiptCompactionEnabled()).isEqualTo(false),
143-
"--receipt-compaction-enabled",
144-
"false");
150+
"--receipt-compaction-enabled=false");
145151
}
146152

147153
@Override

ethereum/core/src/main/java/org/hyperledger/besu/ethereum/worldstate/DataStorageConfiguration.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ public interface DataStorageConfiguration {
2626
boolean DEFAULT_BONSAI_LIMIT_TRIE_LOGS_ENABLED = true;
2727
long MINIMUM_BONSAI_TRIE_LOG_RETENTION_LIMIT = DEFAULT_BONSAI_MAX_LAYERS_TO_LOAD;
2828
int DEFAULT_BONSAI_TRIE_LOG_PRUNING_WINDOW_SIZE = 5_000;
29-
boolean DEFAULT_RECEIPT_COMPACTION_ENABLED = false;
29+
boolean DEFAULT_RECEIPT_COMPACTION_ENABLED = true;
3030

3131
DataStorageConfiguration DEFAULT_CONFIG =
3232
ImmutableDataStorageConfiguration.builder()

plugins/rocksdb/src/main/java/org/hyperledger/besu/plugin/services/storage/rocksdb/RocksDBKeyValuePrivacyStorageFactory.java

+8-6
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,7 @@ public class RocksDBKeyValuePrivacyStorageFactory implements PrivacyKeyValueStor
4545
LoggerFactory.getLogger(RocksDBKeyValuePrivacyStorageFactory.class);
4646
private static final Set<PrivacyVersionedStorageFormat> SUPPORTED_VERSIONS =
4747
EnumSet.of(
48-
PrivacyVersionedStorageFormat.FOREST_WITH_VARIABLES,
4948
PrivacyVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION,
50-
PrivacyVersionedStorageFormat.BONSAI_WITH_VARIABLES,
5149
PrivacyVersionedStorageFormat.BONSAI_WITH_RECEIPT_COMPACTION);
5250
private static final String PRIVATE_DATABASE_PATH = "private";
5351
private final RocksDBKeyValueStorageFactory publicFactory;
@@ -230,8 +228,12 @@ private Optional<DatabaseMetadata> handleVersionUpgrade(
230228
// reflect the change to the runtime version, and return it.
231229

232230
// Besu supports both formats of receipts so no upgrade is needed other than updating metadata
233-
if (runtimeVersion == PrivacyVersionedStorageFormat.BONSAI_WITH_RECEIPT_COMPACTION
234-
|| runtimeVersion == PrivacyVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION) {
231+
final VersionedStorageFormat existingVersionedStorageFormat =
232+
existingPrivacyMetadata.getVersionedStorageFormat();
233+
if ((existingVersionedStorageFormat == PrivacyVersionedStorageFormat.BONSAI_WITH_VARIABLES
234+
&& runtimeVersion == PrivacyVersionedStorageFormat.BONSAI_WITH_RECEIPT_COMPACTION)
235+
|| (existingVersionedStorageFormat == PrivacyVersionedStorageFormat.FOREST_WITH_VARIABLES
236+
&& runtimeVersion == PrivacyVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION)) {
235237
final DatabaseMetadata metadata = new DatabaseMetadata(runtimeVersion);
236238
try {
237239
metadata.writeToDirectory(dataDir);
@@ -247,8 +249,8 @@ private Optional<DatabaseMetadata> handleVersionUpgrade(
247249
"Database unsafe upgrade detect: DB at %s is %s with version %s but version %s is expected. "
248250
+ "Please check your config and review release notes for supported upgrade procedures.",
249251
dataDir,
250-
existingPrivacyMetadata.getVersionedStorageFormat().getFormat().name(),
251-
existingPrivacyMetadata.getVersionedStorageFormat().getVersion(),
252+
existingVersionedStorageFormat.getFormat().name(),
253+
existingVersionedStorageFormat.getVersion(),
252254
runtimeVersion.getVersion());
253255

254256
throw new StorageException(error);

plugins/rocksdb/src/main/java/org/hyperledger/besu/plugin/services/storage/rocksdb/RocksDBKeyValueStorageFactory.java

+9-9
Original file line numberDiff line numberDiff line change
@@ -57,11 +57,7 @@ public class RocksDBKeyValueStorageFactory implements KeyValueStorageFactory {
5757

5858
private static final Logger LOG = LoggerFactory.getLogger(RocksDBKeyValueStorageFactory.class);
5959
private static final EnumSet<BaseVersionedStorageFormat> SUPPORTED_VERSIONED_FORMATS =
60-
EnumSet.of(
61-
FOREST_WITH_VARIABLES,
62-
FOREST_WITH_RECEIPT_COMPACTION,
63-
BONSAI_WITH_VARIABLES,
64-
BONSAI_WITH_RECEIPT_COMPACTION);
60+
EnumSet.of(FOREST_WITH_RECEIPT_COMPACTION, BONSAI_WITH_RECEIPT_COMPACTION);
6561
private static final String NAME = "rocksdb";
6662
private final RocksDBMetricsFactory rocksDBMetricsFactory;
6763
private DatabaseMetadata databaseMetadata;
@@ -329,8 +325,12 @@ private Optional<DatabaseMetadata> handleVersionUpgrade(
329325
// reflect the change to the runtime version, and return it.
330326

331327
// Besu supports both formats of receipts so no upgrade is needed other than updating metadata
332-
if (runtimeVersion == BONSAI_WITH_RECEIPT_COMPACTION
333-
|| runtimeVersion == FOREST_WITH_RECEIPT_COMPACTION) {
328+
final VersionedStorageFormat existingVersionedStorageFormat =
329+
existingMetadata.getVersionedStorageFormat();
330+
if ((existingVersionedStorageFormat == BONSAI_WITH_VARIABLES
331+
&& runtimeVersion == BONSAI_WITH_RECEIPT_COMPACTION)
332+
|| (existingVersionedStorageFormat == FOREST_WITH_VARIABLES
333+
&& runtimeVersion == FOREST_WITH_RECEIPT_COMPACTION)) {
334334
final DatabaseMetadata metadata = new DatabaseMetadata(runtimeVersion);
335335
try {
336336
metadata.writeToDirectory(dataDir);
@@ -346,8 +346,8 @@ private Optional<DatabaseMetadata> handleVersionUpgrade(
346346
"Database unsafe downgrade detect: DB at %s is %s with version %s but version %s is expected. "
347347
+ "Please check your config and review release notes for supported downgrade procedures.",
348348
dataDir,
349-
existingMetadata.getVersionedStorageFormat().getFormat().name(),
350-
existingMetadata.getVersionedStorageFormat().getVersion(),
349+
existingVersionedStorageFormat.getFormat().name(),
350+
existingVersionedStorageFormat.getVersion(),
351351
runtimeVersion.getVersion());
352352

353353
throw new StorageException(error);

plugins/rocksdb/src/main/java/org/hyperledger/besu/plugin/services/storage/rocksdb/configuration/BaseVersionedStorageFormat.java

+2-8
Original file line numberDiff line numberDiff line change
@@ -63,14 +63,8 @@ public enum BaseVersionedStorageFormat implements VersionedStorageFormat {
6363
public static BaseVersionedStorageFormat defaultForNewDB(
6464
final DataStorageConfiguration configuration) {
6565
return switch (configuration.getDatabaseFormat()) {
66-
case FOREST ->
67-
configuration.getReceiptCompactionEnabled()
68-
? FOREST_WITH_RECEIPT_COMPACTION
69-
: FOREST_WITH_VARIABLES;
70-
case BONSAI ->
71-
configuration.getReceiptCompactionEnabled()
72-
? BONSAI_WITH_RECEIPT_COMPACTION
73-
: BONSAI_WITH_VARIABLES;
66+
case FOREST -> FOREST_WITH_RECEIPT_COMPACTION;
67+
case BONSAI -> BONSAI_WITH_RECEIPT_COMPACTION;
7468
};
7569
}
7670

plugins/rocksdb/src/main/java/org/hyperledger/besu/plugin/services/storage/rocksdb/configuration/DatabaseMetadata.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,7 @@ public static DatabaseMetadata defaultForNewDb(final BesuConfiguration besuConfi
7474
* @return the metadata to use for new db
7575
*/
7676
public static DatabaseMetadata defaultForNewPrivateDb() {
77-
return new DatabaseMetadata(PrivacyVersionedStorageFormat.FOREST_WITH_VARIABLES);
77+
return new DatabaseMetadata(PrivacyVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION);
7878
}
7979

8080
/**

plugins/rocksdb/src/main/java/org/hyperledger/besu/plugin/services/storage/rocksdb/configuration/PrivacyVersionedStorageFormat.java

+3-9
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ public enum PrivacyVersionedStorageFormat implements VersionedStorageFormat {
3232
* Current Forest version, with receipts using compaction, in order to make Receipts use less disk
3333
* space
3434
*/
35-
FOREST_WITH_RECEIPT_COMPACTION(BaseVersionedStorageFormat.FOREST_WITH_VARIABLES, 2),
35+
FOREST_WITH_RECEIPT_COMPACTION(BaseVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION, 2),
3636
/** Original Bonsai version, not used since replace by BONSAI_WITH_VARIABLES */
3737
BONSAI_ORIGINAL(BaseVersionedStorageFormat.BONSAI_ORIGINAL, 1),
3838
/**
@@ -64,14 +64,8 @@ public enum PrivacyVersionedStorageFormat implements VersionedStorageFormat {
6464
public static VersionedStorageFormat defaultForNewDB(
6565
final DataStorageConfiguration configuration) {
6666
return switch (configuration.getDatabaseFormat()) {
67-
case FOREST ->
68-
configuration.getReceiptCompactionEnabled()
69-
? FOREST_WITH_RECEIPT_COMPACTION
70-
: FOREST_WITH_VARIABLES;
71-
case BONSAI ->
72-
configuration.getReceiptCompactionEnabled()
73-
? BONSAI_WITH_RECEIPT_COMPACTION
74-
: BONSAI_WITH_VARIABLES;
67+
case FOREST -> FOREST_WITH_RECEIPT_COMPACTION;
68+
case BONSAI -> BONSAI_WITH_RECEIPT_COMPACTION;
7569
};
7670
}
7771

plugins/rocksdb/src/test/java/org/hyperledger/besu/plugin/services/storage/rocksdb/RocksDBKeyValuePrivacyStorageFactoryTest.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public void shouldDetectVersion1MetadataIfPresent() throws Exception {
7777
try (final var storage = storageFactory.create(segment, commonConfiguration, metricsSystem)) {
7878

7979
assertThat(DatabaseMetadata.lookUpFrom(tempDataDir).getVersionedStorageFormat())
80-
.isEqualTo(PrivacyVersionedStorageFormat.FOREST_WITH_VARIABLES);
80+
.isEqualTo(PrivacyVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION);
8181
}
8282
}
8383

@@ -97,7 +97,7 @@ public void shouldCreateCorrectMetadataFileForLatestVersion() throws Exception {
9797
// Side effect is creation of the Metadata version file
9898
try (final var storage = storageFactory.create(segment, commonConfiguration, metricsSystem)) {
9999
assertThat(DatabaseMetadata.lookUpFrom(tempDataDir).getVersionedStorageFormat())
100-
.isEqualTo(PrivacyVersionedStorageFormat.FOREST_WITH_VARIABLES);
100+
.isEqualTo(PrivacyVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION);
101101
}
102102
}
103103

@@ -116,8 +116,8 @@ public void shouldUpdateCorrectMetadataFileForLatestVersion(
116116
try (final var storage = storageFactory.create(segment, commonConfiguration, metricsSystem)) {
117117
final BaseVersionedStorageFormat expectedBaseVersion =
118118
dataStorageFormat == BONSAI
119-
? BaseVersionedStorageFormat.BONSAI_WITH_VARIABLES
120-
: BaseVersionedStorageFormat.FOREST_WITH_VARIABLES;
119+
? BaseVersionedStorageFormat.BONSAI_WITH_RECEIPT_COMPACTION
120+
: BaseVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION;
121121
assertThat(DatabaseMetadata.lookUpFrom(tempDataDir).getVersionedStorageFormat())
122122
.isEqualTo(expectedBaseVersion);
123123
}
@@ -130,8 +130,8 @@ public void shouldUpdateCorrectMetadataFileForLatestVersion(
130130
privacyStorageFactory.create(segment, commonConfiguration, metricsSystem)) {
131131
final PrivacyVersionedStorageFormat expectedPrivacyVersion =
132132
dataStorageFormat == BONSAI
133-
? PrivacyVersionedStorageFormat.BONSAI_WITH_VARIABLES
134-
: PrivacyVersionedStorageFormat.FOREST_WITH_VARIABLES;
133+
? PrivacyVersionedStorageFormat.BONSAI_WITH_RECEIPT_COMPACTION
134+
: PrivacyVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION;
135135
assertThat(DatabaseMetadata.lookUpFrom(tempDataDir).getVersionedStorageFormat())
136136
.isEqualTo(expectedPrivacyVersion);
137137
}
@@ -145,7 +145,6 @@ public void shouldUpdateCorrectMetadataFileForLatestVersionWithReceiptCompaction
145145
final Path tempDataDir = temporaryFolder.resolve("data");
146146
final Path tempDatabaseDir = temporaryFolder.resolve("db");
147147
mockCommonConfiguration(tempDataDir, tempDatabaseDir, dataStorageFormat);
148-
when(dataStorageConfiguration.getReceiptCompactionEnabled()).thenReturn(true);
149148

150149
final RocksDBKeyValueStorageFactory storageFactory =
151150
new RocksDBKeyValueStorageFactory(

plugins/rocksdb/src/test/java/org/hyperledger/besu/plugin/services/storage/rocksdb/RocksDBKeyValueStorageFactoryTest.java

+6-7
Original file line numberDiff line numberDiff line change
@@ -76,8 +76,8 @@ public void shouldCreateCorrectMetadataFileForLatestVersionForNewDb(
7676
// Side effect is creation of the Metadata version file
7777
final BaseVersionedStorageFormat expectedVersion =
7878
dataStorageFormat == BONSAI
79-
? BaseVersionedStorageFormat.BONSAI_WITH_VARIABLES
80-
: BaseVersionedStorageFormat.FOREST_WITH_VARIABLES;
79+
? BaseVersionedStorageFormat.BONSAI_WITH_RECEIPT_COMPACTION
80+
: BaseVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION;
8181
assertThat(DatabaseMetadata.lookUpFrom(tempDataDir).getVersionedStorageFormat())
8282
.isEqualTo(expectedVersion);
8383
}
@@ -90,7 +90,6 @@ public void shouldCreateCorrectMetadataFileForLatestVersionForNewDbWithReceiptCo
9090
final Path tempDataDir = temporaryFolder.resolve("data");
9191
final Path tempDatabaseDir = temporaryFolder.resolve("db");
9292
mockCommonConfiguration(tempDataDir, tempDatabaseDir, dataStorageFormat);
93-
when(dataStorageConfiguration.getReceiptCompactionEnabled()).thenReturn(true);
9493

9594
final RocksDBKeyValueStorageFactory storageFactory =
9695
new RocksDBKeyValueStorageFactory(
@@ -129,7 +128,7 @@ public void shouldFailIfDbExistsAndNoMetadataFileFound() throws Exception {
129128
}
130129

131130
@Test
132-
public void shouldDetectCorrectMetadataV1() throws Exception {
131+
public void shouldDetectCorrectMetadataV1AndUpgrade() throws Exception {
133132
final Path tempDataDir = temporaryFolder.resolve("data");
134133
final Path tempDatabaseDir = temporaryFolder.resolve("db");
135134
Files.createDirectories(tempDataDir);
@@ -143,7 +142,7 @@ public void shouldDetectCorrectMetadataV1() throws Exception {
143142

144143
try (final var storage = storageFactory.create(segment, commonConfiguration, metricsSystem)) {
145144
assertThat(DatabaseMetadata.lookUpFrom(tempDataDir).getVersionedStorageFormat())
146-
.isEqualTo(BaseVersionedStorageFormat.BONSAI_WITH_VARIABLES);
145+
.isEqualTo(BaseVersionedStorageFormat.BONSAI_WITH_RECEIPT_COMPACTION);
147146
assertThat(storageFactory.isSegmentIsolationSupported()).isTrue();
148147
}
149148
}
@@ -240,7 +239,7 @@ public void shouldDetectCorrectMetadataV2AndSetSegmentationFieldDuringCreation()
240239
() -> rocksDbConfiguration, segments, RocksDBMetricsFactory.PUBLIC_ROCKS_DB_METRICS);
241240
try (final var storage = storageFactory.create(segment, commonConfiguration, metricsSystem)) {
242241
assertThat(DatabaseMetadata.lookUpFrom(tempDataDir).getVersionedStorageFormat())
243-
.isEqualTo(BaseVersionedStorageFormat.FOREST_WITH_VARIABLES);
242+
.isEqualTo(BaseVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION);
244243
assertThatCode(storageFactory::isSegmentIsolationSupported).doesNotThrowAnyException();
245244
}
246245
}
@@ -299,7 +298,7 @@ public void shouldCreateDBCorrectlyIfSymlink() throws Exception {
299298
// created correctly
300299
try (final var storage = storageFactory.create(segment, commonConfiguration, metricsSystem)) {
301300
assertThat(DatabaseMetadata.lookUpFrom(tempRealDataDir).getVersionedStorageFormat())
302-
.isEqualTo(BaseVersionedStorageFormat.FOREST_WITH_VARIABLES);
301+
.isEqualTo(BaseVersionedStorageFormat.FOREST_WITH_RECEIPT_COMPACTION);
303302
}
304303
}
305304

0 commit comments

Comments
 (0)