mirror of
https://github.com/vacp2p/linea-besu.git
synced 2026-01-09 21:17:54 -05:00
Blobdb for static data (#5475)
Signed-off-by: Fabio Di Fabio <fabio.difabio@consensys.net>
This commit is contained in:
@@ -12,6 +12,7 @@ and in case a rollback is needed, before installing a previous version, the migr
|
||||
- Unite the tx-pool CLI options under the same Tx Pool Options group in UX. [#5466](https://github.com/hyperledger/besu/issues/5466)
|
||||
- Tidy DEBUG logs by moving engine API full logging to TRACE [#5529](https://github.com/hyperledger/besu/pull/5529)
|
||||
- remove PoW validation if merge is enabled as it is not needed anymore [#5538](https://github.com/hyperledger/besu/pull/5538)
|
||||
- Use BlobDB for blockchain storage to reduce initial sync time and write amplification [#5475](https://github.com/hyperledger/besu/pull/5475)
|
||||
|
||||
### Bug Fixes
|
||||
- check to ensure storage and transactions are not closed prior to reading/writing [#5527](https://github.com/hyperledger/besu/pull/5527)
|
||||
|
||||
@@ -19,7 +19,7 @@ import org.hyperledger.besu.plugin.services.storage.SegmentIdentifier;
|
||||
import org.bouncycastle.util.Arrays;
|
||||
|
||||
public enum KeyValueSegmentIdentifier implements SegmentIdentifier {
|
||||
BLOCKCHAIN(new byte[] {1}),
|
||||
BLOCKCHAIN(new byte[] {1}, true),
|
||||
WORLD_STATE(new byte[] {2}, new int[] {0, 1}),
|
||||
PRIVATE_TRANSACTIONS(new byte[] {3}),
|
||||
PRIVATE_STATE(new byte[] {4}),
|
||||
@@ -44,14 +44,25 @@ public enum KeyValueSegmentIdentifier implements SegmentIdentifier {
|
||||
|
||||
private final byte[] id;
|
||||
private final int[] versionList;
|
||||
private final boolean containsStaticData;
|
||||
|
||||
KeyValueSegmentIdentifier(final byte[] id) {
|
||||
this(id, new int[] {0, 1, 2});
|
||||
}
|
||||
|
||||
KeyValueSegmentIdentifier(final byte[] id, final boolean containsStaticData) {
|
||||
this(id, new int[] {0, 1, 2}, containsStaticData);
|
||||
}
|
||||
|
||||
KeyValueSegmentIdentifier(final byte[] id, final int[] versionList) {
|
||||
this(id, versionList, false);
|
||||
}
|
||||
|
||||
KeyValueSegmentIdentifier(
|
||||
final byte[] id, final int[] versionList, final boolean containsStaticData) {
|
||||
this.id = id;
|
||||
this.versionList = versionList;
|
||||
this.containsStaticData = containsStaticData;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -64,6 +75,11 @@ public enum KeyValueSegmentIdentifier implements SegmentIdentifier {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsStaticData() {
|
||||
return containsStaticData;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean includeInDatabaseVersion(final int version) {
|
||||
return Arrays.contains(versionList, version);
|
||||
|
||||
@@ -69,7 +69,7 @@ Calculated : ${currentHash}
|
||||
tasks.register('checkAPIChanges', FileStateChecker) {
|
||||
description = "Checks that the API for the Plugin-API project does not change without deliberate thought"
|
||||
files = sourceSets.main.allJava.files
|
||||
knownHash = 'V3sh575rrexPv+Ywe8mURT4Z3fREDCDd79PpAISFx8A='
|
||||
knownHash = '5qYaRONxsvjtA3/9OOX4B1GEaOVEXLyU2zBFU0Kpu0E='
|
||||
}
|
||||
check.dependsOn('checkAPIChanges')
|
||||
|
||||
|
||||
@@ -47,4 +47,13 @@ public interface SegmentIdentifier {
|
||||
default boolean includeInDatabaseVersion(final int version) {
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Define if this segment contains data that is never updated, but only added and optionally
|
||||
* deleted. Example is append only data like the blockchain. This information can be used by the
|
||||
* underlying implementation to apply specific optimization for this use case.
|
||||
*
|
||||
* @return true if the segment contains only static data
|
||||
*/
|
||||
boolean containsStaticData();
|
||||
}
|
||||
|
||||
@@ -153,16 +153,7 @@ public abstract class RocksDBColumnarKeyValueStorage
|
||||
.noneMatch(existed -> Arrays.equals(existed, ignorableSegment.getId())))
|
||||
.forEach(trimmedSegments::remove);
|
||||
columnDescriptors =
|
||||
trimmedSegments.stream()
|
||||
.map(
|
||||
segment ->
|
||||
new ColumnFamilyDescriptor(
|
||||
segment.getId(),
|
||||
new ColumnFamilyOptions()
|
||||
.setTtl(0)
|
||||
.setCompressionType(CompressionType.LZ4_COMPRESSION)
|
||||
.setTableFormatConfig(createBlockBasedTableConfig(configuration))))
|
||||
.collect(Collectors.toList());
|
||||
trimmedSegments.stream().map(this::createColumnDescriptor).collect(Collectors.toList());
|
||||
columnDescriptors.add(
|
||||
new ColumnFamilyDescriptor(
|
||||
DEFAULT_COLUMN.getBytes(StandardCharsets.UTF_8),
|
||||
@@ -180,6 +171,24 @@ public abstract class RocksDBColumnarKeyValueStorage
|
||||
}
|
||||
}
|
||||
|
||||
private ColumnFamilyDescriptor createColumnDescriptor(final SegmentIdentifier segment) {
|
||||
final var options =
|
||||
new ColumnFamilyOptions()
|
||||
.setTtl(0)
|
||||
.setCompressionType(CompressionType.LZ4_COMPRESSION)
|
||||
.setTableFormatConfig(createBlockBasedTableConfig(configuration));
|
||||
|
||||
if (segment.containsStaticData()) {
|
||||
options
|
||||
.setEnableBlobFiles(true)
|
||||
.setEnableBlobGarbageCollection(false)
|
||||
.setMinBlobSize(100)
|
||||
.setBlobCompressionType(CompressionType.LZ4_COMPRESSION);
|
||||
}
|
||||
|
||||
return new ColumnFamilyDescriptor(segment.getId(), options);
|
||||
}
|
||||
|
||||
private void setGlobalOptions(final RocksDBConfiguration configuration, final Statistics stats) {
|
||||
options = new DBOptions();
|
||||
options
|
||||
|
||||
@@ -261,14 +261,22 @@ public abstract class RocksDBColumnarKeyValueStorageTest extends AbstractKeyValu
|
||||
public enum TestSegment implements SegmentIdentifier {
|
||||
FOO(new byte[] {1}),
|
||||
BAR(new byte[] {2}),
|
||||
EXPERIMENTAL(new byte[] {3});
|
||||
EXPERIMENTAL(new byte[] {3}),
|
||||
|
||||
STATIC_DATA(new byte[] {4}, true);
|
||||
|
||||
private final byte[] id;
|
||||
private final String nameAsUtf8;
|
||||
private final boolean containsStaticData;
|
||||
|
||||
TestSegment(final byte[] id) {
|
||||
this(id, false);
|
||||
}
|
||||
|
||||
TestSegment(final byte[] id, final boolean containsStaticData) {
|
||||
this.id = id;
|
||||
this.nameAsUtf8 = new String(id, StandardCharsets.UTF_8);
|
||||
this.containsStaticData = containsStaticData;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -280,6 +288,11 @@ public abstract class RocksDBColumnarKeyValueStorageTest extends AbstractKeyValu
|
||||
public byte[] getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean containsStaticData() {
|
||||
return containsStaticData;
|
||||
}
|
||||
}
|
||||
|
||||
protected abstract SegmentedKeyValueStorage<RocksDbSegmentIdentifier> createSegmentedStore()
|
||||
|
||||
Reference in New Issue
Block a user