public static BlobCollectionType get(GarbageCollectableBlobStore blobStore) { if (blobStore instanceof BlobTrackingStore) { BlobTracker tracker = ((BlobTrackingStore) blobStore).getTracker(); if (tracker != null) { return TRACKER; } } return DEFAULT; }
public static BlobCollectionType get(GarbageCollectableBlobStore blobStore) { if (blobStore instanceof BlobTrackingStore) { BlobTracker tracker = ((BlobTrackingStore) blobStore).getTracker(); if (tracker != null) { return TRACKER; } } return DEFAULT; }
public static BlobCollectionType get(GarbageCollectableBlobStore blobStore) { if (blobStore instanceof BlobTrackingStore) { BlobTracker tracker = ((BlobTrackingStore) blobStore).getTracker(); if (tracker != null) { return TRACKER; } } return DEFAULT; }
@Override public BlobTracker getTracker() { if (delegate instanceof BlobTrackingStore) { return ((BlobTrackingStore) delegate).getTracker(); } return null; }
@Override void track(GarbageCollectableBlobStore blobStore, GarbageCollectorFileState fs) { try { File f = File.createTempFile("blobiddownload", null); copyFile(fs.getAvailableRefs(), f); ((BlobTrackingStore) blobStore).getTracker().add(f); } catch (IOException e) { LOG.warn("Unable to track blob ids locally"); } }
@Override void track(GarbageCollectableBlobStore blobStore, GarbageCollectorFileState fs) { try { File f = File.createTempFile("blobiddownload", null); copyFile(fs.getAvailableRefs(), f); ((BlobTrackingStore) blobStore).getTracker().add(f); } catch (IOException e) { LOG.warn("Unable to track blob ids locally"); } }
@Override void track(GarbageCollectableBlobStore blobStore, GarbageCollectorFileState fs) { try { File f = File.createTempFile("blobiddownload", null); copyFile(fs.getAvailableRefs(), f); ((BlobTrackingStore) blobStore).getTracker().add(f); } catch (IOException e) { LOG.warn("Unable to track blob ids locally"); } }
@Override void retrieve(GarbageCollectableBlobStore blobStore, GarbageCollectorFileState fs, int batchCount) throws Exception { ((BlobTrackingStore) blobStore).getTracker() .get(fs.getAvailableRefs().getAbsolutePath()); }
@Override void retrieve(GarbageCollectableBlobStore blobStore, GarbageCollectorFileState fs, int batchCount) throws Exception { ((BlobTrackingStore) blobStore).getTracker() .get(fs.getAvailableRefs().getAbsolutePath()); }
@Override void retrieve(GarbageCollectableBlobStore blobStore, GarbageCollectorFileState fs, int batchCount) throws Exception { ((BlobTrackingStore) blobStore).getTracker() .get(fs.getAvailableRefs().getAbsolutePath()); }
@Override void handleRemoves(GarbageCollectableBlobStore blobStore, File removedIds, File markedRefs) throws IOException { BlobTrackingStore store = (BlobTrackingStore) blobStore; BlobIdTracker tracker = (BlobIdTracker) store.getTracker(); tracker.remove(removedIds); tracker.getDeleteTracker().reconcile(markedRefs); }
@Override void handleRemoves(GarbageCollectableBlobStore blobStore, File removedIds, File markedRefs) throws IOException { BlobTrackingStore store = (BlobTrackingStore) blobStore; BlobIdTracker tracker = (BlobIdTracker) store.getTracker(); tracker.remove(removedIds); tracker.getDeleteTracker().reconcile(markedRefs); }
@Override void handleRemoves(GarbageCollectableBlobStore blobStore, File removedIds, File markedRefs) throws IOException { BlobTrackingStore store = (BlobTrackingStore) blobStore; BlobIdTracker tracker = (BlobIdTracker) store.getTracker(); tracker.remove(removedIds); tracker.getDeleteTracker().reconcile(markedRefs); }
private static void assertTrackedDeleted(Iterator<String> afterDeletions, GarbageCollectableBlobStore blobStore) throws IOException { List<String> afterDeletionIds = newArrayList(afterDeletions); // get the currently tracked ones ArrayList<String> trackedIds = newArrayList(((BlobTrackingStore) blobStore).getTracker().get()); assertEquals("Tracked ids length different from current blob list", trackedIds.size(), afterDeletionIds.size()); assertTrue("Tracked ids different from current blob list", newHashSet(trackedIds).equals(newHashSet(afterDeletionIds))); } }
@Test public void consistencyCheckOnlyActiveDeletion() throws Exception { Cluster cluster = new Cluster("cluster1"); BlobStore s = cluster.blobStore; BlobIdTracker tracker = (BlobIdTracker) ((BlobTrackingStore) s).getTracker(); DataStoreState state = init(cluster.nodeStore, 0); List<String> addlAdded = doActiveDelete(cluster.nodeStore, (DataStoreBlobStore) cluster.blobStore, tracker, folder,0, 2); List<String> addlPresent = Lists.newArrayList(addlAdded.get(2), addlAdded.get(3)); List<String> activeDeleted = Lists.newArrayList(addlAdded.get(0), addlAdded.get(1)); state.blobsPresent.addAll(addlPresent); state.blobsAdded.addAll(addlPresent); // Since datastore in consistent state and only active deletions the missing list should be empty assertEquals(0, cluster.gc.checkConsistency()); }
@Test public void consistencyCheckNoActiveDeletion() throws Exception { File tmpFolder = folder.newFolder(); String previousTmp = System.setProperty(JAVA_IO_TMPDIR.key(), tmpFolder.getAbsolutePath()); try { Cluster cluster = new Cluster("cluster1"); BlobStore s = cluster.blobStore; BlobIdTracker tracker = (BlobIdTracker) ((BlobTrackingStore) s).getTracker(); DataStoreState state = init(cluster.nodeStore, 0); // Since datastore in consistent state and only active deletions the missing list should be empty assertEquals(0, cluster.gc.checkConsistency()); assertTrue(FileUtils.listFiles(tmpFolder, null, true).size() == 0); } finally { if (previousTmp != null) { System.setProperty(JAVA_IO_TMPDIR.key(), previousTmp); } else { System.clearProperty(JAVA_IO_TMPDIR.key()); } } }
@Test public void reRegisterBlobTrackingStore() throws Exception { registerNodeStoreService(); assertServiceNotActivated(); registerTrackingBlobStore(); assertServiceActivated(); BlobStore blobStore = context.getService(BlobStore.class); assertTrue(blobStore instanceof BlobTrackingStore); BlobTrackingStore trackingStore = (BlobTrackingStore) blobStore; assertNotNull(trackingStore.getTracker()); BlobTracker oldTracker = trackingStore.getTracker(); unregisterNodeStoreService(); registerNodeStoreService(); blobStore = context.getService(BlobStore.class); trackingStore = (BlobTrackingStore) blobStore; BlobTracker newTracker = trackingStore.getTracker(); assertNotEquals(oldTracker, newTracker); assertTrackerReinitialized(); }
@Test public void registerBlobTrackingStore() throws Exception { registerNodeStoreService(); assertServiceNotActivated(); registerTrackingBlobStore(); assertServiceActivated(); BlobStore blobStore = context.getService(BlobStore.class); assertTrue(blobStore instanceof BlobTrackingStore); BlobTrackingStore trackingStore = (BlobTrackingStore) blobStore; assertNotNull(trackingStore.getTracker()); }
@Test public void gc() throws Exception { Cluster cluster = new Cluster("cluster1"); BlobStore s = cluster.blobStore; BlobIdTracker tracker = (BlobIdTracker) ((BlobTrackingStore) s).getTracker(); DataStoreState state = init(cluster.nodeStore, 0); ScheduledFuture<?> scheduledFuture = newSingleThreadScheduledExecutor() .schedule(tracker.new SnapshotJob(), 0, MILLISECONDS); scheduledFuture.get(); // All blobs added should be tracked now assertEquals(state.blobsAdded, retrieveTracked(tracker)); cluster.gc.collectGarbage(false); Set<String> existingAfterGC = iterate(s); // Check the state of the blob store after gc assertEquals(state.blobsPresent, existingAfterGC); // Tracked blobs should reflect deletions after gc assertEquals(state.blobsPresent, retrieveTracked(tracker)); }
@Test public void gcWithInlined() throws Exception { Cluster cluster = new Cluster("cluster1"); BlobStore s = cluster.blobStore; BlobIdTracker tracker = (BlobIdTracker) ((BlobTrackingStore) s).getTracker(); DataStoreState state = init(cluster.nodeStore, 0); addInlined(cluster.nodeStore); ScheduledFuture<?> scheduledFuture = newSingleThreadScheduledExecutor() .schedule(tracker.new SnapshotJob(), 0, MILLISECONDS); scheduledFuture.get(); // All blobs added should be tracked now assertEquals(state.blobsAdded, retrieveTracked(tracker)); cluster.gc.collectGarbage(false); Set<String> existingAfterGC = iterate(s); // Check the state of the blob store after gc assertEquals(state.blobsPresent, existingAfterGC); // Tracked blobs should reflect deletions after gc assertEquals(state.blobsPresent, retrieveTracked(tracker)); }