Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java (revision 9f1e8bdc6c91ba750ac1eea540fe59ac89ef9114) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/ReadOnlyFileStore.java (date 1535624179000) @@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.segment.file; import static org.apache.jackrabbit.oak.segment.DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder; +import static org.apache.jackrabbit.oak.segment.file.Reclaimers.newOldReclaimer; import java.io.IOException; import java.util.ArrayList; @@ -28,6 +29,7 @@ import java.util.UUID; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; +import java.util.function.Consumer; import com.google.common.io.Closer; import com.google.common.util.concurrent.UncheckedExecutionException; @@ -35,6 +37,7 @@ import org.apache.jackrabbit.oak.segment.Segment; import org.apache.jackrabbit.oak.segment.SegmentId; import org.apache.jackrabbit.oak.segment.SegmentWriter; +import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions; import org.apache.jackrabbit.oak.segment.file.tar.TarFiles; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; @@ -55,6 +58,7 @@ @NotNull private final SegmentWriter writer; + private final int gcRetainedGenerations; private ReadOnlyRevisions revisions; @@ -75,6 +79,8 @@ .build(); writer = defaultSegmentWriterBuilder("read-only").withoutCache().build(this); + gcRetainedGenerations = builder.getGcOptions().getRetainedGenerations(); + log.info("TarMK ReadOnly opened: {} (mmap={})", directory, memoryMapping); } @@ -165,4 +171,10 @@ public Set getReferencedSegmentIds() { return tracker.getReferencedSegmentIds(); } + + @Override + public void collectBlobReferences(Consumer collector) throws IOException { + tarFiles.collectBlobReferences(collector, + newOldReclaimer(SegmentGCOptions.GCType.FULL, revisions.getHead().getSegmentId().getGcGeneration(), gcRetainedGenerations)); + } } Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlobReferenceRetriever.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlobReferenceRetriever.java (revision 9f1e8bdc6c91ba750ac1eea540fe59ac89ef9114) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBlobReferenceRetriever.java (date 1535624179000) @@ -23,7 +23,7 @@ import org.apache.jackrabbit.oak.plugins.blob.BlobReferenceRetriever; import org.apache.jackrabbit.oak.plugins.blob.ReferenceCollector; -import org.apache.jackrabbit.oak.segment.file.FileStore; +import org.apache.jackrabbit.oak.segment.file.AbstractFileStore; /** * Implementation of {@link BlobReferenceRetriever} to retrieve blob references from the @@ -31,9 +31,9 @@ */ public class SegmentBlobReferenceRetriever implements BlobReferenceRetriever { - private final FileStore store; + private final AbstractFileStore store; - public SegmentBlobReferenceRetriever(FileStore store) { + public SegmentBlobReferenceRetriever(AbstractFileStore store) { this.store = store; } Index: oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java (revision 9f1e8bdc6c91ba750ac1eea540fe59ac89ef9114) +++ oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java (date 1535624247000) @@ -28,6 +28,7 @@ import java.util.HashSet; import java.util.Set; import java.util.UUID; +import java.util.function.Consumer; import org.apache.jackrabbit.oak.api.jmx.CacheStatsMBean; import org.apache.jackrabbit.oak.segment.CachingSegmentReader; @@ -270,4 +271,17 @@ return new Segment(tracker, segmentReader, id, buffer); } + /** + * Finds all external blob references that are currently accessible + * in this repository and adds them to the given collector. Useful + * for collecting garbage in an external data store. + *

+ * Note that this method only collects blob references that are already + * stored in the repository (at the time when this method is called), so + * the garbage collector will need some other mechanism for tracking + * in-memory references and references stored while this method is + * running. + * @param collector reference collector called back for each blob reference found + */ + public abstract void collectBlobReferences(Consumer collector) throws IOException; }