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

reschke pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/trunk by this push:
     new 9bfbce0b7d Revert "OAK-12070 - Reduce memory consumption of azure 
segment stores (#2699)"
9bfbce0b7d is described below

commit 9bfbce0b7dd8d457a5640dd97545f140931e7b44
Author: Julian Reschke <[email protected]>
AuthorDate: Tue Feb 3 13:21:51 2026 +0100

    Revert "OAK-12070 - Reduce memory consumption of azure segment stores 
(#2699)"
    
    This reverts commit 082c3a3e551bd04663c785c6d78124ec415e784f.
---
 .../oak/segment/aws/AwsSegmentArchiveReader.java   |  63 +++++---
 .../segment/azure/AzureSegmentArchiveReader.java   |  50 ++++--
 .../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/segment/file/tar/GCGeneration.java         |  28 +---
 .../jackrabbit/oak/segment/file/tar/TarReader.java |   6 +-
 .../spi/persistence/SegmentArchiveReader.java      |  16 --
 .../CachingSegmentArchiveReader.java               |   7 -
 .../persistence/persistentcache/package-info.java  |   2 +-
 .../split/UnclosedSegmentArchiveReader.java        |   7 -
 15 files changed, 142 insertions(+), 475 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 7b9fb3a97d..9811cbe380 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,8 +20,7 @@ import static 
org.apache.jackrabbit.oak.segment.remote.RemoteUtilities.OFF_HEAP;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.Iterator;
-import java.util.NoSuchElementException;
+import java.util.UUID;
 
 import org.apache.jackrabbit.oak.commons.Buffer;
 import 
org.apache.jackrabbit.oak.segment.remote.AbstractRemoteSegmentArchiveReader;
@@ -32,35 +31,47 @@ 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, archiveName, createEntryIterable(directory, 
archiveName));
+        super(ioMonitor);
         this.directory = directory;
+        this.archiveName = archiveName;
+        this.length = computeArchiveIndexAndLength();
+    }
+
+    @Override
+    public long length() {
+        return length;
+    }
+
+    @Override
+    public String getName() {
+        return archiveName;
     }
 
-    private static Iterable<ArchiveEntry> createEntryIterable(S3Directory 
directory, String archiveName) throws IOException{
+    @Override
+    protected long computeArchiveIndexAndLength() throws IOException {
+        long length = 0;
         Buffer buffer = directory.readObjectToBuffer(archiveName + ".idx", 
OFF_HEAP);
-        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));
-            }
-        };
+        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;
     }
 
     @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 7a8be8198d..18ca18f0d6 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,17 +17,19 @@
 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;
 
@@ -35,29 +37,45 @@ 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) {
-        super(ioMonitor, AzureUtilities.ensureNoTrailingSlash(archiveName),
-                createEntryIterable(blobContainerClient, 
AzureUtilities.asAzurePrefix(rootPrefix, archiveName)));
+    AzureSegmentArchiveReader(BlobContainerClient blobContainerClient, String 
rootPrefix, String archiveName, IOMonitor ioMonitor) throws IOException {
+        super(ioMonitor);
         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;
     }
 
-    private static Iterable<ArchiveEntry> 
createEntryIterable(BlobContainerClient blobContainerClient, @NotNull String 
archivePathPrefix) {
+    @Override
+    protected long computeArchiveIndexAndLength() throws IOException {
+        long length = 0;
         ListBlobsOptions listBlobsOptions = new ListBlobsOptions();
         listBlobsOptions.setPrefix(archivePathPrefix);
-        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;
+        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;
     }
 
     @Override
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 7242de4fe2..de69711b6e 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,37 +22,54 @@ 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, AzureUtilitiesV8.getName(archiveDirectory), 
createEntryIterable(archiveDirectory));
+        super(ioMonitor);
         this.archiveDirectory = archiveDirectory;
+        this.length = computeArchiveIndexAndLength();
+    }
+
+    @Override
+    public long length() {
+        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
+    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;
     }
 
     @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 a289d39ee7..fe99490e18 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,53 +30,20 @@ import org.jetbrains.annotations.Nullable;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.LinkedList;
+import java.util.ArrayList;
+import java.util.LinkedHashMap;
 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;
 
-    /**
-     * 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;
+    protected final Map<UUID, RemoteSegmentArchiveEntry> index = new 
LinkedHashMap<>();
 
-    /**
-     * The total size of the archive in bytes.
-     */
-    private final long length;
-
-    protected AbstractRemoteSegmentArchiveReader(IOMonitor ioMonitor, String 
archiveName, Iterable<ArchiveEntry> entries) {
+    public AbstractRemoteSegmentArchiveReader(IOMonitor ioMonitor) throws 
IOException {
         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
@@ -106,16 +73,9 @@ 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 index.values().stream()
-                
.sorted(Comparator.comparing(RemoteSegmentArchiveEntry::getPosition))
-                .collect(Collectors.toList());
+        return new ArrayList<>(index.values());
     }
 
     @Override
@@ -142,6 +102,12 @@ 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
@@ -166,53 +132,4 @@ 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 3e1964bb26..eee6d40cbf 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(entry.getUuid(), entry);
+        index.put(new UUID(msb, lsb), entry);
 
         totalLength += size;
         monitor.written(size);
@@ -80,7 +80,7 @@ public abstract class AbstractRemoteSegmentArchiveWriter 
implements SegmentArchi
             return segment.get().toBuffer();
         }
 
-        RemoteSegmentArchiveEntry indexEntry = index.get(uuid);
+        RemoteSegmentArchiveEntry indexEntry = index.get(new UUID(msb, lsb));
         if (indexEntry == null) {
             return null;
         }
@@ -95,7 +95,7 @@ public abstract class AbstractRemoteSegmentArchiveWriter 
implements SegmentArchi
         if (segment.isPresent()) {
             return true;
         }
-        return index.containsKey(uuid);
+        return index.containsKey(new UUID(msb, lsb));
     }
 
     @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 c3cdafbcf3..f14f793ac7 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,36 +16,42 @@
  */
 package org.apache.jackrabbit.oak.segment.remote;
 
-import org.apache.jackrabbit.oak.segment.file.tar.GCGeneration;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveEntry;
 
-import java.util.UUID;
-
 public class RemoteSegmentArchiveEntry implements SegmentArchiveEntry {
 
-    private final UUID uuid;
+    private final long msb;
+
+    private final long lsb;
 
     private final int position;
 
     private final int length;
 
-    private final GCGeneration gcGeneration;
+    private final int generation;
+
+    private final int fullGeneration;
+
+    private final boolean compacted;
 
     public RemoteSegmentArchiveEntry(long msb, long lsb, int position, int 
length, int generation, int fullGeneration, boolean compacted) {
-        this.uuid = new UUID(msb, lsb);
+        this.msb = msb;
+        this.lsb = lsb;
         this.position = position;
         this.length = length;
-        this.gcGeneration = GCGeneration.newGCGeneration(generation, 
fullGeneration, compacted);
+        this.generation = generation;
+        this.fullGeneration = fullGeneration;
+        this.compacted = compacted;
     }
 
     @Override
     public long getMsb() {
-        return uuid.getMostSignificantBits();
+        return msb;
     }
 
     @Override
     public long getLsb() {
-        return uuid.getLeastSignificantBits();
+        return lsb;
     }
 
     public int getPosition() {
@@ -59,20 +65,16 @@ public class RemoteSegmentArchiveEntry implements 
SegmentArchiveEntry {
 
     @Override
     public int getGeneration() {
-        return gcGeneration.getGeneration();
+        return generation;
     }
 
     @Override
     public int getFullGeneration() {
-        return gcGeneration.getFullGeneration();
+        return fullGeneration;
     }
 
     @Override
     public boolean isCompacted() {
-        return gcGeneration.isCompacted();
-    }
-
-    UUID getUuid() {
-        return uuid;
+        return compacted;
     }
 }
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 5c70f9fbe8..fd64aa03ce 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("3.0.0")
+@Version("2.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
deleted file mode 100644
index 09902031c7..0000000000
--- 
a/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/AbstractRemoteSegmentArchiveReaderTest.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/*
- * 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
deleted file mode 100644
index 9cf66524cb..0000000000
--- 
a/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/RemoteSegmentArchiveEntryTest.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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/segment/file/tar/GCGeneration.java
 
b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/file/tar/GCGeneration.java
index 176f3f0433..d9784d66a9 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/file/tar/GCGeneration.java
@@ -19,12 +19,7 @@ package org.apache.jackrabbit.oak.segment.file.tar;
 
 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;
@@ -59,31 +54,12 @@ 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) {
-        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;
+        return new GCGeneration(generation, fullGeneration, isCompacted);
     }
 
     public static GCGeneration newGCGeneration(SegmentArchiveEntry indexEntry) 
{
-        return newGCGeneration(indexEntry.getGeneration(), 
indexEntry.getFullGeneration(), indexEntry.isCompacted());
+        return new GCGeneration(indexEntry.getGeneration(), 
indexEntry.getFullGeneration(), indexEntry.isCompacted());
     }
 
     private final int generation;
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 9f2575f5b1..28f2e9f396 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
@@ -39,6 +39,7 @@ 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;
@@ -282,7 +283,10 @@ public class TarReader implements Closeable {
     private TarReader(SegmentArchiveManager archiveManager, 
SegmentArchiveReader archive) {
         this.archiveManager = archiveManager;
         this.archive = archive;
-        this.segmentUUIDs = archive.getSegmentUUIDs();
+        this.segmentUUIDs = archive.listSegments()
+                .stream()
+                .map(e -> new UUID(e.getMsb(), e.getLsb()))
+                .collect(Collectors.toUnmodifiableSet());
     }
 
     long size() {
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 8b22150516..3ac897e65b 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,9 +21,6 @@ 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;
@@ -55,19 +52,6 @@ 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 f81eaee782..8ef42fbf4d 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,8 +27,6 @@ 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 {
 
@@ -65,11 +63,6 @@ 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 0ad0171f1b..611279bc26 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.1.0")
+@Version("6.0.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 f50ffd757c..d6902c757d 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,8 +18,6 @@ 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;
@@ -54,11 +52,6 @@ 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();


Reply via email to