@Override public boolean cellsCleanedUp(Transaction t, Set<Cell> cells) { SnapshotsStreamMetadataTable metaTable = tables.getSnapshotsStreamMetadataTable(t); Collection<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow> rows = Lists.newArrayListWithCapacity(cells.size()); for (Cell cell : cells) { rows.add(SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow.BYTES_HYDRATOR.hydrateFromBytes(cell.getRowName())); } Map<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> currentMetadata = metaTable.getMetadatas(rows); Set<Long> toDelete = Sets.newHashSet(); for (Map.Entry<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> e : currentMetadata.entrySet()) { if (e.getValue().getStatus() != Status.STORED) { toDelete.add(e.getKey().getId()); } } SnapshotsStreamStore.of(tables).deleteStreams(t, toDelete); return false; } }
@Override public boolean cellsCleanedUp(Transaction t, Set<Cell> cells) { SnapshotsStreamIdxTable usersIndex = tables.getSnapshotsStreamIdxTable(t); Set<SnapshotsStreamIdxTable.SnapshotsStreamIdxRow> rows = Sets.newHashSetWithExpectedSize(cells.size()); for (Cell cell : cells) { rows.add(SnapshotsStreamIdxTable.SnapshotsStreamIdxRow.BYTES_HYDRATOR.hydrateFromBytes(cell.getRowName())); } BatchColumnRangeSelection oneColumn = BatchColumnRangeSelection.create( PtBytes.EMPTY_BYTE_ARRAY, PtBytes.EMPTY_BYTE_ARRAY, 1); Map<SnapshotsStreamIdxTable.SnapshotsStreamIdxRow, BatchingVisitable<SnapshotsStreamIdxTable.SnapshotsStreamIdxColumnValue>> existentRows = usersIndex.getRowsColumnRange(rows, oneColumn); Set<SnapshotsStreamIdxTable.SnapshotsStreamIdxRow> rowsInDb = Sets.newHashSetWithExpectedSize(cells.size()); for (Map.Entry<SnapshotsStreamIdxTable.SnapshotsStreamIdxRow, BatchingVisitable<SnapshotsStreamIdxTable.SnapshotsStreamIdxColumnValue>> rowVisitable : existentRows.entrySet()) { rowVisitable.getValue().batchAccept(1, columnValues -> { if (!columnValues.isEmpty()) { rowsInDb.add(rowVisitable.getKey()); } return false; }); } Set<Long> toDelete = Sets.newHashSetWithExpectedSize(rows.size() - rowsInDb.size()); for (SnapshotsStreamIdxTable.SnapshotsStreamIdxRow rowToDelete : Sets.difference(rows, rowsInDb)) { toDelete.add(rowToDelete.getId()); } SnapshotsStreamStore.of(tables).deleteStreams(t, toDelete); return false; } }
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 boolean cellsCleanedUp(Transaction t, Set<Cell> cells) { SnapshotsStreamMetadataTable metaTable = tables.getSnapshotsStreamMetadataTable(t); Collection<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow> rows = Lists.newArrayListWithCapacity(cells.size()); for (Cell cell : cells) { rows.add(SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow.BYTES_HYDRATOR.hydrateFromBytes(cell.getRowName())); } Map<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> currentMetadata = metaTable.getMetadatas(rows); Set<Long> toDelete = Sets.newHashSet(); for (Map.Entry<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> e : currentMetadata.entrySet()) { if (e.getValue().getStatus() != Status.STORED) { toDelete.add(e.getKey().getId()); } } SnapshotsStreamStore.of(tables).deleteStreams(t, toDelete); return false; } }
@Override public boolean cellsCleanedUp(Transaction t, Set<Cell> cells) { SnapshotsStreamIdxTable usersIndex = tables.getSnapshotsStreamIdxTable(t); Set<SnapshotsStreamIdxTable.SnapshotsStreamIdxRow> rows = Sets.newHashSetWithExpectedSize(cells.size()); for (Cell cell : cells) { rows.add(SnapshotsStreamIdxTable.SnapshotsStreamIdxRow.BYTES_HYDRATOR.hydrateFromBytes(cell.getRowName())); } BatchColumnRangeSelection oneColumn = BatchColumnRangeSelection.create( PtBytes.EMPTY_BYTE_ARRAY, PtBytes.EMPTY_BYTE_ARRAY, 1); Map<SnapshotsStreamIdxTable.SnapshotsStreamIdxRow, BatchingVisitable<SnapshotsStreamIdxTable.SnapshotsStreamIdxColumnValue>> existentRows = usersIndex.getRowsColumnRange(rows, oneColumn); Set<SnapshotsStreamIdxTable.SnapshotsStreamIdxRow> rowsInDb = Sets.newHashSetWithExpectedSize(cells.size()); for (Map.Entry<SnapshotsStreamIdxTable.SnapshotsStreamIdxRow, BatchingVisitable<SnapshotsStreamIdxTable.SnapshotsStreamIdxColumnValue>> rowVisitable : existentRows.entrySet()) { rowVisitable.getValue().batchAccept(1, columnValues -> { if (!columnValues.isEmpty()) { rowsInDb.add(rowVisitable.getKey()); } return false; }); } Set<Long> toDelete = Sets.newHashSetWithExpectedSize(rows.size() - rowsInDb.size()); for (SnapshotsStreamIdxTable.SnapshotsStreamIdxRow rowToDelete : Sets.difference(rows, rowsInDb)) { toDelete.add(rowToDelete.getId()); } SnapshotsStreamStore.of(tables).deleteStreams(t, toDelete); return false; } }