public void storeSnapshot(InputStream snapshot) {
byte[] streamReference = "EteTest".getBytes();
TodoSchemaTableFactory tableFactory = TodoSchemaTableFactory.of(Namespace.DEFAULT_NAMESPACE);
SnapshotsStreamStore streamStore = SnapshotsStreamStore.of(transactionManager, tableFactory);
log.info("Storing stream...");
Pair<Long, Sha256Hash> storedStream = streamStore.storeStream(snapshot);
Long newStreamId = storedStream.getLhSide();
log.info("Stored stream with ID {}", newStreamId);
transactionManager.runTaskWithRetry(transaction -> {
LatestSnapshotTable.LatestSnapshotRow row = LatestSnapshotTable.LatestSnapshotRow.of(0L);
LatestSnapshotTable latestSnapshotTable = tableFactory.getLatestSnapshotTable(transaction);
Optional<LatestSnapshotTable.LatestSnapshotRowResult> maybeRow = latestSnapshotTable.getRow(row);
maybeRow.ifPresent(latestSnapshot -> {
Long latestStreamId = maybeRow.get().getStreamId();
log.info("Marking stream {}, ref {}, as unused", latestStreamId, PtBytes.toString(streamReference));
Map<Long, byte[]> theMap = ImmutableMap.of(latestStreamId, streamReference);
streamStore.unmarkStreamsAsUsed(transaction, theMap);
});
streamStore.markStreamAsUsed(transaction, newStreamId, streamReference);
log.info("Marked stream {} as used with reference {}", newStreamId, PtBytes.toString(streamReference));
latestSnapshotTable.putStreamId(row, newStreamId);
return null;
});
}