@Test public void committedWritesAreAddedToSweepQueue() { List<WriteReference> table1Writes = ImmutableList.of( WriteReference.write(TABLE_CONS, Cell.create("a".getBytes(), "b".getBytes())), WriteReference.write(TABLE_CONS, Cell.create("a".getBytes(), "c".getBytes())), WriteReference.tombstone(TABLE_CONS, Cell.create("a".getBytes(), "d".getBytes())), WriteReference.write(TABLE_CONS, Cell.create("b".getBytes(), "d".getBytes()))); List<WriteReference> table2Writes = ImmutableList.of( WriteReference.write(TABLE_THOR, Cell.create("w".getBytes(), "x".getBytes())), WriteReference.write(TABLE_THOR, Cell.create("y".getBytes(), "z".getBytes())), WriteReference.tombstone(TABLE_THOR, Cell.create("z".getBytes(), "z".getBytes()))); long startTimestamp = txManager.runTaskWithRetry(txn -> { table1Writes.forEach(write -> put(txn, write)); table2Writes.forEach(write -> put(txn, write)); return txn.getTimestamp(); }); List<WriteInfo> expectedWrites = Stream.concat(table1Writes.stream(), table2Writes.stream()) .map(writeRef -> WriteInfo.of(writeRef, startTimestamp)) .collect(Collectors.toList()); assertThat(getEnqueuedWritesNumber(1)).hasSameElementsAs(expectedWrites); verify(sweepQueue, times(1)).enqueue(anyList()); }
@Test public void writesAddedToSweepQueueOnNoConflict() { WriteReference firstWrite = WriteReference.write(TABLE_CONS, TEST_CELL); WriteReference secondWrite = WriteReference.write(TABLE_THOR, TEST_CELL); Transaction t1 = txManager.createNewTransaction(); Transaction t2 = txManager.createNewTransaction(); put(t1, firstWrite); put(t2, secondWrite); t1.commit(); assertThat(getEnqueuedWritesNumber(1)).containsExactly(WriteInfo.of(firstWrite, t1.getTimestamp())); assertLatestEntryForCellInKvsAtTimestamp(TABLE_CONS, TEST_CELL, t1.getTimestamp()); t2.commit(); assertThat(getEnqueuedWritesNumber(2)).containsExactly(WriteInfo.of(secondWrite, t2.getTimestamp())); assertLatestEntryForCellInKvsAtTimestamp(TABLE_THOR, TEST_CELL, t2.getTimestamp()); verify(sweepQueue, times(2)).enqueue(anyList()); }
@Test public void sweepHandlesEmptyNamespace() { useOneSweepQueueShard(); WriteReference write = WriteReference.write(TABLE_NONAMESPACE, TEST_CELL); writeInTransactionAndGetStartTimestamp(write); long timestamp = writeInTransactionAndGetStartTimestamp(write); serializableTxManager.setUnreadableTimestamp(timestamp + 1); sweepQueue.sweepNextBatch(ShardAndStrategy.conservative(0)); }
@Test public void sweepDeletesAllIfLatestCommittedTombstoneInThorough() { useOneSweepQueueShard(); WriteReference writeToThorough = WriteReference.write(TABLE_THOR, TEST_CELL); WriteReference tombstoneToThorough = WriteReference.tombstone(TABLE_THOR, TEST_CELL); long firstStart = writeInTransactionAndGetStartTimestamp(writeToThorough); long secondStart = writeInTransactionAndGetStartTimestamp(tombstoneToThorough); assertLatestEntryBeforeTsIs(Long.MAX_VALUE, TABLE_THOR, TEST_CELL, PtBytes.EMPTY_BYTE_ARRAY, secondStart); assertLatestEntryBeforeTsIs(secondStart, TABLE_THOR, TEST_CELL, TEST_DATA, firstStart); serializableTxManager.setUnreadableTimestamp(secondStart + 1); sweepQueue.sweepNextBatch(ShardAndStrategy.thorough(0)); assertNoEntryForCellInKvs(TABLE_THOR, TEST_CELL); }