@Test public void doesNotSweepBeyondSweepTimestamp() { writeValuesAroundSweepTimestampAndSweepAndCheck(getSweepTsCons(), 1); }
private void assertNoEntriesInSweepableTimestampsBeforeSweepTimestamp() { assertThat(sweepableTimestamps .nextSweepableTimestampPartition(ShardAndStrategy.conservative(CONS_SHARD), -1L, getSweepTsCons())) .isEmpty(); }
private void assertLowestFinePartitionInSweepableTimestampsEquals(long partitionFine) { assertThat(sweepableTimestamps .nextSweepableTimestampPartition(ShardAndStrategy.conservative(CONS_SHARD), -1L, getSweepTsCons())) .contains(partitionFine); }
@Test public void sweepProgressesToJustBeforeSweepTsWhenNothingToSweep() { sweepQueue.sweepNextBatch(ShardAndStrategy.conservative(CONS_SHARD)); assertProgressUpdatedToTimestamp(getSweepTsCons() - 1L); }
@Test public void sweepProgressesToEndOfPartitionWhenFewValuesAndSweepTsLarge() { long writeTs = getSweepTsCons() - 3 * TS_FINE_GRANULARITY; enqueueWriteCommitted(TABLE_CONS, writeTs); enqueueWriteCommitted(TABLE_CONS, writeTs + 5); sweepQueue.sweepNextBatch(ShardAndStrategy.conservative(CONS_SHARD)); assertProgressUpdatedToTimestamp(maxTsForFinePartition(tsPartitionFine(writeTs))); sweepQueue.sweepNextBatch(ShardAndStrategy.conservative(CONS_SHARD)); assertProgressUpdatedToTimestamp(getSweepTsCons() - 1L); }
@Test public void sweepWithNoCandidatesBeforeSweepTimestampReportsNothingToSweep() { enqueueWriteCommitted(TABLE_CONS, getSweepTsCons()); sweepQueue.sweepNextBatch(ShardAndStrategy.conservative(CONS_SHARD)); assertThat(metricsManager).hasTargetedOutcomeEqualTo(SweepOutcome.NOTHING_TO_SWEEP, 1L); }
@Test public void sweepableCellsGetsScrubbedWheneverLastSweptInNewPartition() { long tsSecondPartitionFine = LOW_TS + TS_FINE_GRANULARITY; enqueueWriteCommitted(TABLE_CONS, LOW_TS); enqueueWriteCommitted(TABLE_CONS, LOW_TS + 1L); enqueueAtLeastThresholdWritesInDefaultShardWithStartTs(100, LOW_TS + 2L); putTimestampIntoTransactionTable(LOW_TS + 2L, LOW_TS + 2L); enqueueWriteCommitted(TABLE_CONS, tsSecondPartitionFine); enqueueWriteCommitted(TABLE_CONS, getSweepTsCons()); // last swept timestamp: TS_FINE_GRANULARITY - 1 sweepQueue.sweepNextBatch(ShardAndStrategy.conservative(CONS_SHARD)); assertSweepableCellsHasEntryForTimestamp(LOW_TS + 1); assertSweepableCellsHasEntryForTimestamp(tsSecondPartitionFine); assertSweepableCellsHasEntryForTimestamp(getSweepTsCons()); // last swept timestamp: 2 * TS_FINE_GRANULARITY - 1 sweepQueue.sweepNextBatch(ShardAndStrategy.conservative(CONS_SHARD)); assertSweepableCellsHasNoEntriesInPartitionOfTimestamp(LOW_TS + 1); assertSweepableCellsHasEntryForTimestamp(tsSecondPartitionFine); assertSweepableCellsHasEntryForTimestamp(getSweepTsCons()); // last swept timestamp: largestBeforeSweepTs sweepQueue.sweepNextBatch(ShardAndStrategy.conservative(CONS_SHARD)); assertSweepableCellsHasNoEntriesInPartitionOfTimestamp(LOW_TS + 1); assertSweepableCellsHasNoEntriesInPartitionOfTimestamp(tsSecondPartitionFine); assertSweepableCellsHasEntryForTimestamp(getSweepTsCons()); assertSweepableCellsHasNoDedicatedRowsForShard(CONS_SHARD); }
@Test public void doesNotTransitivelyRetainWritesFromBeforeSweepTimestamp() { long sweepTimestamp = getSweepTsCons(); enqueueWriteCommitted(TABLE_CONS, sweepTimestamp - 10); enqueueTombstone(TABLE_CONS, sweepTimestamp - 5); enqueueWriteCommitted(TABLE_CONS, sweepTimestamp + 5); sweepQueue.sweepNextBatch(ShardAndStrategy.conservative(CONS_SHARD)); assertReadAtTimestampReturnsSentinel(TABLE_CONS, sweepTimestamp - 5); assertReadAtTimestampReturnsTombstoneAtTimestamp(TABLE_CONS, sweepTimestamp - 5 + 1, sweepTimestamp - 5); assertTestValueEnqueuedAtGivenTimestampStillPresent(TABLE_CONS, sweepTimestamp + 5); assertThat(metricsManager).hasTombstonesPutConservativeEqualTo(1); assertThat(metricsManager).hasLastSweptTimestampConservativeEqualTo( sweepTimestamp - 1); }
@Test public void remembersProgressWhenSweepTimestampAdvances() { long baseSweepTs = getSweepTsCons(); long oldPartitionTs = baseSweepTs - 5; long newPartitionFirstTs = baseSweepTs + 5; long newPartitionSecondTs = baseSweepTs + 10; enqueueWriteCommitted(TABLE_CONS, oldPartitionTs); enqueueWriteCommitted(TABLE_CONS, newPartitionFirstTs); enqueueWriteCommitted(TABLE_CONS, newPartitionSecondTs); assertReadAtTimestampReturnsNothing(TABLE_CONS, oldPartitionTs); runConservativeSweepAtTimestamp(baseSweepTs + 7); runConservativeSweepAtTimestamp(baseSweepTs + 7); assertReadAtTimestampReturnsSentinel(TABLE_CONS, oldPartitionTs + 1); assertTestValueEnqueuedAtGivenTimestampStillPresent(TABLE_CONS, newPartitionFirstTs); assertTestValueEnqueuedAtGivenTimestampStillPresent(TABLE_CONS, newPartitionSecondTs); runConservativeSweepAtTimestamp(newPartitionSecondTs + 1); assertReadAtTimestampReturnsSentinel(TABLE_CONS, newPartitionSecondTs); assertTestValueEnqueuedAtGivenTimestampStillPresent(TABLE_CONS, newPartitionSecondTs); }