Skip to content

Commit 5a53848

Browse files
authored
feat: 21597 New state snapshot format (#22327)
Signed-off-by: Ivan Malygin <[email protected]>
1 parent dccae64 commit 5a53848

File tree

96 files changed

+822
-1794
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

96 files changed

+822
-1794
lines changed

hedera-node/hedera-app/src/main/java/com/hedera/node/app/Hedera.java

Lines changed: 35 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,7 @@
110110
import com.hedera.node.config.types.StreamMode;
111111
import com.hedera.node.internal.network.Network;
112112
import com.hedera.pbj.runtime.io.buffer.Bytes;
113+
import com.swirlds.base.time.Time;
113114
import com.swirlds.common.notification.NotificationEngine;
114115
import com.swirlds.config.api.Configuration;
115116
import com.swirlds.metrics.api.Metrics;
@@ -126,10 +127,11 @@
126127
import com.swirlds.state.MerkleNodeState;
127128
import com.swirlds.state.State;
128129
import com.swirlds.state.StateChangeListener;
130+
import com.swirlds.state.StateLifecycleManager;
131+
import com.swirlds.state.merkle.StateLifecycleManagerImpl;
129132
import com.swirlds.state.merkle.VirtualMapState;
130133
import com.swirlds.state.spi.CommittableWritableStates;
131134
import com.swirlds.state.spi.WritableSingletonStateBase;
132-
import com.swirlds.virtualmap.VirtualMap;
133135
import edu.umd.cs.findbugs.annotations.NonNull;
134136
import edu.umd.cs.findbugs.annotations.Nullable;
135137
import java.nio.charset.Charset;
@@ -146,7 +148,6 @@
146148
import java.util.function.BiConsumer;
147149
import java.util.function.BiPredicate;
148150
import java.util.function.Consumer;
149-
import java.util.function.Function;
150151
import java.util.function.Supplier;
151152
import org.apache.logging.log4j.LogManager;
152153
import org.apache.logging.log4j.Logger;
@@ -382,7 +383,10 @@ public final class Hedera implements SwirldMain<MerkleNodeState>, AppContext.Gos
382383
private Supplier<Network> genesisNetworkSupplier;
383384

384385
@NonNull
385-
private StoreMetricsServiceImpl storeMetricsService;
386+
private final StoreMetricsServiceImpl storeMetricsService;
387+
388+
@NonNull
389+
private final StateLifecycleManager stateLifecycleManager;
386390

387391
private boolean onceOnlyServiceInitializationPostDaggerHasHappened = false;
388392

@@ -433,7 +437,9 @@ BlockHashSigner apply(
433437
* @param hintsServiceFactory the factory for the hinTS service
434438
* @param historyServiceFactory the factory for the history service
435439
* @param blockHashSignerFactory the factory for the block hash signer
440+
* @param configuration the configuration to use for the node
436441
* @param metrics the metrics object to use for reporting
442+
* @param time the time source to use for measuring time
437443
* @param baseSupplier the base supplier to create a new state with
438444
*/
439445
public Hedera(
@@ -445,7 +451,9 @@ public Hedera(
445451
@NonNull final HintsServiceFactory hintsServiceFactory,
446452
@NonNull final HistoryServiceFactory historyServiceFactory,
447453
@NonNull final BlockHashSignerFactory blockHashSignerFactory,
454+
@NonNull final Configuration configuration,
448455
@NonNull final Metrics metrics,
456+
@NonNull final Time time,
449457
@NonNull final Supplier<MerkleNodeState> baseSupplier) {
450458
requireNonNull(registryFactory);
451459
requireNonNull(constructableRegistry);
@@ -552,11 +560,14 @@ public Hedera(
552560
final var blockStreamsEnabled = isBlockStreamEnabled();
553561
stateRootSupplier = blockStreamsEnabled ? () -> withListeners(baseSupplier.get()) : baseSupplier;
554562
onSealConsensusRound = blockStreamsEnabled ? this::manageBlockEndRound : (round, state) -> true;
563+
stateLifecycleManager = new StateLifecycleManagerImpl(
564+
metrics, time, virtualMap -> new VirtualMapState(virtualMap, metrics), configuration);
555565
}
556566

557567
/**
558568
* {@inheritDoc}
559569
*/
570+
@NonNull
560571
@Override
561572
public SemanticVersion getSemanticVersion() {
562573
return version;
@@ -581,14 +592,6 @@ public MerkleNodeState newStateRoot() {
581592
return stateRootSupplier.get();
582593
}
583594

584-
/**
585-
* {@inheritDoc}
586-
*/
587-
@Override
588-
public Function<VirtualMap, MerkleNodeState> stateRootFromVirtualMap(@NonNull final Metrics metrics) {
589-
return virtualMap -> new VirtualMapState(virtualMap, metrics);
590-
}
591-
592595
/**
593596
* {@inheritDoc}
594597
*/
@@ -1164,26 +1167,47 @@ public Bytes encodeSystemTransaction(@NonNull final StateSignatureTransaction st
11641167
return SignedTransaction.PROTOBUF.toBytes(signedTx);
11651168
}
11661169

1170+
/**
1171+
* {@inheritDoc}
1172+
*/
11671173
@Override
11681174
public void submitStateSignature(@NonNull final StateSignatureTransaction stateSignatureTransaction) {
11691175
transactionPool.submitPriorityTransaction(encodeSystemTransaction(stateSignatureTransaction));
11701176
}
11711177

1178+
/**
1179+
* {@inheritDoc}
1180+
*/
11721181
@Override
11731182
public @NonNull List<TimestampedTransaction> getTransactionsForEvent() {
11741183
return transactionPool.getTransactionsForEvent();
11751184
}
11761185

1186+
/**
1187+
* {@inheritDoc}
1188+
*/
11771189
@Override
11781190
public boolean hasBufferedSignatureTransactions() {
11791191
return transactionPool.hasBufferedSignatureTransactions();
11801192
}
11811193

1194+
/**
1195+
* {@inheritDoc}
1196+
*/
11821197
@Override
11831198
public @NonNull TransactionLimits getTransactionLimits() {
11841199
return transactionLimits;
11851200
}
11861201

1202+
/**
1203+
* {@inheritDoc}
1204+
*/
1205+
@NonNull
1206+
@Override
1207+
public StateLifecycleManager getStateLifecycleManager() {
1208+
return stateLifecycleManager;
1209+
}
1210+
11871211
/*==================================================================================================================
11881212
*
11891213
* Random private helper methods

hedera-node/hedera-app/src/main/java/com/hedera/node/app/ServicesMain.java

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -70,8 +70,8 @@
7070
import com.swirlds.platform.util.BootstrapUtils;
7171
import com.swirlds.state.MerkleNodeState;
7272
import com.swirlds.state.State;
73+
import com.swirlds.state.StateLifecycleManager;
7374
import com.swirlds.state.merkle.VirtualMapState;
74-
import com.swirlds.virtualmap.VirtualMap;
7575
import edu.umd.cs.findbugs.annotations.NonNull;
7676
import java.time.Duration;
7777
import java.time.InstantSource;
@@ -80,7 +80,6 @@
8080
import java.util.Set;
8181
import java.util.concurrent.ForkJoinPool;
8282
import java.util.concurrent.atomic.AtomicReference;
83-
import java.util.function.Function;
8483
import java.util.function.Predicate;
8584
import java.util.function.Supplier;
8685
import org.apache.logging.log4j.LogManager;
@@ -155,15 +154,6 @@ public void init(@NonNull final Platform platform, @NonNull final NodeId nodeId)
155154
return hederaOrThrow().newStateRoot();
156155
}
157156

158-
/**
159-
* {@inheritDoc}
160-
* Specifically, {@link VirtualMapState}.
161-
*/
162-
@Override
163-
public Function<VirtualMap, MerkleNodeState> stateRootFromVirtualMap(@NonNull final Metrics metrics) {
164-
return hederaOrThrow().stateRootFromVirtualMap(metrics);
165-
}
166-
167157
/**
168158
* {@inheritDoc}
169159
*/
@@ -185,31 +175,55 @@ public void submitStateSignature(@NonNull final StateSignatureTransaction transa
185175
hederaOrThrow().submitStateSignature(transaction);
186176
}
187177

178+
/**
179+
* {@inheritDoc}
180+
*/
188181
@Override
189182
public boolean hasBufferedSignatureTransactions() {
190183
return hederaOrThrow().hasBufferedSignatureTransactions();
191184
}
192185

186+
/**
187+
* {@inheritDoc}
188+
*/
193189
@Override
194190
public @NonNull List<TimestampedTransaction> getTransactionsForEvent() {
195191
return hederaOrThrow().getTransactionsForEvent();
196192
}
197193

194+
/**
195+
* {@inheritDoc}
196+
*/
198197
@Override
199198
public void reportUnhealthyDuration(@NonNull final Duration duration) {
200199
hederaOrThrow().reportUnhealthyDuration(duration);
201200
}
202201

202+
/**
203+
* {@inheritDoc}
204+
*/
203205
@Override
204206
public void newPlatformStatus(@NonNull final PlatformStatus platformStatus) {
205207
hederaOrThrow().newPlatformStatus(platformStatus);
206208
}
207209

210+
/**
211+
* {@inheritDoc}
212+
*/
208213
@Override
209214
public @NonNull TransactionLimits getTransactionLimits() {
210215
return hederaOrThrow().getTransactionLimits();
211216
}
212217

218+
/**
219+
* {@inheritDoc}
220+
*/
221+
@NonNull
222+
@Override
223+
public StateLifecycleManager getStateLifecycleManager() {
224+
return hederaOrThrow().getStateLifecycleManager();
225+
}
226+
213227
/**
214228
* Launches Services directly, without use of the "app browser" from {@link Browser}. The
215229
* approximate startup sequence is:
@@ -343,7 +357,7 @@ public static void main(final String... args) throws Exception {
343357
Hedera.SWIRLD_NAME,
344358
selfId,
345359
platformContext,
346-
hedera.stateRootFromVirtualMap(metrics));
360+
hedera.getStateLifecycleManager());
347361
final ReservedSignedState initialState = reservedState.state();
348362
final MerkleNodeState state = initialState.get().getState();
349363
if (genesisNetwork.get() == null) {
@@ -377,7 +391,7 @@ public static void main(final String... args) throws Exception {
377391
// Otherwise derive if from the node's id in state or
378392
.orElseGet(() -> canonicalEventStreamLoc(selfId.id(), state)),
379393
rosterHistory,
380-
hedera.stateRootFromVirtualMap(metrics))
394+
hedera.getStateLifecycleManager())
381395
.withPlatformContext(platformContext)
382396
.withConfiguration(platformConfig)
383397
.withKeysAndCerts(keysAndCerts)
@@ -466,7 +480,9 @@ public static Hedera newHedera(
466480
(appContext, bootstrapConfig) -> new HistoryServiceImpl(
467481
metrics, ForkJoinPool.commonPool(), appContext, new HistoryLibraryImpl(), bootstrapConfig),
468482
TssBlockHashSigner::new,
483+
configuration,
469484
metrics,
485+
time,
470486
() -> new VirtualMapState(configuration, metrics));
471487
}
472488

hedera-node/hedera-app/src/main/java/module-info.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
requires transitive com.swirlds.metrics.api;
2828
requires transitive com.swirlds.platform.core;
2929
requires transitive com.swirlds.state.api;
30-
requires transitive com.swirlds.virtualmap;
3130
requires transitive org.hiero.base.crypto;
3231
requires transitive org.hiero.base.utility;
3332
requires transitive org.hiero.consensus.model;
@@ -55,6 +54,7 @@
5554
requires com.swirlds.config.extensions;
5655
requires com.swirlds.logging;
5756
requires com.swirlds.state.impl;
57+
requires com.swirlds.virtualmap;
5858
requires org.hiero.base.concurrent;
5959
requires com.github.benmanes.caffeine;
6060
requires com.google.common;

hedera-node/hedera-app/src/test/java/com/hedera/node/app/ServicesMainTest.java

Lines changed: 0 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,12 @@
1313
import static org.mockito.Mockito.when;
1414

1515
import com.hedera.hapi.node.base.SemanticVersion;
16-
import com.swirlds.base.time.Time;
17-
import com.swirlds.config.api.Configuration;
1816
import com.swirlds.metrics.api.Metrics;
1917
import com.swirlds.platform.config.legacy.ConfigurationException;
2018
import com.swirlds.platform.config.legacy.LegacyConfigProperties;
2119
import com.swirlds.platform.config.legacy.LegacyConfigPropertiesLoader;
2220
import com.swirlds.platform.system.SystemExitUtils;
2321
import com.swirlds.state.MerkleNodeState;
24-
import com.swirlds.virtualmap.VirtualMap;
25-
import java.util.function.Function;
2622
import org.hiero.consensus.model.roster.AddressBook;
2723
import org.junit.jupiter.api.AfterAll;
2824
import org.junit.jupiter.api.Test;
@@ -96,21 +92,6 @@ void createsNewStateRoot() {
9692
assertSame(state, subject.newStateRoot());
9793
}
9894

99-
@Test
100-
void createsStateRootFromVirtualMap() {
101-
ServicesMain.initGlobal(hedera, metrics);
102-
final VirtualMap virtualMapMock = mock(VirtualMap.class);
103-
final Configuration configuration = mock(Configuration.class);
104-
final Metrics metrics = mock(Metrics.class);
105-
final Time time = mock(Time.class);
106-
final Function<VirtualMap, MerkleNodeState> stateRootFromVirtualMapMock = mock(Function.class);
107-
108-
when(hedera.stateRootFromVirtualMap(metrics)).thenReturn(stateRootFromVirtualMapMock);
109-
when(stateRootFromVirtualMapMock.apply(virtualMapMock)).thenReturn(state);
110-
111-
assertSame(state, subject.stateRootFromVirtualMap(metrics).apply(virtualMapMock));
112-
}
113-
11495
private void withBadCommandLineArgs() {
11596
legacyConfigPropertiesLoaderMockedStatic
11697
.when(() -> LegacyConfigPropertiesLoader.loadConfigFile(any()))

hedera-node/hedera-app/src/test/java/com/hedera/node/app/state/merkle/MerkleSchemaRegistryTest.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
// SPDX-License-Identifier: Apache-2.0
22
package com.hedera.node.app.state.merkle;
33

4-
import static com.swirlds.state.test.fixtures.merkle.VirtualMapStateTestUtils.createTestStateWithLabel;
4+
import static com.swirlds.state.test.fixtures.merkle.VirtualMapStateTestUtils.createTestState;
55
import static com.swirlds.state.test.fixtures.merkle.VirtualMapStateTestUtils.createTestStateWithVM;
66
import static org.assertj.core.api.Assertions.assertThat;
77
import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy;
@@ -167,9 +167,7 @@ void registerSameVersionDifferentInstances() {
167167
* Utility method that migrates from version 9 to 10
168168
*/
169169
void migrateFromV9ToV10() {
170-
final var virtualMapLabel =
171-
"vm-" + MerkleSchemaRegistryTest.class.getSimpleName() + "-" + java.util.UUID.randomUUID();
172-
final var virtualMap = VirtualMapUtils.createVirtualMap(virtualMapLabel);
170+
final var virtualMap = VirtualMapUtils.createVirtualMap();
173171
SemanticVersion latestVersion = version(10, 0, 0);
174172
schemaRegistry.migrate(
175173
createTestStateWithVM(virtualMap),
@@ -198,9 +196,7 @@ void setUp() {
198196
for (int i = 1; i < versions.length; i++) {
199197
versions[i] = version(0, i, 0);
200198
}
201-
final var virtualMapLabel =
202-
"vm-" + MerkleSchemaRegistryTest.class.getSimpleName() + "-" + java.util.UUID.randomUUID();
203-
merkleTree = createTestStateWithLabel(virtualMapLabel);
199+
merkleTree = createTestState();
204200
}
205201

206202
@AfterEach

0 commit comments

Comments
 (0)