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

nfsantos 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 4cdee6e219 OAK-12034 - CachingSegmentArchiveReader#containsSegment 
should not check the persistence cache for the segment (#2655)
4cdee6e219 is described below

commit 4cdee6e21938e1d82a67416462bee9c3d4b6dc17
Author: Nuno Santos <[email protected]>
AuthorDate: Thu Dec 11 13:15:17 2025 +0100

    OAK-12034 - CachingSegmentArchiveReader#containsSegment should not check 
the persistence cache for the segment (#2655)
---
 .../persistentcache/PersistentDiskCacheTest.java   |  8 +-
 .../CachingSegmentArchiveReader.java               |  6 +-
 .../persistentcache/CachingPersistenceTest.java    | 52 -------------
 .../CachingSegmentArchiveReaderTest.java           | 87 ++++++++++++++++++++++
 .../persistentcache/MemoryPersistentCache.java     | 73 ++++++++++++++++++
 5 files changed, 168 insertions(+), 58 deletions(-)

diff --git 
a/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/persistentcache/PersistentDiskCacheTest.java
 
b/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/persistentcache/PersistentDiskCacheTest.java
index a4560b4940..f233b46498 100644
--- 
a/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/persistentcache/PersistentDiskCacheTest.java
+++ 
b/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/persistentcache/PersistentDiskCacheTest.java
@@ -18,8 +18,8 @@
 package org.apache.jackrabbit.oak.segment.remote.persistentcache;
 
 import org.apache.jackrabbit.oak.commons.Buffer;
-import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter;
 import org.apache.jackrabbit.oak.stats.StatisticsProvider;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -53,6 +53,12 @@ public class PersistentDiskCacheTest extends 
AbstractPersistentCacheTest {
         persistentCache = new PersistentDiskCache(temporaryFolder.newFolder(), 
10 * 1024, new DiskCacheIOMonitor(StatisticsProvider.NOOP));
     }
 
+    @After
+    public void tearDown() {
+        persistentCache.close();
+        persistentCache = null;
+    }
+
     @Test
     public void cleanupTest() throws Exception {
         persistentCache.close();
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 df5aadb3ea..1bca0f2f07 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
@@ -51,11 +51,7 @@ public class CachingSegmentArchiveReader implements 
SegmentArchiveReader {
 
     @Override
     public boolean containsSegment(long msb, long lsb) {
-        if (persistentCache.containsSegment(msb, lsb)) {
-            return true;
-        } else {
-            return delegate.containsSegment(msb, lsb);
-        }
+        return delegate.containsSegment(msb, lsb);
     }
 
     @Override
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingPersistenceTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingPersistenceTest.java
index 94e0972957..f096aa027c 100644
--- 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingPersistenceTest.java
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingPersistenceTest.java
@@ -17,7 +17,6 @@
  */
 package org.apache.jackrabbit.oak.segment.spi.persistence.persistentcache;
 
-import org.apache.jackrabbit.oak.commons.Buffer;
 import org.apache.jackrabbit.oak.segment.Segment;
 import org.apache.jackrabbit.oak.segment.SegmentId;
 import org.apache.jackrabbit.oak.segment.SegmentNotFoundException;
@@ -34,10 +33,6 @@ import org.junit.rules.TemporaryFolder;
 
 import java.io.File;
 import java.io.IOException;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.Callable;
 
 import static 
org.apache.jackrabbit.oak.segment.file.FileStoreBuilder.fileStoreBuilder;
 import static org.junit.Assert.assertNotNull;
@@ -109,51 +104,4 @@ public class CachingPersistenceTest {
         fileStoreBuilder.withCustomPersistence(customPersistence);
         return fileStoreBuilder;
     }
-
-    class MemoryPersistentCache extends AbstractPersistentCache {
-
-        private final Map<String, Buffer> segments = 
Collections.synchronizedMap(new HashMap<String, Buffer>());
-
-        private boolean throwException = false;
-
-        public MemoryPersistentCache(boolean throwException) {
-            this.throwException = throwException;
-            segmentCacheStats = new SegmentCacheStats(
-                    "Memory Cache",
-                    () -> null,
-                    () -> null,
-                    () -> null,
-                    () -> null);
-        }
-
-        @Override
-        protected Buffer readSegmentInternal(long msb, long lsb) {
-            return segments.get(String.valueOf(msb) + lsb);
-        }
-
-        @Override
-        public boolean containsSegment(long msb, long lsb) {
-            return segments.containsKey(String.valueOf(msb) + lsb);
-        }
-
-        @Override
-        public void writeSegment(long msb, long lsb, Buffer buffer) {
-            segments.put(String.valueOf(msb) + lsb, buffer);
-        }
-
-        @Override
-        public Buffer readSegment(long msb, long lsb, @NotNull 
Callable<Buffer> loader) throws RepositoryNotReachableException {
-            return super.readSegment(msb, lsb, () -> {
-                if (throwException) {
-                    throw new RepositoryNotReachableException(null);
-                }
-                return loader.call();
-            });
-        }
-
-        @Override
-        public void cleanUp() {
-
-        }
-    }
 }
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingSegmentArchiveReaderTest.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingSegmentArchiveReaderTest.java
new file mode 100644
index 0000000000..f7286bde94
--- /dev/null
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingSegmentArchiveReaderTest.java
@@ -0,0 +1,87 @@
+/*
+ * 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.spi.persistence.persistentcache;
+
+import org.apache.jackrabbit.oak.commons.Buffer;
+import org.apache.jackrabbit.oak.segment.file.tar.SegmentTarManager;
+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.SegmentArchiveReader;
+import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveWriter;
+import org.junit.Before;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+import static org.junit.Assert.*;
+
+public class CachingSegmentArchiveReaderTest {
+
+    @Rule
+    public TemporaryFolder temporaryFolder = new TemporaryFolder(new 
File("target"));
+
+    @Before
+    public void setUp() throws Exception {
+        temporaryFolder.newFolder();
+    }
+
+    @Test
+    public void containsSegmentDoesNotUsePersistentDiskCache() throws 
IOException {
+        PersistentCache persistentCache = new MemoryPersistentCache(false);
+        // Create a CachingArchiveManager with 2 tar files and a shared 
persistence disk cache. Each tar file contains a
+        // single segment. When looking up for a segment in a particular tar 
file, we should not find segments that are
+        // present in the other tar files. That is, the shared cache should 
not expose segments from other tar files.
+        SegmentTarManager archiveManager = new 
SegmentTarManager(temporaryFolder.newFolder(),
+                new FileStoreMonitorAdapter(), new IOMonitorAdapter(), false, 
false);
+        CachingArchiveManager cachingArchiveManager = new 
CachingArchiveManager(persistentCache, archiveManager);
+
+        long msb1 = 1L;
+        long lsb1 = 1L;
+        byte[] data1 = "data1".getBytes(StandardCharsets.UTF_8);
+        String archive1Name = "data0000a.tar";
+
+        long msb2 = 2L;
+        long lsb2 = 2L;
+        byte[] data2 = "data2".getBytes(StandardCharsets.UTF_8);
+        String archive2Name = "data0000b.tar";
+
+        SegmentArchiveWriter archive1 = 
cachingArchiveManager.create(archive1Name);
+        archive1.writeSegment(msb1, lsb1, data1, 0, data1.length, 0, 0, true);
+        archive1.close();
+
+        SegmentArchiveWriter archive2 = 
cachingArchiveManager.create(archive2Name);
+        archive2.writeSegment(msb2, lsb2, data2, 0, data2.length, 0, 0, true);
+        archive2.close();
+
+        // Open the archives and read the segment. This will trigger caching 
of the segments.
+        SegmentArchiveReader tar1 = cachingArchiveManager.open(archive1Name);
+        assertEquals(Buffer.wrap(data1), tar1.readSegment(msb1, lsb1));
+
+        SegmentArchiveReader tar2 = cachingArchiveManager.open(archive2Name);
+        assertEquals(Buffer.wrap(data2), tar2.readSegment(msb2, lsb2));
+
+        assertTrue(tar1.containsSegment(msb1, lsb1));
+        assertFalse(tar1.containsSegment(msb2, lsb2));
+        assertFalse(tar2.containsSegment(msb1, lsb1));
+        assertTrue(tar2.containsSegment(msb2, lsb2));
+    }
+}
\ No newline at end of file
diff --git 
a/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/MemoryPersistentCache.java
 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/MemoryPersistentCache.java
new file mode 100644
index 0000000000..896a98c8e5
--- /dev/null
+++ 
b/oak-segment-tar/src/test/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/MemoryPersistentCache.java
@@ -0,0 +1,73 @@
+/*
+ * 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.spi.persistence.persistentcache;
+
+import org.apache.jackrabbit.oak.commons.Buffer;
+import org.apache.jackrabbit.oak.segment.spi.RepositoryNotReachableException;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.Map;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ConcurrentHashMap;
+
+class MemoryPersistentCache extends AbstractPersistentCache {
+
+    private final Map<String, Buffer> segments = new ConcurrentHashMap<>();
+
+    private boolean throwException = false;
+
+    public MemoryPersistentCache(boolean throwException) {
+        this.throwException = throwException;
+        segmentCacheStats = new SegmentCacheStats(
+                "Memory Cache",
+                () -> null,
+                () -> null,
+                () -> null,
+                () -> null);
+    }
+
+    @Override
+    protected Buffer readSegmentInternal(long msb, long lsb) {
+        return segments.get(String.valueOf(msb) + lsb);
+    }
+
+    @Override
+    public boolean containsSegment(long msb, long lsb) {
+        return segments.containsKey(String.valueOf(msb) + lsb);
+    }
+
+    @Override
+    public void writeSegment(long msb, long lsb, Buffer buffer) {
+        segments.put(String.valueOf(msb) + lsb, buffer);
+    }
+
+    @Override
+    public Buffer readSegment(long msb, long lsb, @NotNull Callable<Buffer> 
loader) throws RepositoryNotReachableException {
+        return super.readSegment(msb, lsb, () -> {
+            if (throwException) {
+                throw new RepositoryNotReachableException(null);
+            }
+            return loader.call();
+        });
+    }
+
+    @Override
+    public void cleanUp() {
+
+    }
+}
\ No newline at end of file

Reply via email to