@Test public void canSweepAtMinimumTimeWithNoWrites() { runConservativeSweepAtTimestamp(Long.MIN_VALUE); assertProgressUpdatedToTimestamp(SweepQueueUtils.INITIAL_TIMESTAMP); }
@Test public void doesNotGoBackwardsEvenIfSweepTimestampRegressesWithinBucket() { enqueueWriteCommitted(TABLE_CONS, LOW_TS); enqueueWriteCommitted(TABLE_CONS, LOW_TS2); enqueueWriteCommitted(TABLE_CONS, LOW_TS3); runConservativeSweepAtTimestamp(LOW_TS2 + 5); assertReadAtTimestampReturnsSentinel(TABLE_CONS, LOW_TS2); assertTestValueEnqueuedAtGivenTimestampStillPresent(TABLE_CONS, LOW_TS2); verify(spiedKvs, times(1)).deleteAllTimestamps(any(TableReference.class), anyMap(), eq(false)); assertProgressUpdatedToTimestamp(LOW_TS2 + 5 - 1); runConservativeSweepAtTimestamp(LOW_TS2 - 5); verify(spiedKvs, times(1)).deleteAllTimestamps(any(TableReference.class), anyMap(), eq(false)); assertProgressUpdatedToTimestamp(LOW_TS2 + 5 - 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); }
@Test public void doesNotGoBackwardsEvenIfSweepTimestampRegressesAcrossBoundary() { long coarseBoundary = TS_COARSE_GRANULARITY; enqueueWriteCommitted(TABLE_CONS, coarseBoundary - 5); enqueueWriteCommitted(TABLE_CONS, coarseBoundary + 5); enqueueWriteCommitted(TABLE_CONS, coarseBoundary + 15); // Need 2 sweeps to get through the first coarse bucket runConservativeSweepAtTimestamp(coarseBoundary + 8); assertThat(metricsManager).hasSweepTimestampConservativeEqualTo( coarseBoundary + 8); runConservativeSweepAtTimestamp(coarseBoundary + 8); assertReadAtTimestampReturnsSentinel(TABLE_CONS, coarseBoundary - 5 + 1); assertTestValueEnqueuedAtGivenTimestampStillPresent(TABLE_CONS, coarseBoundary + 5); assertTestValueEnqueuedAtGivenTimestampStillPresent(TABLE_CONS, coarseBoundary + 15); // Now regresses (e.g. clock drift on unreadable) runConservativeSweepAtTimestamp(coarseBoundary - 3); assertThat(metricsManager).hasSweepTimestampConservativeEqualTo( coarseBoundary - 3); // And advances again runConservativeSweepAtTimestamp(coarseBoundary + 18); assertThat(metricsManager).hasSweepTimestampConservativeEqualTo( coarseBoundary + 18); assertReadAtTimestampReturnsSentinel(TABLE_CONS, coarseBoundary - 5 + 1); assertReadAtTimestampReturnsSentinel(TABLE_CONS, coarseBoundary + 5 + 1); assertTestValueEnqueuedAtGivenTimestampStillPresent(TABLE_CONS, coarseBoundary + 15); }
@Test public void canSweepAtMinimumTime() { enqueueWriteCommitted(TABLE_CONS, LOW_TS); enqueueWriteCommitted(TABLE_CONS, LOW_TS2); enqueueWriteCommitted(TABLE_CONS, LOW_TS3); runConservativeSweepAtTimestamp(Long.MIN_VALUE); assertTestValueEnqueuedAtGivenTimestampStillPresent(TABLE_CONS, LOW_TS); assertProgressUpdatedToTimestamp(SweepQueueUtils.INITIAL_TIMESTAMP); }
@Test public void canSweepAtMaximumTime() { enqueueWriteCommitted(TABLE_CONS, LOW_TS); enqueueWriteCommitted(TABLE_CONS, LOW_TS2); enqueueWriteCommitted(TABLE_CONS, LOW_TS3); runConservativeSweepAtTimestamp(Long.MAX_VALUE); assertReadAtTimestampReturnsSentinel(TABLE_CONS, LOW_TS3); assertTestValueEnqueuedAtGivenTimestampStillPresent(TABLE_CONS, LOW_TS3); }