private void buildHoldingCleanupTracker() { if (logs.size() <= 1) { // we only have one wal, so nothing to do holdingCleanupTracker.reset(); return; } // compute the holding tracker. // - the first WAL is used for the 'updates' // - the other WALs are scanned to remove procs already in other wals. // TODO: exit early if holdingCleanupTracker.isEmpty() holdingCleanupTracker.resetTo(logs.getFirst().getTracker(), true); holdingCleanupTracker.setDeletedIfSet(storeTracker); for (int i = 1, size = logs.size() - 1; i < size; ++i) { holdingCleanupTracker.setDeletedIfSet(logs.get(i).getTracker()); } }
private void updateStoreTracker(final PushType type, final long procId, final long[] subProcIds) { switch (type) { case INSERT: if (subProcIds == null) { storeTracker.insert(procId); } else if (procId == Procedure.NO_PROC_ID) { storeTracker.insert(subProcIds); } else { storeTracker.insert(procId, subProcIds); holdingCleanupTracker.setDeletedIfSet(procId); } break; case UPDATE: storeTracker.update(procId); holdingCleanupTracker.setDeletedIfSet(procId); break; case DELETE: if (subProcIds != null && subProcIds.length > 0) { storeTracker.delete(subProcIds); holdingCleanupTracker.setDeletedIfSet(subProcIds); } else { storeTracker.delete(procId); holdingCleanupTracker.setDeletedIfSet(procId); } break; default: throw new RuntimeException("invalid push type " + type); } }
@Test public void testSetDeletedIfSet() { final ProcedureStoreTracker tracker = new ProcedureStoreTracker(); final long[] procIds = new long[] { 1, 3, 7, 152, 512, 1024, 1025 }; // test single proc for (int i = 0; i < procIds.length; ++i) { tracker.insert(procIds[i]); } assertEquals(false, tracker.isEmpty()); for (int i = 0; i < procIds.length; ++i) { tracker.setDeletedIfSet(procIds[i] - 1); tracker.setDeletedIfSet(procIds[i]); tracker.setDeletedIfSet(procIds[i] + 1); } assertEquals(true, tracker.isEmpty()); // test batch tracker.reset(); for (int i = 0; i < procIds.length; ++i) { tracker.insert(procIds[i]); } assertEquals(false, tracker.isEmpty()); tracker.setDeletedIfSet(procIds); assertEquals(true, tracker.isEmpty()); } }