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..64c837bcd6 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,53 @@ 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(new File("target")).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 customPersistence = new CachingPersistence(new MemoryPersistentCache(), azureSharedPersistence); + CachingPersistence customPersistence = new CachingPersistence(createPersistenceCache(), azureSharedPersistence); + SegmentNodeStorePersistence localPersistence = new TarPersistence(folder.newFolder()); + SegmentNodeStorePersistence splitPersistence = new SplitPersistence(customPersistence, localPersistence); + + FileStore splitPersistenceFileStore = FileStoreBuilder.fileStoreBuilder(folder.newFolder()).withCustomPersistence(splitPersistence).build(); + } + + 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() { + + } + }; + } + }