use of org.hyperledger.besu.ethereum.eth.sync.snapsync.SnapSyncState in project besu by hyperledger.
the class CheckpointDownloaderFactory method createCheckpointDownloader.
public static Optional<FastSyncDownloader<?>> createCheckpointDownloader(final PivotBlockSelector pivotBlockSelector, final SynchronizerConfiguration syncConfig, final Path dataDirectory, final ProtocolSchedule protocolSchedule, final ProtocolContext protocolContext, final MetricsSystem metricsSystem, final EthContext ethContext, final WorldStateStorage worldStateStorage, final SyncState syncState, final Clock clock) {
final Path fastSyncDataDirectory = dataDirectory.resolve(FAST_SYNC_FOLDER);
final FastSyncStateStorage fastSyncStateStorage = new FastSyncStateStorage(fastSyncDataDirectory);
if (SyncMode.isFullSync(syncConfig.getSyncMode())) {
if (fastSyncStateStorage.isFastSyncInProgress()) {
throw new IllegalStateException("Unable to change the sync mode when snap sync is incomplete, please restart with checkpoint sync mode");
} else {
return Optional.empty();
}
}
ensureDirectoryExists(fastSyncDataDirectory.toFile());
final FastSyncState fastSyncState = fastSyncStateStorage.loadState(ScheduleBasedBlockHeaderFunctions.create(protocolSchedule));
if (fastSyncState.getPivotBlockHeader().isEmpty() && protocolContext.getBlockchain().getChainHeadBlockNumber() != BlockHeader.GENESIS_BLOCK_NUMBER) {
LOG.info("Checkpoint sync was requested, but cannot be enabled because the local blockchain is not empty.");
return Optional.empty();
}
final FastSyncActions fastSyncActions;
if (syncState.getCheckpoint().isEmpty()) {
LOG.warn("Unable to find a valid checkpoint configuration. The genesis will be used");
fastSyncActions = new FastSyncActions(syncConfig, worldStateStorage, protocolSchedule, protocolContext, ethContext, syncState, pivotBlockSelector, metricsSystem);
} else {
LOG.info("Checkpoint sync start with block {} and hash {}", syncState.getCheckpoint().get().blockNumber(), syncState.getCheckpoint().get().blockHash());
fastSyncActions = new CheckpointSyncActions(syncConfig, worldStateStorage, protocolSchedule, protocolContext, ethContext, syncState, pivotBlockSelector, metricsSystem);
}
final SnapSyncState snapSyncState = new SnapSyncState(fastSyncStateStorage.loadState(ScheduleBasedBlockHeaderFunctions.create(protocolSchedule)));
worldStateStorage.clear();
final InMemoryTasksPriorityQueues<SnapDataRequest> snapTaskCollection = createSnapWorldStateDownloaderTaskCollection();
final WorldStateDownloader snapWorldStateDownloader = new SnapWorldStateDownloader(ethContext, worldStateStorage, snapTaskCollection, syncConfig.getSnapSyncConfiguration(), syncConfig.getWorldStateRequestParallelism(), syncConfig.getWorldStateMaxRequestsWithoutProgress(), syncConfig.getWorldStateMinMillisBeforeStalling(), clock, metricsSystem);
final FastSyncDownloader<SnapDataRequest> fastSyncDownloader = new SnapSyncDownloader(fastSyncActions, worldStateStorage, snapWorldStateDownloader, fastSyncStateStorage, snapTaskCollection, fastSyncDataDirectory, snapSyncState);
syncState.setWorldStateDownloadStatus(snapWorldStateDownloader);
return Optional.of(fastSyncDownloader);
}
use of org.hyperledger.besu.ethereum.eth.sync.snapsync.SnapSyncState in project besu by hyperledger.
the class StorageRangeDataRequest method doPersist.
@Override
protected int doPersist(final WorldStateStorage worldStateStorage, final Updater updater, final SnapWorldDownloadState downloadState, final SnapSyncState snapSyncState) {
// search incomplete nodes in the range
final AtomicInteger nbNodesSaved = new AtomicInteger();
final AtomicReference<Updater> updaterTmp = new AtomicReference<>(worldStateStorage.updater());
final NodeUpdater nodeUpdater = (location, hash, value) -> {
updaterTmp.get().putAccountStorageTrieNode(accountHash, location, hash, value);
if (nbNodesSaved.getAndIncrement() % 1000 == 0) {
updaterTmp.get().commit();
updaterTmp.set(worldStateStorage.updater());
}
};
stackTrie.commit(nodeUpdater);
updaterTmp.get().commit();
downloadState.getMetricsManager().notifySlotsDownloaded(stackTrie.getElementsCount().get());
return nbNodesSaved.get();
}
use of org.hyperledger.besu.ethereum.eth.sync.snapsync.SnapSyncState in project besu by hyperledger.
the class AccountRangeDataRequest method doPersist.
@Override
protected int doPersist(final WorldStateStorage worldStateStorage, final Updater updater, final SnapWorldDownloadState downloadState, final SnapSyncState snapSyncState) {
if (startStorageRange.isPresent() && endStorageRange.isPresent()) {
// rootHash
return 0;
}
// search incomplete nodes in the range
final AtomicInteger nbNodesSaved = new AtomicInteger();
final NodeUpdater nodeUpdater = (location, hash, value) -> {
updater.putAccountStateTrieNode(location, hash, value);
nbNodesSaved.getAndIncrement();
};
stackTrie.commit(nodeUpdater);
downloadState.getMetricsManager().notifyAccountsDownloaded(stackTrie.getElementsCount().get());
return nbNodesSaved.get();
}
Aggregations