You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by mi...@apache.org on 2022/09/08 15:34:25 UTC

[jackrabbit-oak] branch split_persistence_recovery updated: OAK-9927 CachingArchiveManager has never returned null as is should

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

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


The following commit(s) were added to refs/heads/split_persistence_recovery by this push:
     new df574a94d7 OAK-9927 CachingArchiveManager has never returned null as is should
df574a94d7 is described below

commit df574a94d7496a3363b6efd662eb1a2753fec5a0
Author: smiroslav <mi...@apache.org>
AuthorDate: Thu Sep 8 17:34:11 2022 +0200

    OAK-9927 CachingArchiveManager has never returned null as is should
---
 .../oak/segment/azure/AzureArchiveManagerTest.java | 65 ++++++++++++++++++++++
 .../persistentcache/CachingArchiveManager.java     | 16 +++++-
 2 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java
index 295713e9b7..c36588c25d 100644
--- a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java
+++ b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureArchiveManagerTest.java
@@ -32,6 +32,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.ReadOnlyFileStore;
+import org.apache.jackrabbit.oak.segment.file.tar.TarPersistence;
 import org.apache.jackrabbit.oak.segment.spi.RepositoryNotReachableException;
 import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter;
@@ -39,13 +40,20 @@ import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveReader;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveWriter;
+import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentNodeStorePersistence;
+import org.apache.jackrabbit.oak.segment.spi.persistence.persistentcache.AbstractPersistentCache;
+import org.apache.jackrabbit.oak.segment.spi.persistence.persistentcache.CachingPersistence;
+import org.apache.jackrabbit.oak.segment.spi.persistence.persistentcache.PersistentCache;
+import org.apache.jackrabbit.oak.segment.spi.persistence.split.SplitPersistence;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.ClassRule;
+import org.junit.Rule;
 import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
 
 import java.io.File;
 import java.io.FileNotFoundException;
@@ -74,6 +82,9 @@ public class AzureArchiveManagerTest {
     @ClassRule
     public static AzuriteDockerRule azurite = new AzuriteDockerRule();
 
+    @Rule
+    public TemporaryFolder folder = new TemporaryFolder(new File("target"));
+
     private CloudBlobContainer container;
 
     @Before
@@ -359,4 +370,58 @@ public class AzureArchiveManagerTest {
         // after creating a read-only FS, the recovery procedure should not be started since there is another running Oak process
         assertFalse(container.getDirectoryReference("oak/data00000a.tar.ro.bak").listBlobs().iterator().hasNext());
     }
+
+    @Test
+    public void testSplitPersistenceTarRecovery() throws URISyntaxException, InvalidFileStoreVersionException, IOException, CommitFailedException, StorageException {
+        AzurePersistence rwPersistence = new AzurePersistence(container.getDirectoryReference("oak"));
+        FileStore rwFileStore = FileStoreBuilder.fileStoreBuilder(folder.newFolder()).withCustomPersistence(rwPersistence).build();
+        SegmentNodeStore segmentNodeStore = SegmentNodeStoreBuilders.builder(rwFileStore).build();
+        NodeBuilder builder = segmentNodeStore.getRoot().builder();
+        builder.setProperty("foo", "bar");
+        segmentNodeStore.merge(builder, EmptyHook.INSTANCE, CommitInfo.EMPTY);
+        rwFileStore.flush();
+
+        assertTrue(container.getDirectoryReference("oak/data00000a.tar").listBlobs().iterator().hasNext());
+        assertFalse(container.getDirectoryReference("oak/data00000a.tar.ro.bak").listBlobs().iterator().hasNext());
+
+        // create files store with split persistence
+        AzurePersistence azureSharedPersistence = new AzurePersistence(container.getDirectoryReference("oak"));
+
+        CachingPersistence cachingPersistence = new CachingPersistence(createPersistenceCache(), azureSharedPersistence);
+        File localFolder = folder.newFolder();
+        SegmentNodeStorePersistence localPersistence = new TarPersistence(localFolder);
+        SegmentNodeStorePersistence splitPersistence = new SplitPersistence(cachingPersistence, localPersistence);
+
+        // exception should not be thrown here
+        FileStore splitPersistenceFileStore = FileStoreBuilder.fileStoreBuilder(localFolder).withCustomPersistence(splitPersistence).build();
+
+        assertTrue(container.getDirectoryReference("oak/data00000a.tar").listBlobs().iterator().hasNext());
+        // after creating a read-only FS, the recovery procedure should not be started since there is another running Oak process
+        assertFalse(container.getDirectoryReference("oak/data00000a.tar.ro.bak").listBlobs().iterator().hasNext());
+    }
+
+    private PersistentCache createPersistenceCache() {
+        return new AbstractPersistentCache() {
+            @Override
+            protected Buffer readSegmentInternal(long msb, long lsb) {
+                return null;
+            }
+
+            @Override
+            public boolean containsSegment(long msb, long lsb) {
+                return false;
+            }
+
+            @Override
+            public void writeSegment(long msb, long lsb, Buffer buffer) {
+
+            }
+
+            @Override
+            public void cleanUp() {
+
+            }
+        };
+    }
+
 }
diff --git a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingArchiveManager.java b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingArchiveManager.java
index ae8023361e..e8622e757e 100644
--- a/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingArchiveManager.java
+++ b/oak-segment-tar/src/main/java/org/apache/jackrabbit/oak/segment/spi/persistence/persistentcache/CachingArchiveManager.java
@@ -47,12 +47,24 @@ public class CachingArchiveManager implements SegmentArchiveManager {
 
     @Override
     public @Nullable SegmentArchiveReader open(@NotNull String archiveName) throws IOException {
-        return new CachingSegmentArchiveReader(persistentCache, delegate.open(archiveName));
+        SegmentArchiveReader delegateArchiveReader = delegate.open(archiveName);
+
+        if (delegateArchiveReader != null) {
+            return new CachingSegmentArchiveReader(persistentCache, delegateArchiveReader);
+        } else {
+            return null;
+        }
     }
 
     @Override
     public @Nullable SegmentArchiveReader forceOpen(String archiveName) throws IOException {
-        return new CachingSegmentArchiveReader(persistentCache, delegate.forceOpen(archiveName));
+        SegmentArchiveReader delegateArchiveReader = delegate.forceOpen(archiveName);
+
+        if (delegateArchiveReader != null) {
+            return new CachingSegmentArchiveReader(persistentCache, delegateArchiveReader);
+        } else {
+            return null;
+        }
     }
 
     @Override