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 -> { // Load previous stream, and unmark it as used 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)); // Record the latest snapshot latestSnapshotTable.putStreamId(row, newStreamId); return null; }); }
@Override public String toString() { return MoreObjects.toStringHelper(getClass().getSimpleName()) .add("RowName", getRowName()) .add("StreamId", getStreamId()) .toString(); } }
@Override public List<LatestSnapshotRowResult> getRows(Iterable<LatestSnapshotRow> rows, ColumnSelection columns) { SortedMap<byte[], RowResult<byte[]>> results = t.getRows(tableRef, Persistables.persistAll(rows), columns); List<LatestSnapshotRowResult> rowResults = Lists.newArrayListWithCapacity(results.size()); for (RowResult<byte[]> row : results.values()) { rowResults.add(LatestSnapshotRowResult.of(row)); } return rowResults; }
public static LatestSnapshotRowResult of(RowResult<byte[]> row) { return new LatestSnapshotRowResult(row); }
@Override public LatestSnapshotRow apply(LatestSnapshotRowResult rowResult) { return rowResult.getRowName(); } };
@Override public List<LatestSnapshotRowResult> getRows(Iterable<LatestSnapshotRow> rows, ColumnSelection columns) { SortedMap<byte[], RowResult<byte[]>> results = t.getRows(tableRef, Persistables.persistAll(rows), columns); List<LatestSnapshotRowResult> rowResults = Lists.newArrayListWithCapacity(results.size()); for (RowResult<byte[]> row : results.values()) { rowResults.add(LatestSnapshotRowResult.of(row)); } return rowResults; }
@Override public LatestSnapshotRowResult apply(RowResult<byte[]> input) { return LatestSnapshotRowResult.of(input); } });
@Override public Long apply(LatestSnapshotRowResult rowResult) { return rowResult.getStreamId(); } };
@Override public LatestSnapshotRowResult apply(RowResult<byte[]> rowResult) { return new LatestSnapshotRowResult(rowResult); } };
public Optional<LatestSnapshotRowResult> getRow(LatestSnapshotRow row, ColumnSelection columns) { byte[] bytes = row.persistToBytes(); RowResult<byte[]> rowResult = t.getRows(tableRef, ImmutableSet.of(bytes), columns).get(bytes); if (rowResult == null) { return Optional.empty(); } else { return Optional.of(LatestSnapshotRowResult.of(rowResult)); } }
@Override public String toString() { return MoreObjects.toStringHelper(getClass().getSimpleName()) .add("RowName", getRowName()) .add("StreamId", getStreamId()) .toString(); } }
public static LatestSnapshotRowResult of(RowResult<byte[]> row) { return new LatestSnapshotRowResult(row); }
@Override public LatestSnapshotRowResult apply(RowResult<byte[]> input) { return LatestSnapshotRowResult.of(input); } });
@Override public LatestSnapshotRow apply(LatestSnapshotRowResult rowResult) { return rowResult.getRowName(); } };
@Override public Long apply(LatestSnapshotRowResult rowResult) { return rowResult.getStreamId(); } };
@Override public LatestSnapshotRowResult apply(RowResult<byte[]> rowResult) { return new LatestSnapshotRowResult(rowResult); } };
public Optional<LatestSnapshotRowResult> getRow(LatestSnapshotRow row, ColumnSelection columns) { byte[] bytes = row.persistToBytes(); RowResult<byte[]> rowResult = t.getRows(tableRef, ImmutableSet.of(bytes), columns).get(bytes); if (rowResult == null) { return Optional.empty(); } else { return Optional.of(LatestSnapshotRowResult.of(rowResult)); } }