@Override protected void putMetadataAndHashIndexTask(Transaction t, Map<Long, StreamMetadata> streamIdsToMetadata) { SnapshotsStreamMetadataTable mdTable = tables.getSnapshotsStreamMetadataTable(t); Map<Long, StreamMetadata> prevMetadatas = getMetadata(t, streamIdsToMetadata.keySet()); Map<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> rowsToStoredMetadata = Maps.newHashMap(); Map<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> rowsToUnstoredMetadata = Maps.newHashMap(); for (Entry<Long, StreamMetadata> e : streamIdsToMetadata.entrySet()) { long streamId = e.getKey(); StreamMetadata metadata = e.getValue(); StreamMetadata prevMetadata = prevMetadatas.get(streamId); if (metadata.getStatus() == Status.STORED) { if (prevMetadata == null || prevMetadata.getStatus() != Status.STORING) { // This can happen if we cleanup old streams. throw new TransactionFailedRetriableException("Cannot mark a stream as stored that isn't currently storing: " + prevMetadata); } rowsToStoredMetadata.put(SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow.of(streamId), metadata); } else if (metadata.getStatus() == Status.STORING) { // This will prevent two users trying to store the same id. if (prevMetadata != null) { throw new TransactionFailedRetriableException("Cannot reuse the same stream id: " + streamId); } rowsToUnstoredMetadata.put(SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow.of(streamId), metadata); } } putHashIndexTask(t, rowsToStoredMetadata); Map<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> rowsToMetadata = Maps.newHashMap(); rowsToMetadata.putAll(rowsToStoredMetadata); rowsToMetadata.putAll(rowsToUnstoredMetadata); mdTable.putMetadata(rowsToMetadata); }
@Override protected void putMetadataAndHashIndexTask(Transaction t, Map<Long, StreamMetadata> streamIdsToMetadata) { SnapshotsStreamMetadataTable mdTable = tables.getSnapshotsStreamMetadataTable(t); Map<Long, StreamMetadata> prevMetadatas = getMetadata(t, streamIdsToMetadata.keySet()); Map<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> rowsToStoredMetadata = Maps.newHashMap(); Map<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> rowsToUnstoredMetadata = Maps.newHashMap(); for (Entry<Long, StreamMetadata> e : streamIdsToMetadata.entrySet()) { long streamId = e.getKey(); StreamMetadata metadata = e.getValue(); StreamMetadata prevMetadata = prevMetadatas.get(streamId); if (metadata.getStatus() == Status.STORED) { if (prevMetadata == null || prevMetadata.getStatus() != Status.STORING) { // This can happen if we cleanup old streams. throw new TransactionFailedRetriableException("Cannot mark a stream as stored that isn't currently storing: " + prevMetadata); } rowsToStoredMetadata.put(SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow.of(streamId), metadata); } else if (metadata.getStatus() == Status.STORING) { // This will prevent two users trying to store the same id. if (prevMetadata != null) { throw new TransactionFailedRetriableException("Cannot reuse the same stream id: " + streamId); } rowsToUnstoredMetadata.put(SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow.of(streamId), metadata); } } putHashIndexTask(t, rowsToStoredMetadata); Map<SnapshotsStreamMetadataTable.SnapshotsStreamMetadataRow, StreamMetadata> rowsToMetadata = Maps.newHashMap(); rowsToMetadata.putAll(rowsToStoredMetadata); rowsToMetadata.putAll(rowsToUnstoredMetadata); mdTable.putMetadata(rowsToMetadata); }