@Provides @Singleton public SweepTaskRunner provideSweepTaskRunner(SerializableTransactionManager txm, @Named("kvs") KeyValueService kvs, TransactionService transactionService, SweepStrategyManager sweepStrategyManager, Follower follower, PersistentLockManager persistentLockManager, ServicesConfig config) { return new SweepTaskRunner( kvs, txm::getUnreadableTimestamp, txm::getImmutableTimestamp, transactionService, sweepStrategyManager, new CellsSweeper( txm, kvs, persistentLockManager, ImmutableList.of(follower))); }
@SuppressWarnings("unchecked") private Pair<List<List<Cell>>, SweepResults> runSweep(CellsSweeper cellsSweeper, SweepTaskRunner spiedSweepRunner, int maxCellTsPairsToExamine, int candidateBatchSize, int deleteBatchSize) { sweepTimestamp.set(Long.MAX_VALUE); List<List<Cell>> sweptCells = Lists.newArrayList(); doAnswer((invocationOnMock) -> { Object[] arguments = invocationOnMock.getArguments(); Collection<Cell> sentinelsToAdd = (Collection<Cell>) arguments[2]; sweptCells.add(new ArrayList(sentinelsToAdd)); return null; }).when(cellsSweeper).sweepCells(eq(TABLE_NAME), any(), any()); SweepResults sweepResults = spiedSweepRunner.run(TABLE_NAME, ImmutableSweepBatchConfig.builder() .maxCellTsPairsToExamine(maxCellTsPairsToExamine) .candidateBatchSize(candidateBatchSize) .deleteBatchSize(deleteBatchSize) .build(), PtBytes.EMPTY_BYTE_ARRAY); return new Pair(sweptCells, sweepResults); }
+ " This is unexpected. The cellTs pairs to sweep were: {}.", LoggingArgs.tableRef(tableRef), getLoggingArgForCells(cellTsPairsToSweep));
private Arg<String> getLoggingArgForCells(Multimap<Cell, Long> cellTsPairsToSweep) { return UnsafeArg.of("cellTsPairsToSweep", getMessage(cellTsPairsToSweep)); }
private Arg<String> getLoggingArgForCells(Multimap<Cell, Long> cellTsPairsToSweep) { return UnsafeArg.of("cellTsPairsToSweep", getMessage(cellTsPairsToSweep)); }
@Provides @Singleton public SweepTaskRunner provideSweepTaskRunner(SerializableTransactionManager txm, @Named("kvs") KeyValueService kvs, TransactionService transactionService, SweepStrategyManager sweepStrategyManager, Follower follower, PersistentLockManager persistentLockManager, ServicesConfig config) { LongSupplier unreadable = unreadableTs.orElse(txm::getUnreadableTimestamp); LongSupplier immutable = immutableTs.orElse(txm::getImmutableTimestamp); return new SweepTaskRunner( kvs, unreadable, immutable, transactionService, sweepStrategyManager, new CellsSweeper( txm, kvs, persistentLockManager, ImmutableList.of(follower))); }
cellsSweeper.sweepCells(tableRef, currentBatch, currentBatchSentinels); cellsSweeper.sweepCells(tableRef, currentBatch, currentBatchSentinels);
+ " This is unexpected. The cellTs pairs to sweep were: {}.", LoggingArgs.tableRef(tableRef), getLoggingArgForCells(cellTsPairsToSweep));
@Before public void setup() { super.setup(); tsSupplier = sweepTimestamp::get; CellsSweeper cellsSweeper = new CellsSweeper(txManager, kvs, persistentLockManager, ImmutableList.of()); sweepRunner = new SweepTaskRunner(kvs, tsSupplier, tsSupplier, txService, ssm, cellsSweeper); }
@Test public void ensureFollowersRunAgainstCellsToSweep() { sweeper.sweepCells(TABLE_REFERENCE, SINGLE_CELL_TS_PAIR, ImmutableSet.of()); verify(mockFollower) .run(any(), any(), eq(SINGLE_CELL_TS_PAIR.keySet()), eq(Transaction.TransactionType.HARD_DELETE)); }
private SweepTaskRunner getSweepTaskRunner( TransactionManager transactionManager, MetricRegistry metricRegistry, TaggedMetricRegistry taggedMetricRegistry) { KeyValueService kvs = transactionManager.getKeyValueService(); LongSupplier ts = transactionManager.getTimestampService()::getFreshTimestamp; TransactionService txnService = TransactionServices.createForTesting(kvs, transactionManager.getTimestampService(), false); SweepStrategyManager ssm = SweepStrategyManagers.completelyConservative(kvs); // maybe createDefault PersistentLockManager noLocks = new PersistentLockManager( MetricsManagers.of(metricRegistry, taggedMetricRegistry), new NoOpPersistentLockService(), AtlasDbConstants.DEFAULT_SWEEP_PERSISTENT_LOCK_WAIT_MILLIS); CleanupFollower follower = CleanupFollower.create(ETE_SCHEMAS); CellsSweeper cellsSweeper = new CellsSweeper(transactionManager, kvs, noLocks, ImmutableList.of(follower)); return new SweepTaskRunner(kvs, ts, ts, txnService, ssm, cellsSweeper); }
@Test public void sentinelsArentAddedIfNoCellsToSweep() { sweeper.sweepCells(TABLE_REFERENCE, ImmutableMultimap.of(), SINGLE_CELL_SET); verify(mockKvs, never()).addGarbageCollectionSentinelValues(TABLE_REFERENCE, SINGLE_CELL_SET); }
TransactionManager transactionManager, PersistentLockManager persistentLockManager) { CellsSweeper cellsSweeper = new CellsSweeper( transactionManager, kvs,
@Test public void ensureNoActionTakenIfNoCellsToSweep() { sweeper.sweepCells(TABLE_REFERENCE, ImmutableMultimap.of(), ImmutableSet.of()); verify(mockKvs, never()).delete(any(), any()); verify(mockKvs, never()).addGarbageCollectionSentinelValues(any(), any()); verify(mockPlm, never()).acquirePersistentLockWithRetry(); }
SweepTestUtils.getPersistentLockService(kvs), AtlasDbConstants.DEFAULT_SWEEP_PERSISTENT_LOCK_WAIT_MILLIS); CellsSweeper cellsSweeper = new CellsSweeper(txManager, kvs, persistentLockManager, ImmutableList.of()); SweepTaskRunner sweepRunner = new SweepTaskRunner(kvs, TS_SUPPLIER, TS_SUPPLIER, txService, ssm, cellsSweeper); LegacySweepMetrics sweepMetrics = new LegacySweepMetrics(metricsManager.getRegistry());
@Test public void ensureCellSweepDeletesCells() { sweeper.sweepCells(TABLE_REFERENCE, SINGLE_CELL_TS_PAIR, ImmutableSet.of()); verify(mockKvs).delete(TABLE_REFERENCE, SINGLE_CELL_TS_PAIR); }
@Provides @Singleton public SweepTaskRunner provideSweepTaskRunner(SerializableTransactionManager txm, @Named("kvs") KeyValueService kvs, TransactionService transactionService, SweepStrategyManager sweepStrategyManager, Follower follower, PersistentLockManager persistentLockManager, ServicesConfig config) { return new SweepTaskRunner( kvs, txm::getUnreadableTimestamp, txm::getImmutableTimestamp, transactionService, sweepStrategyManager, new CellsSweeper( txm, kvs, persistentLockManager, ImmutableList.of(follower))); }
@Test public void releaseTheBackupLockAfterDeleteAndAddingSentinels() { sweeper.sweepCells(TABLE_REFERENCE, SINGLE_CELL_TS_PAIR, SINGLE_CELL_SET); InOrder ordering = inOrder(mockPlm, mockKvs); ordering.verify(mockKvs, atLeastOnce()).addGarbageCollectionSentinelValues(TABLE_REFERENCE, SINGLE_CELL_SET); ordering.verify(mockKvs, atLeastOnce()).delete(TABLE_REFERENCE, SINGLE_CELL_TS_PAIR); ordering.verify(mockPlm, times(1)).releasePersistentLock(); }
@Provides @Singleton public SweepTaskRunner provideSweepTaskRunner(SerializableTransactionManager txm, @Named("kvs") KeyValueService kvs, TransactionService transactionService, SweepStrategyManager sweepStrategyManager, Follower follower, PersistentLockManager persistentLockManager, ServicesConfig config) { LongSupplier unreadable = unreadableTs.orElse(txm::getUnreadableTimestamp); LongSupplier immutable = immutableTs.orElse(txm::getImmutableTimestamp); return new SweepTaskRunner( kvs, unreadable, immutable, transactionService, sweepStrategyManager, new CellsSweeper( txm, kvs, persistentLockManager, ImmutableList.of(follower))); }
@Test public void acquireTheBackupLockBeforeDeletingButAfterAddingSentinels() { sweeper.sweepCells(TABLE_REFERENCE, SINGLE_CELL_TS_PAIR, SINGLE_CELL_SET); InOrder ordering = inOrder(mockPlm, mockKvs); ordering.verify(mockKvs, atLeastOnce()).addGarbageCollectionSentinelValues(TABLE_REFERENCE, SINGLE_CELL_SET); ordering.verify(mockPlm, times(1)).acquirePersistentLockWithRetry(); ordering.verify(mockKvs, atLeastOnce()).delete(TABLE_REFERENCE, SINGLE_CELL_TS_PAIR); }