@Test public void consistencyCheckDeletedWithActiveDeletion() throws Exception { Cluster cluster = new Cluster("cluster1"); BlobStore s = cluster.blobStore; BlobIdTracker tracker = (BlobIdTracker) ((BlobTrackingStore) s).getTracker(); DataStoreState state = init(cluster.nodeStore, 0); // Directly delete from blobstore ArrayList<String> blobs = Lists.newArrayList(state.blobsPresent); String removedId = blobs.remove(0); ((DataStoreBlobStore) s).deleteChunks(Lists.newArrayList(removedId), 0); state.blobsPresent = Sets.newHashSet(blobs); File f = folder.newFile(); writeStrings(Lists.newArrayList(removedId).iterator(), f, false); tracker.remove(f); List<String> addlAdded = doActiveDelete(cluster.nodeStore, (DataStoreBlobStore) cluster.blobStore, tracker, folder,0, 2); List<String> addlPresent = Lists.newArrayList(addlAdded.get(2), addlAdded.get(3)); state.blobsPresent.addAll(addlPresent); state.blobsAdded.addAll(addlPresent); // Only the missing blob should be reported and not the active deletions assertEquals(1, cluster.gc.checkConsistency()); }
private List<String> doActiveDelete(NodeStore nodeStore, DataStoreBlobStore blobStore, BlobIdTracker tracker, TemporaryFolder folder, int delIdx, int num) throws Exception { List<String> set = Lists.newArrayList(); NodeBuilder a = nodeStore.getRoot().builder(); int number = 4; for (int i = 0; i < number; i++) { Blob b = nodeStore.createBlob(randomStream(i, 90)); a.child("cactive" + i).setProperty("x", b); set.add(b.getContentIdentity()); } nodeStore.merge(a, INSTANCE, EMPTY); List<String> deleted = Lists.newArrayList(); //a = nodeStore.getRoot().builder(); for(int idx = delIdx; idx < delIdx + num; idx++) { blobStore.deleteChunks(Lists.newArrayList(set.get(idx)), 0); deleted.add(set.get(idx)); a.child("cactive" + idx).remove(); } nodeStore.merge(a, INSTANCE, EMPTY); File f = folder.newFile(); writeStrings(deleted.iterator(), f, false); tracker.remove(f, BlobTracker.Options.ACTIVE_DELETION); return set; }