This is an automated email from the ASF dual-hosted git repository.

jsedding pushed a commit to branch 
jsedding/OAK-12070-segment-remote-memory-consumption
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit 74f4786396561657bf1116ac54ba5202b2f5b356
Author: Julian Sedding <[email protected]>
AuthorDate: Wed Feb 4 14:25:41 2026 +0100

    OAK-12070 - Reduce memory consumption of azure segment stores
    
    - reapply changes reverted in 9bfbce0
    - move org.apache.jackrabbit.oak.segment.file.tar.GCGeneration
      to o.a.j.o.segment.spi.persistence.GCGeneration in order to
      export it
---
 .../oak/segment/aws/AwsSegmentArchiveReader.java   |  63 +++-----
 .../segment/azure/AzureSegmentArchiveReader.java   |  50 ++----
 .../oak/segment/azure/tool/AzureCompact.java       |   2 +-
 .../azure/v8/AzureSegmentArchiveReaderV8.java      |  43 ++---
 .../remote/AbstractRemoteSegmentArchiveReader.java | 105 ++++++++++--
 .../remote/AbstractRemoteSegmentArchiveWriter.java |   6 +-
 .../segment/remote/RemoteSegmentArchiveEntry.java  |  34 ++--
 .../oak/segment/remote/package-info.java           |   2 +-
 .../AbstractRemoteSegmentArchiveReaderTest.java    | 176 +++++++++++++++++++++
 .../remote/RemoteSegmentArchiveEntryTest.java      |  72 +++++++++
 .../oak/backup/impl/FileStoreBackupImpl.java       |   2 +-
 .../oak/backup/impl/FileStoreRestoreImpl.java      |   2 +-
 .../jackrabbit/oak/segment/CommitsTracker.java     |   2 +-
 .../oak/segment/DefaultSegmentWriter.java          |   2 +-
 .../oak/segment/DefaultSegmentWriterBuilder.java   |   2 +-
 .../org/apache/jackrabbit/oak/segment/Record.java  |   2 +-
 .../org/apache/jackrabbit/oak/segment/Segment.java |   4 +-
 .../oak/segment/SegmentBufferWriter.java           |   2 +-
 .../oak/segment/SegmentBufferWriterPool.java       |   2 +-
 .../apache/jackrabbit/oak/segment/SegmentDump.java |   2 +-
 .../apache/jackrabbit/oak/segment/SegmentId.java   |   2 +-
 .../oak/segment/SegmentNodeStoreMonitor.java       |   2 +-
 .../oak/segment/SegmentNodeStoreStats.java         |   2 +-
 .../oak/segment/SegmentWriterFactory.java          |   2 +-
 .../oak/segment/WriteOperationHandler.java         |   2 +-
 .../segment/file/AbstractCompactionStrategy.java   |   2 +-
 .../oak/segment/file/AbstractFileStore.java        |   2 +-
 .../file/AbstractGarbageCollectionStrategy.java    |   2 +-
 .../file/CleanupFirstCompactionStrategy.java       |   2 +-
 .../oak/segment/file/CleanupStrategy.java          |   2 +-
 .../oak/segment/file/CompactionResult.java         |   2 +-
 .../oak/segment/file/CompactionWriter.java         |   2 +-
 .../oak/segment/file/DefaultCleanupContext.java    |   2 +-
 .../oak/segment/file/DefaultCleanupStrategy.java   |   2 +-
 .../jackrabbit/oak/segment/file/FileStore.java     |   2 +-
 .../oak/segment/file/FileStoreBuilder.java         |   2 +-
 .../oak/segment/file/FullCompactionStrategy.java   |   2 +-
 .../jackrabbit/oak/segment/file/GCIncrement.java   |   2 +-
 .../jackrabbit/oak/segment/file/GCJournal.java     |   4 +-
 .../jackrabbit/oak/segment/file/GCListener.java    |   2 +-
 .../oak/segment/file/GarbageCollector.java         |   2 +-
 .../oak/segment/file/PrefixedGCListener.java       |   2 +-
 .../jackrabbit/oak/segment/file/Reclaimers.java    |   2 +-
 .../oak/segment/file/TailCompactionStrategy.java   |   2 +-
 .../oak/segment/file/tar/CleanupContext.java       |   2 +
 .../oak/segment/file/tar/EntryRecovery.java        |   1 +
 .../jackrabbit/oak/segment/file/tar/TarFiles.java  |   3 +-
 .../jackrabbit/oak/segment/file/tar/TarReader.java |   9 +-
 .../jackrabbit/oak/segment/file/tar/TarWriter.java |   1 +
 .../jackrabbit/oak/segment/scheduler/Commit.java   |   2 +-
 .../oak/segment/scheduler/LockBasedScheduler.java  |   2 +-
 .../tar => spi/persistence}/GCGeneration.java      |  31 +++-
 .../spi/persistence/SegmentArchiveReader.java      |  16 ++
 .../CachingSegmentArchiveReader.java               |   7 +
 .../persistence/persistentcache/package-info.java  |   2 +-
 .../split/UnclosedSegmentArchiveReader.java        |   7 +
 .../segment/standby/client/StandbyClientSync.java  |   2 +-
 .../segment/AbstractCompactorExternalBlobTest.java |   4 +-
 .../oak/segment/AbstractCompactorTest.java         |   2 +-
 .../CheckpointCompactorExternalBlobTest.java       |   2 +-
 .../oak/segment/ClassicCompactorTest.java          |   4 +-
 .../jackrabbit/oak/segment/CommitsTrackerTest.java |   4 +-
 .../segment/CompactToDifferentNodeStoreTest.java   |   2 +-
 .../jackrabbit/oak/segment/CompactorTestUtils.java |   2 +-
 .../jackrabbit/oak/segment/NodeRecordTest.java     |   4 +-
 .../segment/ParallelCompactorExternalBlobTest.java |   2 +-
 .../oak/segment/SegmentBufferWriterPoolTest.java   |   2 +-
 .../file/DefaultGarbageCollectionStrategyTest.java |   2 +-
 .../jackrabbit/oak/segment/file/FileStoreIT.java   |   2 +-
 .../segment/file/FullCompactionStrategyTest.java   |   2 +-
 .../file/FullSizeDeltaEstimationStrategyTest.java  |   2 +-
 .../oak/segment/file/GCIncrementTest.java          |   4 +-
 .../jackrabbit/oak/segment/file/GcJournalTest.java |   2 +-
 .../file/LargeNumberOfChildNodeUpdatesIT.java      |   2 +-
 .../oak/segment/file/ReclaimersTest.java           |   4 +-
 .../file/TailSizeDeltaEstimationStrategyTest.java  |   2 +-
 .../oak/segment/file/tar/TarFileTest.java          |   4 +-
 .../oak/segment/file/tar/TarFilesTest.java         |   3 +-
 .../oak/segment/file/tar/TarWriterTest.java        |   2 +-
 .../tar => spi/persistence}/GCGenerationTest.java  |   6 +-
 80 files changed, 556 insertions(+), 219 deletions(-)

diff --git 
a/oak-segment-aws/src/main/java/org/apache/jackrabbit/oak/segment/aws/AwsSegmentArchiveReader.java
 
b/oak-segment-aws/src/main/java/org/apache/jackrabbit/oak/segment/aws/AwsSegmentArchiveReader.java
index 9811cbe380..7b9fb3a97d 100644
--- 
a/oak-segment-aws/src/main/java/org/apache/jackrabbit/oak/segment/aws/AwsSegmentArchiveReader.java
+++ 
b/oak-segment-aws/src/main/java/org/apache/jackrabbit/oak/segment/aws/AwsSegmentArchiveReader.java
@@ -20,7 +20,8 @@ import static 
org.apache.jackrabbit.oak.segment.remote.RemoteUtilities.OFF_HEAP;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.UUID;
+import java.util.Iterator;
+import java.util.NoSuchElementException;
 
 import org.apache.jackrabbit.oak.commons.Buffer;
 import 
org.apache.jackrabbit.oak.segment.remote.AbstractRemoteSegmentArchiveReader;
@@ -31,47 +32,35 @@ public class AwsSegmentArchiveReader extends 
AbstractRemoteSegmentArchiveReader
 
     private final S3Directory directory;
 
-    private final String archiveName;
-
-    private final long length;
-
     AwsSegmentArchiveReader(S3Directory directory, String archiveName, 
IOMonitor ioMonitor) throws IOException {
-        super(ioMonitor);
+        super(ioMonitor, archiveName, createEntryIterable(directory, 
archiveName));
         this.directory = directory;
-        this.archiveName = archiveName;
-        this.length = computeArchiveIndexAndLength();
-    }
-
-    @Override
-    public long length() {
-        return length;
-    }
-
-    @Override
-    public String getName() {
-        return archiveName;
     }
 
-    @Override
-    protected long computeArchiveIndexAndLength() throws IOException {
-        long length = 0;
+    private static Iterable<ArchiveEntry> createEntryIterable(S3Directory 
directory, String archiveName) throws IOException{
         Buffer buffer = directory.readObjectToBuffer(archiveName + ".idx", 
OFF_HEAP);
-        while (buffer.hasRemaining()) {
-            long msb = buffer.getLong();
-            long lsb = buffer.getLong();
-            int position = buffer.getInt();
-            int contentLength = buffer.getInt();
-            int generation = buffer.getInt();
-            int fullGeneration = buffer.getInt();
-            boolean compacted = buffer.get() != 0;
-
-            RemoteSegmentArchiveEntry indexEntry = new 
RemoteSegmentArchiveEntry(msb, lsb, position, contentLength,
-                    generation, fullGeneration, compacted);
-            index.put(new UUID(indexEntry.getMsb(), indexEntry.getLsb()), 
indexEntry);
-            length += contentLength;
-        }
-
-        return length;
+        return () -> new Iterator<>() {
+            @Override
+            public boolean hasNext() {
+                return buffer.hasRemaining();
+            }
+
+            @Override
+            public ArchiveEntry next() {
+                if (!hasNext()) {
+                    throw new NoSuchElementException();
+                }
+
+                long msb = buffer.getLong();
+                long lsb = buffer.getLong();
+                int position = buffer.getInt();
+                int contentLength = buffer.getInt();
+                int generation = buffer.getInt();
+                int fullGeneration = buffer.getInt();
+                boolean compacted = buffer.get() != 0;
+                return new ArchiveEntry(new RemoteSegmentArchiveEntry(msb, 
lsb, position, contentLength, generation, fullGeneration, compacted));
+            }
+        };
     }
 
     @Override
diff --git 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveReader.java
 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveReader.java
index 18ca18f0d6..7a8be8198d 100644
--- 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveReader.java
+++ 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveReader.java
@@ -17,19 +17,17 @@
 package org.apache.jackrabbit.oak.segment.azure;
 
 import com.azure.storage.blob.BlobContainerClient;
-import com.azure.storage.blob.models.BlobItem;
 import com.azure.storage.blob.models.BlobStorageException;
 import com.azure.storage.blob.models.ListBlobsOptions;
 import com.azure.storage.blob.specialized.BlockBlobClient;
 import org.apache.jackrabbit.oak.commons.Buffer;
 import 
org.apache.jackrabbit.oak.segment.remote.AbstractRemoteSegmentArchiveReader;
-import org.apache.jackrabbit.oak.segment.remote.RemoteSegmentArchiveEntry;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor;
+import org.jetbrains.annotations.NotNull;
 
 import java.io.File;
 import java.io.IOException;
 import java.util.Map;
-import java.util.UUID;
 
 import static 
org.apache.jackrabbit.oak.segment.azure.AzureUtilities.readBufferFully;
 
@@ -37,45 +35,29 @@ public class AzureSegmentArchiveReader extends 
AbstractRemoteSegmentArchiveReade
 
     private final BlobContainerClient blobContainerClient;
 
-    private final long length;
-
-    private final String archiveName;
-
     private final String archivePathPrefix;
 
-    AzureSegmentArchiveReader(BlobContainerClient blobContainerClient, String 
rootPrefix, String archiveName, IOMonitor ioMonitor) throws IOException {
-        super(ioMonitor);
+    AzureSegmentArchiveReader(BlobContainerClient blobContainerClient, String 
rootPrefix, String archiveName, IOMonitor ioMonitor) {
+        super(ioMonitor, AzureUtilities.ensureNoTrailingSlash(archiveName),
+                createEntryIterable(blobContainerClient, 
AzureUtilities.asAzurePrefix(rootPrefix, archiveName)));
         this.blobContainerClient = blobContainerClient;
-        this.archiveName = AzureUtilities.ensureNoTrailingSlash(archiveName);
         this.archivePathPrefix = AzureUtilities.asAzurePrefix(rootPrefix, 
archiveName);
-        this.length = computeArchiveIndexAndLength();
-    }
-
-    @Override
-    public long length() {
-        return length;
-    }
-
-    @Override
-    public String getName() {
-        return archiveName;
     }
 
-    @Override
-    protected long computeArchiveIndexAndLength() throws IOException {
-        long length = 0;
+    private static Iterable<ArchiveEntry> 
createEntryIterable(BlobContainerClient blobContainerClient, @NotNull String 
archivePathPrefix) {
         ListBlobsOptions listBlobsOptions = new ListBlobsOptions();
         listBlobsOptions.setPrefix(archivePathPrefix);
-        for (BlobItem blob : AzureUtilities.getBlobs(blobContainerClient, 
listBlobsOptions)) {
-            Map<String, String> metadata = blob.getMetadata();
-            if (AzureBlobMetadata.isSegment(metadata)) {
-                RemoteSegmentArchiveEntry indexEntry = 
AzureBlobMetadata.toIndexEntry(metadata, 
blob.getProperties().getContentLength().intValue());
-                index.put(new UUID(indexEntry.getMsb(), indexEntry.getLsb()), 
indexEntry);
-            }
-            length += blob.getProperties().getContentLength();
-        }
-
-        return length;
+        return AzureUtilities.getBlobs(blobContainerClient, 
listBlobsOptions).stream()
+                .map(blobItem -> {
+                    Map<String, String> metadata = blobItem.getMetadata();
+                    int length = 
blobItem.getProperties().getContentLength().intValue();
+                    if (AzureBlobMetadata.isSegment(metadata)) {
+                        return new 
ArchiveEntry(AzureBlobMetadata.toIndexEntry(metadata, length));
+                    } else {
+                        return new ArchiveEntry(length);
+                    }
+                })
+                ::iterator;
     }
 
     @Override
diff --git 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/AzureCompact.java
 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/AzureCompact.java
index 492e3dbf92..1ec07255b8 100644
--- 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/AzureCompact.java
+++ 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/AzureCompact.java
@@ -36,7 +36,7 @@ import 
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCType;
 import 
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.CompactorType;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.GCJournal;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.spi.persistence.GCJournalFile;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager;
 import 
org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence;
diff --git 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/v8/AzureSegmentArchiveReaderV8.java
 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/v8/AzureSegmentArchiveReaderV8.java
index de69711b6e..7242de4fe2 100644
--- 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/v8/AzureSegmentArchiveReaderV8.java
+++ 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/v8/AzureSegmentArchiveReaderV8.java
@@ -22,54 +22,37 @@ import java.io.File;
 import java.io.IOException;
 import java.net.URISyntaxException;
 import java.util.Map;
-import java.util.UUID;
 
 import com.microsoft.azure.storage.StorageException;
-import com.microsoft.azure.storage.blob.CloudBlob;
 import com.microsoft.azure.storage.blob.CloudBlobDirectory;
 import com.microsoft.azure.storage.blob.CloudBlockBlob;
 
 import org.apache.jackrabbit.oak.commons.Buffer;
 import org.apache.jackrabbit.oak.segment.azure.AzureBlobMetadata;
 import 
org.apache.jackrabbit.oak.segment.remote.AbstractRemoteSegmentArchiveReader;
-import org.apache.jackrabbit.oak.segment.remote.RemoteSegmentArchiveEntry;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor;
 
 public class AzureSegmentArchiveReaderV8 extends 
AbstractRemoteSegmentArchiveReader {
 
     private final CloudBlobDirectory archiveDirectory;
 
-    private final long length;
-
     protected AzureSegmentArchiveReaderV8(CloudBlobDirectory archiveDirectory, 
IOMonitor ioMonitor) throws IOException {
-        super(ioMonitor);
+        super(ioMonitor, AzureUtilitiesV8.getName(archiveDirectory), 
createEntryIterable(archiveDirectory));
         this.archiveDirectory = archiveDirectory;
-        this.length = computeArchiveIndexAndLength();
-    }
-
-    @Override
-    public long length() {
-        return length;
     }
 
-    @Override
-    public String getName() {
-        return AzureUtilitiesV8.getName(archiveDirectory);
-    }
-
-    @Override
-    protected long computeArchiveIndexAndLength() throws IOException {
-        long length = 0;
-        for (CloudBlob blob : AzureUtilitiesV8.getBlobs(archiveDirectory)) {
-            Map<String, String> metadata = blob.getMetadata();
-            if (AzureBlobMetadata.isSegment(metadata)) {
-                RemoteSegmentArchiveEntry indexEntry = 
AzureBlobMetadata.toIndexEntry(metadata, (int) 
blob.getProperties().getLength());
-                index.put(new UUID(indexEntry.getMsb(), indexEntry.getLsb()), 
indexEntry);
-            }
-            length += blob.getProperties().getLength();
-        }
-
-        return length;
+    private static Iterable<ArchiveEntry> 
createEntryIterable(CloudBlobDirectory archiveDirectory) throws IOException {
+        return AzureUtilitiesV8.getBlobs(archiveDirectory).stream()
+                .map(blob -> {
+                    Map<String, String> metadata = blob.getMetadata();
+                    int length = (int) blob.getProperties().getLength();
+                    if (AzureBlobMetadata.isSegment(metadata)) {
+                        return new 
ArchiveEntry(AzureBlobMetadata.toIndexEntry(metadata, length));
+                    } else {
+                        return new ArchiveEntry(length);
+                    }
+                })
+                ::iterator;
     }
 
     @Override
diff --git 
a/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveReader.java
 
b/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveReader.java
index fe99490e18..a289d39ee7 100644
--- 
a/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveReader.java
+++ 
b/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveReader.java
@@ -30,20 +30,53 @@ import org.jetbrains.annotations.Nullable;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.ArrayList;
-import java.util.LinkedHashMap;
+import java.util.Collections;
+import java.util.Comparator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 public abstract class AbstractRemoteSegmentArchiveReader implements 
SegmentArchiveReader {
+
     protected final IOMonitor ioMonitor;
 
-    protected final Map<UUID, RemoteSegmentArchiveEntry> index = new 
LinkedHashMap<>();
+    /**
+     * Unordered immutable map of segment UUIDs to their corresponding archive 
entries.
+     */
+    private final Map<UUID, RemoteSegmentArchiveEntry> index;
+
+    /**
+     * The name of the archive.
+     */
+    private final String archiveName;
 
-    public AbstractRemoteSegmentArchiveReader(IOMonitor ioMonitor) throws 
IOException {
+    /**
+     * The total size of the archive in bytes.
+     */
+    private final long length;
+
+    protected AbstractRemoteSegmentArchiveReader(IOMonitor ioMonitor, String 
archiveName, Iterable<ArchiveEntry> entries) {
         this.ioMonitor = ioMonitor;
+        this.archiveName = archiveName;
+
+        IndexBuilder indexBuilder = new IndexBuilder();
+        entries.forEach(indexBuilder::addEntry);
+        this.index = indexBuilder.createIndex();
+        this.length = indexBuilder.getLength();
+    }
+
+    @Override
+    public @NotNull String getName() {
+        return archiveName;
+    }
+
+    @Override
+    public long length() {
+        return length;
     }
 
     @Override
@@ -73,9 +106,16 @@ public abstract class AbstractRemoteSegmentArchiveReader 
implements SegmentArchi
         return index.containsKey(new UUID(msb, lsb));
     }
 
+    @Override
+    public Set<UUID> getSegmentUUIDs() {
+        return Collections.unmodifiableSet(index.keySet());
+    }
+
     @Override
     public List<SegmentArchiveEntry> listSegments() {
-        return new ArrayList<>(index.values());
+        return index.values().stream()
+                
.sorted(Comparator.comparing(RemoteSegmentArchiveEntry::getPosition))
+                .collect(Collectors.toList());
     }
 
     @Override
@@ -102,12 +142,6 @@ public abstract class AbstractRemoteSegmentArchiveReader 
implements SegmentArchi
         return size;
     }
 
-    /**
-     * Populates the archive index, summing up each entry's length.
-     * @return length, the total length of the archive
-     */
-    protected abstract long computeArchiveIndexAndLength() throws IOException;
-
     /**
      * Reads the segment from the remote storage.
      * @param segmentFileName, the name of the segment (msb + lsb) prefixed by 
its position in the archive
@@ -132,4 +166,53 @@ public abstract class AbstractRemoteSegmentArchiveReader 
implements SegmentArchi
     public boolean isRemote() {
         return true;
     }
+
+    protected static final class ArchiveEntry {
+
+        private final RemoteSegmentArchiveEntry entry;
+
+        private final int length;
+
+        public ArchiveEntry(RemoteSegmentArchiveEntry entry) {
+            this.entry = entry;
+            this.length = entry.getLength();
+        }
+
+        public ArchiveEntry(int length) {
+            this.entry = null;
+            this.length = length;
+        }
+
+        int getLength() {
+            return length;
+        }
+
+        RemoteSegmentArchiveEntry getRemoteSegmentArchiveEntry() {
+            return entry;
+        }
+    }
+
+    private static final class IndexBuilder {
+
+        private final List<Map.Entry<UUID, RemoteSegmentArchiveEntry>> entries 
= new LinkedList<>();
+
+        private long length = 0;
+
+        private void addEntry(ArchiveEntry entry) {
+            RemoteSegmentArchiveEntry archiveEntry = 
entry.getRemoteSegmentArchiveEntry();
+            if (archiveEntry != null) {
+                this.entries.add(Map.entry(archiveEntry.getUuid(), 
archiveEntry));
+            }
+            this.length += entry.getLength();
+        }
+
+        @SuppressWarnings("unchecked")
+        private Map<UUID, RemoteSegmentArchiveEntry> createIndex() {
+            return Map.ofEntries(entries.toArray(Map.Entry[]::new));
+        }
+
+        private long getLength() {
+            return length;
+        }
+    }
 }
diff --git 
a/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveWriter.java
 
b/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveWriter.java
index eee6d40cbf..3e1964bb26 100644
--- 
a/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveWriter.java
+++ 
b/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveWriter.java
@@ -66,7 +66,7 @@ public abstract class AbstractRemoteSegmentArchiveWriter 
implements SegmentArchi
         } else {
             doWriteArchiveEntry(entry, data, offset, size);
         }
-        index.put(new UUID(msb, lsb), entry);
+        index.put(entry.getUuid(), entry);
 
         totalLength += size;
         monitor.written(size);
@@ -80,7 +80,7 @@ public abstract class AbstractRemoteSegmentArchiveWriter 
implements SegmentArchi
             return segment.get().toBuffer();
         }
 
-        RemoteSegmentArchiveEntry indexEntry = index.get(new UUID(msb, lsb));
+        RemoteSegmentArchiveEntry indexEntry = index.get(uuid);
         if (indexEntry == null) {
             return null;
         }
@@ -95,7 +95,7 @@ public abstract class AbstractRemoteSegmentArchiveWriter 
implements SegmentArchi
         if (segment.isPresent()) {
             return true;
         }
-        return index.containsKey(new UUID(msb, lsb));
+        return index.containsKey(uuid);
     }
 
     @Override
diff --git 
a/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/RemoteSegmentArchiveEntry.java
 
b/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/RemoteSegmentArchiveEntry.java
index f14f793ac7..decc3eb7e5 100644
--- 
a/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/RemoteSegmentArchiveEntry.java
+++ 
b/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/RemoteSegmentArchiveEntry.java
@@ -16,42 +16,36 @@
  */
 package org.apache.jackrabbit.oak.segment.remote;
 
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveEntry;
 
-public class RemoteSegmentArchiveEntry implements SegmentArchiveEntry {
+import java.util.UUID;
 
-    private final long msb;
+public class RemoteSegmentArchiveEntry implements SegmentArchiveEntry {
 
-    private final long lsb;
+    private final UUID uuid;
 
     private final int position;
 
     private final int length;
 
-    private final int generation;
-
-    private final int fullGeneration;
-
-    private final boolean compacted;
+    private final GCGeneration gcGeneration;
 
     public RemoteSegmentArchiveEntry(long msb, long lsb, int position, int 
length, int generation, int fullGeneration, boolean compacted) {
-        this.msb = msb;
-        this.lsb = lsb;
+        this.uuid = new UUID(msb, lsb);
         this.position = position;
         this.length = length;
-        this.generation = generation;
-        this.fullGeneration = fullGeneration;
-        this.compacted = compacted;
+        this.gcGeneration = GCGeneration.newGCGeneration(generation, 
fullGeneration, compacted);
     }
 
     @Override
     public long getMsb() {
-        return msb;
+        return uuid.getMostSignificantBits();
     }
 
     @Override
     public long getLsb() {
-        return lsb;
+        return uuid.getLeastSignificantBits();
     }
 
     public int getPosition() {
@@ -65,16 +59,20 @@ public class RemoteSegmentArchiveEntry implements 
SegmentArchiveEntry {
 
     @Override
     public int getGeneration() {
-        return generation;
+        return gcGeneration.getGeneration();
     }
 
     @Override
     public int getFullGeneration() {
-        return fullGeneration;
+        return gcGeneration.getFullGeneration();
     }
 
     @Override
     public boolean isCompacted() {
-        return compacted;
+        return gcGeneration.isCompacted();
+    }
+
+    UUID getUuid() {
+        return uuid;
     }
 }
diff --git 
a/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/package-info.java
 
b/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/package-info.java
index fd64aa03ce..5c70f9fbe8 100644
--- 
a/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/package-info.java
+++ 
b/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/package-info.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 @Internal(since = "1.0.0")
-@Version("2.0.0")
+@Version("3.0.0")
 package org.apache.jackrabbit.oak.segment.remote;
 
 import org.apache.jackrabbit.oak.commons.annotations.Internal;
diff --git 
a/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveReaderTest.java
 
b/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveReaderTest.java
new file mode 100644
index 0000000000..09902031c7
--- /dev/null
+++ 
b/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveReaderTest.java
@@ -0,0 +1,176 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.segment.remote;
+
+import org.apache.jackrabbit.oak.commons.Buffer;
+import org.apache.jackrabbit.oak.segment.file.tar.SegmentGraph;
+import 
org.apache.jackrabbit.oak.segment.remote.AbstractRemoteSegmentArchiveReader.ArchiveEntry;
+import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter;
+import org.junit.Before;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Random;
+import java.util.Set;
+import java.util.UUID;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+public class AbstractRemoteSegmentArchiveReaderTest {
+
+    private static class TestSegmentArchiveReader extends 
AbstractRemoteSegmentArchiveReader {
+
+        public TestSegmentArchiveReader(String archiveName, 
Iterable<ArchiveEntry> entries) {
+            super(new IOMonitorAdapter(), archiveName, entries);
+        }
+
+        @Override
+        protected void doReadSegmentToBuffer(String segmentFileName, Buffer 
buffer) throws IOException {
+            for (int i = 0; i < buffer.limit(); i++) {
+                buffer.put((byte) 1);
+            }
+        }
+
+        @Override
+        protected Buffer doReadDataFile(String extension) throws IOException {
+            return null;
+        }
+
+        @Override
+        protected File archivePathAsFile() {
+            return new File(getName());
+        }
+
+    }
+
+    private static final List<UUID> SEGMENT_UUIDS = List.of(
+            new UUID(0L, 0L),
+            new UUID(0L, 1L),
+            new UUID(0L, 2L),
+            new UUID(0L, 3L),
+            new UUID(0L, 4L)
+    );
+
+    private TestSegmentArchiveReader reader;
+
+    @Before
+    public void setup() {
+
+        ArrayList<ArchiveEntry> archiveEntries = new 
ArrayList<>(SEGMENT_UUIDS.size() + 2);
+        archiveEntries.add(new ArchiveEntry(15));
+        archiveEntries.add(new ArchiveEntry(35));
+        for (int i = 0; i < SEGMENT_UUIDS.size(); i++) {
+            UUID uuid = SEGMENT_UUIDS.get(i);
+            archiveEntries.add(new ArchiveEntry(new 
RemoteSegmentArchiveEntry(uuid.getMostSignificantBits(), 
uuid.getLeastSignificantBits(), i, 20, 0, 0, true)));
+        }
+
+        // sort in random order to make sure the reader sorts them correctly 
by their position
+        Random random = new Random();
+        archiveEntries.sort(Comparator.comparing(e -> random.nextInt(2) - 1));
+
+        reader = new TestSegmentArchiveReader("data00000a.tar", 
archiveEntries);
+    }
+
+    @Test
+    public void testReadSegment() throws IOException {
+        Buffer buffer = reader.readSegment(0L, 1L);
+        assertNotNull(buffer);
+        assertEquals(20, buffer.limit());
+        for (int i = 0; i < buffer.limit(); i++) {
+            assertEquals(1, buffer.get(i));
+        }
+    }
+
+    @Test
+    public void testReadNonExistentSegment() throws IOException {
+        Buffer buffer = reader.readSegment(1L, 3L);
+        assertNull(buffer);
+    }
+
+    @Test
+    public void testGetArchiveSize() {
+        assertEquals(150, reader.length());
+    }
+
+    @Test
+    public void testIsRemote() {
+        assertTrue(reader.isRemote());
+    }
+
+    @Test
+    public void testGetEntrySize() {
+        assertEquals(10, reader.getEntrySize(10));
+        assertEquals(20, reader.getEntrySize(20));
+    }
+
+    @Test
+    public void testGetBinaryReferences() throws IOException {
+        assertNull(reader.getBinaryReferences());
+    }
+
+    @Test
+    public void testGetGraph() throws IOException {
+        SegmentGraph graph = reader.getGraph();
+        assertNotNull(graph);
+    }
+
+    @Test
+    public void testGetName() {
+        assertEquals("data00000a.tar", reader.getName());
+    }
+
+    @Test
+    public void testClose() {
+        try {
+            reader.close();
+        } catch (Exception e) {
+            fail("Close should not throw an exception");
+        }
+    }
+
+    @Test
+    public void testContainsSegment() {
+        SEGMENT_UUIDS.forEach(uuid -> 
assertTrue(reader.containsSegment(uuid.getMostSignificantBits(), 
uuid.getLeastSignificantBits())));
+        assertFalse(reader.containsSegment(1L, 3L));
+    }
+
+    @Test
+    public void testListSegments() {
+        var segments = reader.listSegments();
+        assertEquals(5, segments.size());
+        segments.forEach(e -> assertEquals(0L, e.getMsb()));
+        for (int i = 0; i < segments.size(); i++) {
+            assertEquals(i, segments.get(i).getLsb()); // LSBs are set up to 
be the same as the position
+        }
+    }
+
+    @Test
+    public void testGetSegmentUUIDs() {
+        assertEquals(Set.copyOf(SEGMENT_UUIDS), reader.getSegmentUUIDs());
+    }
+}
diff --git 
a/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/RemoteSegmentArchiveEntryTest.java
 
b/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/RemoteSegmentArchiveEntryTest.java
new file mode 100644
index 0000000000..9cf66524cb
--- /dev/null
+++ 
b/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/RemoteSegmentArchiveEntryTest.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.jackrabbit.oak.segment.remote;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertSame;
+import static org.junit.Assert.assertTrue;
+
+public class RemoteSegmentArchiveEntryTest {
+
+    private final RemoteSegmentArchiveEntry entry = new 
RemoteSegmentArchiveEntry(1L, 2L, 0, 128, 3, 4, true);
+
+    @Test
+    public void getMsb() {
+        assertEquals(1, entry.getMsb());
+    }
+
+    @Test
+    public void getLsb() {
+        assertEquals(2, entry.getLsb());
+    }
+
+    @Test
+    public void getPosition() {
+        assertEquals(0, entry.getPosition());
+    }
+
+    @Test
+    public void getLength() {
+        assertEquals(128, entry.getLength());
+    }
+
+    @Test
+    public void getGeneration() {
+        assertEquals(3, entry.getGeneration());
+    }
+
+    @Test
+    public void getFullGeneration() {
+        assertEquals(4, entry.getFullGeneration());
+    }
+
+    @Test
+    public void isCompacted() {
+        assertTrue(entry.isCompacted());
+    }
+
+    @Test
+    public void getUuid() {
+        assertSame("The same UUID instance must be returned for different 
calls", entry.getUuid(), entry.getUuid());
+        assertEquals(entry.getMsb(), entry.getUuid().getMostSignificantBits());
+        assertEquals(entry.getLsb(), 
entry.getUuid().getLeastSignificantBits());
+    }
+}
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java
index 3ea8e166bc..a01bdac8e0 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreBackupImpl.java
@@ -41,7 +41,7 @@ import 
org.apache.jackrabbit.oak.segment.file.GCNodeWriteMonitor;
 import org.apache.jackrabbit.oak.segment.file.CompactionWriter;
 import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.file.tooling.BasicReadOnlyBlobStore;
 import org.jetbrains.annotations.NotNull;
 import org.slf4j.Logger;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java
index eb3f5c2813..c2867dc3cc 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/backup/impl/FileStoreRestoreImpl.java
@@ -38,7 +38,7 @@ import 
org.apache.jackrabbit.oak.segment.file.CompactionWriter;
 import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
 import org.apache.jackrabbit.oak.segment.file.ReadOnlyFileStore;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.java
index 9e89324e2d..780b18a228 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/CommitsTracker.java
@@ -30,7 +30,7 @@ import java.util.concurrent.ConcurrentMap;
 import java.util.function.Supplier;
 
 import org.apache.commons.collections4.map.LRUMap;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
index 1f2f7fa1e1..3cc4e19ca0 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriter.java
@@ -64,7 +64,7 @@ import org.apache.jackrabbit.oak.plugins.blob.BlobStoreBlob;
 import org.apache.jackrabbit.oak.plugins.memory.ModifiedNodeState;
 import org.apache.jackrabbit.oak.segment.RecordWriters.RecordWriter;
 import org.apache.jackrabbit.oak.segment.WriteOperationHandler.WriteOperation;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.state.DefaultNodeStateDiff;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterBuilder.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterBuilder.java
index 54847293e2..1b2d7111e1 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterBuilder.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/DefaultSegmentWriterBuilder.java
@@ -27,7 +27,7 @@ import java.util.function.Supplier;
 import org.apache.jackrabbit.oak.segment.WriterCacheManager.Empty;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.ReadOnlyFileStore;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.memory.MemoryStore;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Record.java 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Record.java
index ae3e8480eb..492f25ddad 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Record.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Record.java
@@ -18,7 +18,7 @@
  */
 package org.apache.jackrabbit.oak.segment;
 
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 
 /**
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
index 498f2aa175..01fd329d1d 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/Segment.java
@@ -27,7 +27,7 @@ import static 
org.apache.jackrabbit.oak.segment.SegmentVersion.LATEST_VERSION;
 import static org.apache.jackrabbit.oak.segment.SegmentVersion.isValid;
 import static 
org.apache.jackrabbit.oak.segment.data.SegmentData.newRawSegmentData;
 import static 
org.apache.jackrabbit.oak.segment.data.SegmentData.newSegmentData;
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 
 import java.io.IOException;
 import java.io.OutputStream;
@@ -44,7 +44,7 @@ import org.apache.jackrabbit.oak.segment.RecordNumbers.Entry;
 import org.apache.jackrabbit.oak.segment.data.RecordIdData;
 import org.apache.jackrabbit.oak.segment.data.SegmentData;
 import org.apache.jackrabbit.oak.segment.data.StringData;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
index a3717ef6b0..380a5e2243 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriter.java
@@ -44,7 +44,7 @@ import java.util.Set;
 import org.apache.commons.io.HexDump;
 import org.apache.jackrabbit.oak.commons.conditions.Validate;
 import org.apache.jackrabbit.oak.segment.RecordNumbers.Entry;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
index 66aad39565..a3b085b6c1 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPool.java
@@ -38,7 +38,7 @@ import java.util.function.Supplier;
 
 import org.apache.jackrabbit.guava.common.util.concurrent.Monitor;
 import org.apache.jackrabbit.oak.commons.conditions.Validate;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 
 /**
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentDump.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentDump.java
index 467f0b9d22..2d97d6b2e3 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentDump.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentDump.java
@@ -29,7 +29,7 @@ import java.util.function.Consumer;
 
 import org.apache.commons.io.output.WriterOutputStream;
 import org.apache.jackrabbit.oak.segment.RecordNumbers.Entry;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 
 class SegmentDump {
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentId.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentId.java
index 07ff89ba28..de74867732 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentId.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentId.java
@@ -24,7 +24,7 @@ import static 
org.apache.jackrabbit.oak.segment.SegmentStore.EMPTY_STORE;
 import java.util.UUID;
 
 import org.apache.jackrabbit.oak.commons.StringUtils;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 import org.slf4j.Logger;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreMonitor.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreMonitor.java
index e710a03751..cf24a5638a 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreMonitor.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreMonitor.java
@@ -21,7 +21,7 @@ package org.apache.jackrabbit.oak.segment;
 
 import java.util.function.Supplier;
 
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 
 /**
  * SegmentNodeStoreMonitor is notified for commit related operations performed 
by SegmentNodeStore.
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStats.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStats.java
index 2ca9d13c28..ddb1c1884c 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStats.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentNodeStoreStats.java
@@ -40,7 +40,7 @@ import javax.management.openmbean.TabularType;
 
 import org.apache.jackrabbit.api.stats.TimeSeries;
 import org.apache.jackrabbit.oak.segment.CommitsTracker.Commit;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.stats.CounterStats;
 import org.apache.jackrabbit.oak.stats.MeterStats;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterFactory.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterFactory.java
index 1eef291c80..10c61c2394 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterFactory.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/SegmentWriterFactory.java
@@ -19,7 +19,7 @@
 
 package org.apache.jackrabbit.oak.segment;
 
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 
 public interface SegmentWriterFactory {
     SegmentWriter newSegmentWriter(GCGeneration generation);
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriteOperationHandler.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriteOperationHandler.java
index faf65c0007..0ab2541a9b 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriteOperationHandler.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/WriteOperationHandler.java
@@ -23,7 +23,7 @@ import java.io.IOException;
 
 import org.jetbrains.annotations.NotNull;
 
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 
 /**
  * A {@code WriteOperationHandler} executes {@link WriteOperation
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractCompactionStrategy.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractCompactionStrategy.java
index 87f0894fc1..fed7b5e494 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractCompactionStrategy.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractCompactionStrategy.java
@@ -39,7 +39,7 @@ import 
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.CompactorTy
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCType;
 import org.apache.jackrabbit.oak.segment.file.cancel.Cancellation;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 import java.io.IOException;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
index 4c7782a61f..bad5068a77 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractFileStore.java
@@ -53,7 +53,7 @@ import org.apache.jackrabbit.oak.segment.SegmentTracker;
 import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.segment.file.preloader.SegmentPreloader;
 import org.apache.jackrabbit.oak.segment.file.tar.EntryRecovery;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
 import org.apache.jackrabbit.oak.segment.file.tar.TarRecovery;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractGarbageCollectionStrategy.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractGarbageCollectionStrategy.java
index df8da28c5f..9278819ad1 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractGarbageCollectionStrategy.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/AbstractGarbageCollectionStrategy.java
@@ -33,7 +33,7 @@ import org.apache.jackrabbit.oak.segment.SegmentTracker;
 import org.apache.jackrabbit.oak.segment.SegmentWriterFactory;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CleanupFirstCompactionStrategy.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CleanupFirstCompactionStrategy.java
index f06655015c..11c63ff9d1 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CleanupFirstCompactionStrategy.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CleanupFirstCompactionStrategy.java
@@ -25,7 +25,7 @@ import java.io.IOException;
 import java.util.List;
 
 import org.apache.jackrabbit.oak.segment.file.tar.CleanupContext;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
 import org.jetbrains.annotations.NotNull;
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CleanupStrategy.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CleanupStrategy.java
index 149075ba3b..c89e062108 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CleanupStrategy.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CleanupStrategy.java
@@ -25,7 +25,7 @@ import java.util.function.Predicate;
 import org.apache.jackrabbit.oak.segment.Revisions;
 import org.apache.jackrabbit.oak.segment.SegmentCache;
 import org.apache.jackrabbit.oak.segment.SegmentTracker;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
 
 interface CleanupStrategy {
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CompactionResult.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CompactionResult.java
index 78bf29f896..99996990e5 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CompactionResult.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CompactionResult.java
@@ -24,7 +24,7 @@ import java.util.function.Predicate;
 
 import org.apache.jackrabbit.oak.segment.RecordId;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 
 /**
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CompactionWriter.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CompactionWriter.java
index cd20a1165f..c8fb1f6e5e 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CompactionWriter.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/CompactionWriter.java
@@ -25,7 +25,7 @@ import org.apache.jackrabbit.oak.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.segment.SegmentReader;
 import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.segment.SegmentWriterFactory;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.jetbrains.annotations.NotNull;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultCleanupContext.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultCleanupContext.java
index 388247d903..d67601aaf3 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultCleanupContext.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultCleanupContext.java
@@ -23,7 +23,7 @@ import org.apache.jackrabbit.oak.segment.RecordId;
 import org.apache.jackrabbit.oak.segment.SegmentId;
 import org.apache.jackrabbit.oak.segment.SegmentTracker;
 import org.apache.jackrabbit.oak.segment.file.tar.CleanupContext;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultCleanupStrategy.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultCleanupStrategy.java
index 3aa8b178db..e694c8f76e 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultCleanupStrategy.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/DefaultCleanupStrategy.java
@@ -26,7 +26,7 @@ import java.io.IOException;
 import java.util.List;
 
 import org.apache.jackrabbit.oak.segment.file.tar.CleanupContext;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
 import org.jetbrains.annotations.NotNull;
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
index 1f4bdc1f38..68a2c3a6cb 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStore.java
@@ -49,7 +49,7 @@ import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.segment.file.ShutDown.ShutDownCloser;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
 import org.apache.jackrabbit.oak.segment.spi.persistence.RepositoryLock;
 import 
org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
index 04e68ae6f5..e37e764f3a 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FileStoreBuilder.java
@@ -44,7 +44,7 @@ import 
org.apache.jackrabbit.oak.segment.SegmentNotFoundExceptionListener;
 import org.apache.jackrabbit.oak.segment.WriterCacheManager;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.segment.file.proc.Proc.Backend;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.file.tar.TarPersistence;
 import org.apache.jackrabbit.oak.segment.spi.monitor.*;
 import 
org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FullCompactionStrategy.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FullCompactionStrategy.java
index 237dbce2fa..a7a73b515b 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FullCompactionStrategy.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/FullCompactionStrategy.java
@@ -23,7 +23,7 @@ import static 
org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState.EMPTY_NODE
 import static 
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCType.FULL;
 
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCType;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 
 class FullCompactionStrategy extends AbstractCompactionStrategy {
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCIncrement.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCIncrement.java
index 8f925ad575..3135a30d62 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCIncrement.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCIncrement.java
@@ -21,7 +21,7 @@ package org.apache.jackrabbit.oak.segment.file;
 
 import org.apache.jackrabbit.oak.segment.SegmentWriter;
 import org.apache.jackrabbit.oak.segment.SegmentWriterFactory;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 
 /**
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java
index 5d0a520a29..6e3d398510 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCJournal.java
@@ -19,7 +19,7 @@
 package org.apache.jackrabbit.oak.segment.file;
 
 import static java.util.Objects.requireNonNull;
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -27,7 +27,7 @@ import java.util.Collection;
 import java.util.List;
 
 import org.apache.jackrabbit.oak.segment.RecordId;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.spi.persistence.GCJournalFile;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCListener.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCListener.java
index 3d01797e44..42cf3711a4 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCListener.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GCListener.java
@@ -19,7 +19,7 @@
 
 package org.apache.jackrabbit.oak.segment.file;
 
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
 import org.jetbrains.annotations.NotNull;
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GarbageCollector.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GarbageCollector.java
index 1b278a7894..a6db420773 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GarbageCollector.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/GarbageCollector.java
@@ -38,7 +38,7 @@ import org.apache.jackrabbit.oak.segment.SegmentWriterFactory;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import 
org.apache.jackrabbit.oak.segment.file.GarbageCollectionStrategy.SuccessfulGarbageCollectionListener;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.jetbrains.annotations.NotNull;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/PrefixedGCListener.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/PrefixedGCListener.java
index 4a0723a4da..8530e2917f 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/PrefixedGCListener.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/PrefixedGCListener.java
@@ -20,7 +20,7 @@ package org.apache.jackrabbit.oak.segment.file;
 
 import java.util.concurrent.atomic.AtomicInteger;
 
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 
 /**
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/Reclaimers.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/Reclaimers.java
index 777ca1aa2b..4c623f8358 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/Reclaimers.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/Reclaimers.java
@@ -21,7 +21,7 @@ import static java.util.Objects.requireNonNull;
 import java.util.function.Predicate;
 
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCType;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 
 /**
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TailCompactionStrategy.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TailCompactionStrategy.java
index e4740c4356..eca7f1f997 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TailCompactionStrategy.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/TailCompactionStrategy.java
@@ -24,7 +24,7 @@ import static 
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCTy
 import org.apache.jackrabbit.oak.segment.RecordId;
 import org.apache.jackrabbit.oak.segment.SegmentNotFoundException;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCType;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 
 class TailCompactionStrategy extends AbstractCompactionStrategy {
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/CleanupContext.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/CleanupContext.java
index 46ea3a2167..31640b97ab 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/CleanupContext.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/CleanupContext.java
@@ -17,6 +17,8 @@
 
 package org.apache.jackrabbit.oak.segment.file.tar;
 
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
+
 import java.util.Collection;
 import java.util.UUID;
 
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/EntryRecovery.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/EntryRecovery.java
index f32342581c..f0c7348365 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/EntryRecovery.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/EntryRecovery.java
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.segment.file.tar;
 
 import org.apache.jackrabbit.oak.segment.Segment;
 import org.apache.jackrabbit.oak.segment.SegmentId;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 
 import java.io.IOException;
 import java.util.Map;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java
index 027da0e8f3..bcb4f99f7b 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarFiles.java
@@ -20,8 +20,6 @@ import static java.util.Collections.emptyMap;
 import static 
org.apache.jackrabbit.oak.commons.conditions.Validate.checkArgument;
 import static java.util.Objects.requireNonNull;
 
-import static java.util.Collections.emptySet;
-
 import java.io.Closeable;
 import java.io.File;
 import java.io.IOException;
@@ -58,6 +56,7 @@ import 
org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitor;
 import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor;
 import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitor;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager;
 import 
org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence;
 import org.apache.jackrabbit.oak.stats.CounterStats;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java
index 28f2e9f396..f9c7382561 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarReader.java
@@ -19,7 +19,7 @@
 package org.apache.jackrabbit.oak.segment.file.tar;
 
 import static java.util.Collections.singletonList;
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 
 import java.io.Closeable;
 import java.io.File;
@@ -39,7 +39,6 @@ import java.util.TreeMap;
 import java.util.UUID;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
-import java.util.stream.Collectors;
 
 import org.apache.jackrabbit.oak.commons.Buffer;
 import org.apache.jackrabbit.oak.segment.Segment;
@@ -48,6 +47,7 @@ import 
org.apache.jackrabbit.oak.segment.file.tar.binaries.BinaryReferencesIndex
 import 
org.apache.jackrabbit.oak.segment.file.tar.binaries.BinaryReferencesIndexLoader;
 import 
org.apache.jackrabbit.oak.segment.file.tar.binaries.InvalidBinaryReferencesIndexException;
 import org.apache.jackrabbit.oak.segment.file.tar.index.IndexEntry;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveEntry;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveReader;
@@ -283,10 +283,7 @@ public class TarReader implements Closeable {
     private TarReader(SegmentArchiveManager archiveManager, 
SegmentArchiveReader archive) {
         this.archiveManager = archiveManager;
         this.archive = archive;
-        this.segmentUUIDs = archive.listSegments()
-                .stream()
-                .map(e -> new UUID(e.getMsb(), e.getLsb()))
-                .collect(Collectors.toUnmodifiableSet());
+        this.segmentUUIDs = archive.getSegmentUUIDs();
     }
 
     long size() {
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriter.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriter.java
index 43516b3379..d9c57c3e4e 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriter.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriter.java
@@ -33,6 +33,7 @@ import org.apache.jackrabbit.oak.commons.Buffer;
 import org.apache.jackrabbit.oak.commons.conditions.Validate;
 import org.apache.jackrabbit.oak.segment.file.UnrecoverableArchiveException;
 import 
org.apache.jackrabbit.oak.segment.file.tar.binaries.BinaryReferencesIndexWriter;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveWriter;
 import org.apache.jackrabbit.oak.stats.CounterStats;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/Commit.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/Commit.java
index 5274757cb0..5e1cf2e3c9 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/Commit.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/Commit.java
@@ -23,7 +23,7 @@ import static java.util.Objects.requireNonNull;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.segment.SegmentNodeBuilder;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.commit.CommitHook;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.state.ConflictAnnotatingRebaseDiff;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java
index 2364276e1d..65cfc3d200 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/scheduler/LockBasedScheduler.java
@@ -45,7 +45,7 @@ import org.apache.jackrabbit.oak.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.segment.SegmentNodeStoreStats;
 import org.apache.jackrabbit.oak.segment.SegmentOverflowException;
 import org.apache.jackrabbit.oak.segment.SegmentReader;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.commit.ChangeDispatcher;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.Observable;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/GCGeneration.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/GCGeneration.java
similarity index 83%
rename from 
oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/GCGeneration.java
rename to 
oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/GCGeneration.java
index d9784d66a9..b85cbfc7b9 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/GCGeneration.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/GCGeneration.java
@@ -15,13 +15,17 @@
  * limitations under the License.
  *
  */
-package org.apache.jackrabbit.oak.segment.file.tar;
+package org.apache.jackrabbit.oak.segment.spi.persistence;
 
 import static java.util.Objects.requireNonNull;
 
+import java.lang.ref.WeakReference;
+import java.util.Collections;
+import java.util.Iterator;
 import java.util.Objects;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
 
-import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveEntry;
 import org.jetbrains.annotations.NotNull;
 
 /**
@@ -54,12 +58,31 @@ public final class GCGeneration {
 
     public static final GCGeneration NULL = new GCGeneration(0, 0, false);
 
+    private static final Set<WeakReference<GCGeneration>> gcGenerations = 
Collections.newSetFromMap(new ConcurrentHashMap<>());
+
     public static GCGeneration newGCGeneration(int generation, int 
fullGeneration, boolean isCompacted) {
-        return new GCGeneration(generation, fullGeneration, isCompacted);
+        Iterator<WeakReference<GCGeneration>> iterator = 
gcGenerations.iterator();
+        GCGeneration gen = null;
+        while(iterator.hasNext()) {
+            WeakReference<GCGeneration> next = iterator.next();
+            GCGeneration gcGeneration = next.get();
+            if (gcGeneration == null) {
+                iterator.remove();
+            } else if (gcGeneration.generation == generation
+                    && gcGeneration.fullGeneration == fullGeneration
+                    && gcGeneration.isCompacted == isCompacted) {
+                gen = gcGeneration;
+            }
+        }
+        if (gen == null) {
+            gen = new GCGeneration(generation, fullGeneration, isCompacted);
+            gcGenerations.add(new WeakReference<>(gen));
+        }
+        return gen;
     }
 
     public static GCGeneration newGCGeneration(SegmentArchiveEntry indexEntry) 
{
-        return new GCGeneration(indexEntry.getGeneration(), 
indexEntry.getFullGeneration(), indexEntry.isCompacted());
+        return newGCGeneration(indexEntry.getGeneration(), 
indexEntry.getFullGeneration(), indexEntry.isCompacted());
     }
 
     private final int generation;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentArchiveReader.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentArchiveReader.java
index 3ac897e65b..8b22150516 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentArchiveReader.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/SegmentArchiveReader.java
@@ -21,6 +21,9 @@ package org.apache.jackrabbit.oak.segment.spi.persistence;
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.List;
+import java.util.Set;
+import java.util.UUID;
+import java.util.stream.Collectors;
 
 import org.apache.jackrabbit.oak.commons.Buffer;
 import org.apache.jackrabbit.oak.segment.file.tar.SegmentGraph;
@@ -52,6 +55,19 @@ public interface SegmentArchiveReader extends Closeable {
      */
     boolean containsSegment(long msb, long lsb);
 
+    /**
+     * Returns an immutable {@code Set} of the UUIDs of all segments contained 
in this archive.
+     * No guarantees are made regarding the iteration order of the elements.
+     *
+     * @return set of segment UUIDs
+     */
+    default Set<UUID> getSegmentUUIDs() {
+        return listSegments()
+                .stream()
+                .map(e -> new UUID(e.getMsb(), e.getLsb()))
+                .collect(Collectors.toUnmodifiableSet());
+    }
+
     /**
      * List all the segments, in the order as they have been written to the 
archive.
      *
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingSegmentArchiveReader.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingSegmentArchiveReader.java
index 8ef42fbf4d..f81eaee782 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingSegmentArchiveReader.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingSegmentArchiveReader.java
@@ -27,6 +27,8 @@ import org.jetbrains.annotations.Nullable;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Set;
+import java.util.UUID;
 
 public class CachingSegmentArchiveReader implements SegmentArchiveReader {
 
@@ -63,6 +65,11 @@ public class CachingSegmentArchiveReader implements 
SegmentArchiveReader {
         return delegate.listSegments();
     }
 
+    @Override
+    public Set<UUID> getSegmentUUIDs() {
+        return delegate.getSegmentUUIDs();
+    }
+
     @Override
     public @NotNull SegmentGraph getGraph() throws IOException {
         return delegate.getGraph();
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/package-info.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/package-info.java
index 611279bc26..0ad0171f1b 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/package-info.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/package-info.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 @Internal(since = "1.0.0")
-@Version("6.0.0")
+@Version("6.1.0")
 package org.apache.jackrabbit.oak.segment.spi.persistence.persistentcache;
 
 import org.apache.jackrabbit.oak.commons.annotations.Internal;
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/split/UnclosedSegmentArchiveReader.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/split/UnclosedSegmentArchiveReader.java
index d6902c757d..f50ffd757c 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/split/UnclosedSegmentArchiveReader.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/split/UnclosedSegmentArchiveReader.java
@@ -18,6 +18,8 @@ package 
org.apache.jackrabbit.oak.segment.spi.persistence.split;
 
 import java.io.IOException;
 import java.util.List;
+import java.util.Set;
+import java.util.UUID;
 
 import org.apache.jackrabbit.oak.commons.Buffer;
 import org.apache.jackrabbit.oak.segment.file.tar.SegmentGraph;
@@ -52,6 +54,11 @@ class UnclosedSegmentArchiveReader implements 
SegmentArchiveReader {
         return delegate.listSegments();
     }
 
+    @Override
+    public Set<UUID> getSegmentUUIDs() {
+        return delegate.getSegmentUUIDs();
+    }
+
     @Override
     public @NotNull SegmentGraph getGraph() throws IOException {
         return delegate.getGraph();
diff --git 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientSync.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientSync.java
index 75f508f21c..1575d55ddd 100644
--- 
a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientSync.java
+++ 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/standby/client/StandbyClientSync.java
@@ -34,7 +34,7 @@ import javax.management.StandardMBean;
 import io.netty.channel.nio.NioEventLoopGroup;
 import org.apache.commons.lang3.concurrent.BasicThreadFactory;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.standby.jmx.ClientStandbyStatusMBean;
 import org.apache.jackrabbit.oak.segment.standby.jmx.StandbyStatusMBean;
 import org.apache.jackrabbit.oak.segment.standby.store.CommunicationObserver;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/AbstractCompactorExternalBlobTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/AbstractCompactorExternalBlobTest.java
index 0172b5f6a2..80ac961811 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/AbstractCompactorExternalBlobTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/AbstractCompactorExternalBlobTest.java
@@ -29,7 +29,7 @@ import static 
org.apache.jackrabbit.oak.segment.CompactorTestUtils.createBlob;
 import static 
org.apache.jackrabbit.oak.segment.CompactorTestUtils.getCheckpointRoot;
 import static org.apache.jackrabbit.oak.segment.SegmentNodeStore.ROOT;
 import static 
org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNotSame;
 
@@ -38,7 +38,7 @@ import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
 import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.test.TemporaryBlobStore;
 import org.apache.jackrabbit.oak.spi.blob.BlobStore;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/AbstractCompactorTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/AbstractCompactorTest.java
index c029240fc2..fd3b4ba325 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/AbstractCompactorTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/AbstractCompactorTest.java
@@ -47,7 +47,7 @@ import org.apache.jackrabbit.oak.segment.file.GCIncrement;
 import org.apache.jackrabbit.oak.segment.file.GCNodeWriteMonitor;
 import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
 import org.jetbrains.annotations.NotNull;
 import org.junit.After;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CheckpointCompactorExternalBlobTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CheckpointCompactorExternalBlobTest.java
index ac3d880819..6b975e8b20 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CheckpointCompactorExternalBlobTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CheckpointCompactorExternalBlobTest.java
@@ -21,7 +21,7 @@ package org.apache.jackrabbit.oak.segment;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.GCNodeWriteMonitor;
 import org.apache.jackrabbit.oak.segment.file.CompactionWriter;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
 import org.jetbrains.annotations.NotNull;
 import org.junit.runner.RunWith;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ClassicCompactorTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ClassicCompactorTest.java
index 66ef3bc34a..bbc86f3678 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ClassicCompactorTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ClassicCompactorTest.java
@@ -20,7 +20,7 @@ package org.apache.jackrabbit.oak.segment;
 import static 
org.apache.jackrabbit.oak.plugins.memory.MultiBinaryPropertyState.binaryPropertyFromBlob;
 import static 
org.apache.jackrabbit.oak.segment.DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder;
 import static 
org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -42,7 +42,7 @@ import 
org.apache.jackrabbit.oak.segment.file.GCNodeWriteMonitor;
 import org.apache.jackrabbit.oak.segment.file.CompactionWriter;
 import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CommitsTrackerTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CommitsTrackerTest.java
index 6401272e3a..056a8aea23 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CommitsTrackerTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CommitsTrackerTest.java
@@ -19,7 +19,7 @@
 package org.apache.jackrabbit.oak.segment;
 
 import static java.lang.Math.min;
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
@@ -30,7 +30,7 @@ import java.util.List;
 import java.util.Map;
 
 import org.apache.jackrabbit.oak.segment.CommitsTracker.Commit;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.junit.Test;
 
 public class CommitsTrackerTest {
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactToDifferentNodeStoreTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactToDifferentNodeStoreTest.java
index 939aeb767e..5adebffe0c 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactToDifferentNodeStoreTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactToDifferentNodeStoreTest.java
@@ -29,7 +29,7 @@ import 
org.apache.jackrabbit.oak.segment.file.GCNodeWriteMonitor;
 import org.apache.jackrabbit.oak.segment.file.InvalidFileStoreVersionException;
 import org.apache.jackrabbit.oak.segment.file.ReadOnlyFileStore;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTestUtils.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTestUtils.java
index 88e1ff74b3..b20833b5eb 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTestUtils.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/CompactorTestUtils.java
@@ -27,7 +27,7 @@ import org.apache.jackrabbit.oak.api.Blob;
 import org.apache.jackrabbit.oak.api.CommitFailedException;
 import org.apache.jackrabbit.oak.segment.file.CompactedNodeState;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java
index 11b970e73a..2b9c0ef27a 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/NodeRecordTest.java
@@ -17,7 +17,7 @@
 package org.apache.jackrabbit.oak.segment;
 
 import static 
org.apache.jackrabbit.oak.segment.DefaultSegmentWriterBuilder.defaultSegmentWriterBuilder;
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
@@ -29,7 +29,7 @@ import org.apache.jackrabbit.oak.commons.Buffer;
 import org.apache.jackrabbit.oak.plugins.memory.EmptyNodeState;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.jetbrains.annotations.NotNull;
 import org.junit.Rule;
 import org.junit.Test;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ParallelCompactorExternalBlobTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ParallelCompactorExternalBlobTest.java
index 8346363815..7e77825d9e 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ParallelCompactorExternalBlobTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/ParallelCompactorExternalBlobTest.java
@@ -21,7 +21,7 @@ package org.apache.jackrabbit.oak.segment;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.file.GCNodeWriteMonitor;
 import org.apache.jackrabbit.oak.segment.file.CompactionWriter;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
 import org.jetbrains.annotations.NotNull;
 import org.junit.runner.RunWith;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPoolTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPoolTest.java
index bb1f311ebe..5970b3c16b 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPoolTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/SegmentBufferWriterPoolTest.java
@@ -39,7 +39,7 @@ import java.util.concurrent.TimeoutException;
 import org.apache.jackrabbit.oak.commons.collections.SetUtils;
 import 
org.apache.jackrabbit.oak.commons.internal.concurrent.UninterruptibleUtils;
 import org.apache.jackrabbit.oak.segment.WriteOperationHandler.WriteOperation;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.memory.MemoryStore;
 import org.jetbrains.annotations.NotNull;
 import org.jetbrains.annotations.Nullable;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/DefaultGarbageCollectionStrategyTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/DefaultGarbageCollectionStrategyTest.java
index 953271cde8..e0d4a2d7ae 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/DefaultGarbageCollectionStrategyTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/DefaultGarbageCollectionStrategyTest.java
@@ -23,7 +23,7 @@ import org.apache.jackrabbit.oak.segment.SegmentId;
 import org.apache.jackrabbit.oak.segment.SegmentTracker;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.segment.file.tar.CleanupContext;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
 import org.apache.jackrabbit.oak.segment.memory.MemoryStore;
 import org.junit.Test;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
index 82e756bb75..011de12f88 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FileStoreIT.java
@@ -55,7 +55,7 @@ import org.apache.jackrabbit.oak.segment.RecordId;
 import org.apache.jackrabbit.oak.segment.SegmentNodeBuilder;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
 import org.apache.jackrabbit.oak.segment.SegmentTestConstants;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.spi.state.ChildNodeEntry;
 import org.apache.jackrabbit.oak.spi.state.NodeState;
 import org.jetbrains.annotations.NotNull;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullCompactionStrategyTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullCompactionStrategyTest.java
index 44995f6846..e4edd78e32 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullCompactionStrategyTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullCompactionStrategyTest.java
@@ -27,7 +27,7 @@ import 
org.apache.jackrabbit.oak.segment.SegmentNodeStoreBuilders;
 import org.apache.jackrabbit.oak.segment.SegmentWriterFactory;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions;
 import org.apache.jackrabbit.oak.segment.file.cancel.Canceller;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
 import org.apache.jackrabbit.oak.segment.memory.MemoryStore;
 import org.apache.jackrabbit.oak.spi.gc.GCMonitor;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullSizeDeltaEstimationStrategyTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullSizeDeltaEstimationStrategyTest.java
index 621d220b25..c8b445092c 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullSizeDeltaEstimationStrategyTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/FullSizeDeltaEstimationStrategyTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.jackrabbit.oak.segment.file;
 
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GCIncrementTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GCIncrementTest.java
index 469f7a74c1..ffdd55b84b 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GCIncrementTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GCIncrementTest.java
@@ -19,10 +19,10 @@
 
 package org.apache.jackrabbit.oak.segment.file;
 
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.junit.Test;
 
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java
index 58163a008b..7e17c0df1c 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/GcJournalTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.jackrabbit.oak.segment.file;
 
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertEquals;
 
 import java.io.File;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/LargeNumberOfChildNodeUpdatesIT.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/LargeNumberOfChildNodeUpdatesIT.java
index ef344992c4..22cb1970c9 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/LargeNumberOfChildNodeUpdatesIT.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/LargeNumberOfChildNodeUpdatesIT.java
@@ -31,7 +31,7 @@ import org.apache.jackrabbit.oak.segment.DefaultSegmentWriter;
 import org.apache.jackrabbit.oak.segment.RecordId;
 import org.apache.jackrabbit.oak.segment.SegmentNodeBuilder;
 import org.apache.jackrabbit.oak.segment.SegmentNodeState;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/ReclaimersTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/ReclaimersTest.java
index 87e95aa43b..fa0bccaedc 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/ReclaimersTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/ReclaimersTest.java
@@ -21,7 +21,7 @@ import static 
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCTy
 import static 
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCType.TAIL;
 import static 
org.apache.jackrabbit.oak.segment.file.Reclaimers.newExactReclaimer;
 import static 
org.apache.jackrabbit.oak.segment.file.Reclaimers.newOldReclaimer;
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
@@ -34,7 +34,7 @@ import java.util.Set;
 import java.util.function.Predicate;
 
 import org.apache.jackrabbit.oak.commons.collections.SetUtils;
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.junit.Test;
 
 public class ReclaimersTest {
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TailSizeDeltaEstimationStrategyTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TailSizeDeltaEstimationStrategyTest.java
index 0aaf9d3f9f..5fb96ededc 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TailSizeDeltaEstimationStrategyTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/TailSizeDeltaEstimationStrategyTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.jackrabbit.oak.segment.file;
 
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java
index 972d462659..78fe46c398 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFileTest.java
@@ -18,7 +18,7 @@
  */
 package org.apache.jackrabbit.oak.segment.file.tar;
 
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.mockito.internal.util.collections.Sets.newSet;
@@ -28,7 +28,6 @@ import java.io.IOException;
 import java.nio.charset.StandardCharsets;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
@@ -36,6 +35,7 @@ import java.util.UUID;
 import org.apache.jackrabbit.oak.commons.Buffer;
 import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveEntry;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager;
 import org.junit.Before;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFilesTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFilesTest.java
index bc0dbce986..80789efdf1 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFilesTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarFilesTest.java
@@ -21,7 +21,7 @@ import static java.util.Collections.emptySet;
 import static java.util.Collections.singleton;
 import static java.util.Collections.singletonList;
 import static java.util.UUID.randomUUID;
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.assertFalse;
@@ -48,6 +48,7 @@ import 
org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitor;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitor;
 import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitorAdapter;
+import org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveWriter;
 import 
org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java
index 2bceeafe76..11f13e08c1 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/TarWriterTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.jackrabbit.oak.segment.file.tar;
 
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotSame;
 import static org.junit.Assert.assertSame;
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/GCGenerationTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/GCGenerationTest.java
similarity index 89%
rename from 
oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/GCGenerationTest.java
rename to 
oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/GCGenerationTest.java
index 70d3241e9c..3f16d4bde7 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/file/tar/GCGenerationTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/GCGenerationTest.java
@@ -16,9 +16,9 @@
  *
  */
 
-package org.apache.jackrabbit.oak.segment.file.tar;
+package org.apache.jackrabbit.oak.segment.spi.persistence;
 
-import static 
org.apache.jackrabbit.oak.segment.file.tar.GCGeneration.newGCGeneration;
+import static 
org.apache.jackrabbit.oak.segment.spi.persistence.GCGeneration.newGCGeneration;
 import static org.junit.Assert.assertEquals;
 
 import org.junit.Test;
@@ -38,4 +38,4 @@ public class GCGenerationTest {
         GCGeneration n = newGCGeneration(2, 3, false);
         assertEquals(3, n.compareFullGenerationWith(m));
     }
-}
\ No newline at end of file
+}

Reply via email to