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

adulceanu 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 7c774d7b66 OAK-10898 - Allow AzureCheck and AzureCompact to be built 
directly with a CloudBlobDirectory (#1540)
7c774d7b66 is described below

commit 7c774d7b66d767e52acd61121c0f0649fc958804
Author: Andrei Dulceanu <dulce...@users.noreply.github.com>
AuthorDate: Tue Jun 18 12:33:50 2024 +0200

    OAK-10898 - Allow AzureCheck and AzureCompact to be built directly with a 
CloudBlobDirectory (#1540)
---
 .../oak/segment/azure/tool/AzureCheck.java         | 27 +++++++++++++--
 .../oak/segment/azure/tool/AzureCompact.java       | 39 ++++++++++++++++++----
 .../oak/segment/azure/tool/ToolUtils.java          | 13 +++++---
 3 files changed, 65 insertions(+), 14 deletions(-)

diff --git 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/AzureCheck.java
 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/AzureCheck.java
index 2452e8b12b..8d0bca571e 100644
--- 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/AzureCheck.java
+++ 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/AzureCheck.java
@@ -17,6 +17,8 @@
 package org.apache.jackrabbit.oak.segment.azure.tool;
 
 import com.google.common.io.Files;
+import com.microsoft.azure.storage.blob.CloudBlobDirectory;
+import org.apache.jackrabbit.oak.segment.azure.AzurePersistence;
 import org.apache.jackrabbit.oak.segment.file.FileStoreBuilder;
 import org.apache.jackrabbit.oak.segment.file.JournalReader;
 import org.apache.jackrabbit.oak.segment.file.ReadOnlyFileStore;
@@ -81,6 +83,8 @@ public class AzureCheck {
 
         private Integer persistentCacheSizeGb;
 
+        private CloudBlobDirectory cloudBlobDirectory;
+
         private Builder() {
             // Prevent external instantiation.
         }
@@ -270,6 +274,17 @@ public class AzureCheck {
             return this;
         }
 
+        /**
+         * The Azure blob directory to connect to.
+         * @param cloudBlobDirectory
+         *          the Azure blob directory.
+         * @return this builder
+         */
+        public Builder withCloudBlobDirectory(CloudBlobDirectory 
cloudBlobDirectory) {
+            this.cloudBlobDirectory = checkNotNull(cloudBlobDirectory);
+            return this;
+        }
+
         /**
          * Create an executable version of the {@link Check} command.
          *
@@ -329,6 +344,8 @@ public class AzureCheck {
 
     private final Integer persistentCacheSizeGb;
 
+    private final CloudBlobDirectory cloudBlobDirectory;
+
     private AzureCheck(Builder builder) {
         this.path = builder.path;
         this.debugInterval = builder.debugInterval;
@@ -345,6 +362,7 @@ public class AzureCheck {
         this.failFast = builder.failFast;
         this.persistentCachePath = builder.persistentCachePath;
         this.persistentCacheSizeGb = builder.persistentCacheSizeGb;
+        this.cloudBlobDirectory = builder.cloudBlobDirectory;
     }
 
     private static Integer revisionsToCheckCount(Integer revisionsCount) {
@@ -354,12 +372,17 @@ public class AzureCheck {
     public int run() {
         StatisticsIOMonitor ioMonitor = new StatisticsIOMonitor();
         SegmentNodeStorePersistence persistence;
-        if (persistentCachePath != null) {
-            persistence = 
ToolUtils.newSegmentNodeStorePersistence(ToolUtils.SegmentStoreType.AZURE, 
path, persistentCachePath, persistentCacheSizeGb);
+
+        if (cloudBlobDirectory != null) {
+            persistence = new AzurePersistence(cloudBlobDirectory);
         } else {
             persistence = 
ToolUtils.newSegmentNodeStorePersistence(ToolUtils.SegmentStoreType.AZURE, 
path);
         }
 
+        if (persistentCachePath != null) {
+            persistence = ToolUtils.decorateWithCache(persistence, 
persistentCachePath, persistentCacheSizeGb);
+        }
+
         FileStoreBuilder builder = 
fileStoreBuilder(Files.createTempDir()).withCustomPersistence(persistence);
 
         if (ioStatistics) {
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 d4942f63f1..ab18f4f282 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
@@ -19,11 +19,7 @@ package org.apache.jackrabbit.oak.segment.azure.tool;
 
 import static 
org.apache.jackrabbit.guava.common.base.Preconditions.checkArgument;
 import static 
org.apache.jackrabbit.guava.common.base.Preconditions.checkNotNull;
-import static 
org.apache.jackrabbit.oak.segment.azure.tool.ToolUtils.createArchiveManager;
-import static 
org.apache.jackrabbit.oak.segment.azure.tool.ToolUtils.createCloudBlobDirectory;
-import static 
org.apache.jackrabbit.oak.segment.azure.tool.ToolUtils.newFileStore;
-import static 
org.apache.jackrabbit.oak.segment.azure.tool.ToolUtils.newSegmentNodeStorePersistence;
-import static 
org.apache.jackrabbit.oak.segment.azure.tool.ToolUtils.printableStopwatch;
+import static org.apache.jackrabbit.oak.segment.azure.tool.ToolUtils.*;
 
 import org.apache.jackrabbit.guava.common.base.Stopwatch;
 import org.apache.jackrabbit.guava.common.io.Files;
@@ -35,6 +31,7 @@ import com.microsoft.azure.storage.blob.CloudBlobDirectory;
 import com.microsoft.azure.storage.blob.ListBlobItem;
 
 import org.apache.jackrabbit.oak.segment.SegmentCache;
+import org.apache.jackrabbit.oak.segment.azure.AzurePersistence;
 import org.apache.jackrabbit.oak.segment.azure.tool.ToolUtils.SegmentStoreType;
 import org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.GCType;
 import 
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.CompactorType;
@@ -90,6 +87,10 @@ public class AzureCompact {
 
         private Integer persistentCacheSizeGb;
 
+        private CloudBlobDirectory sourceCloudBlobDirectory;
+
+        private CloudBlobDirectory destinationCloudBlobDirectory;
+
         private Builder() {
             // Prevent external instantiation.
         }
@@ -217,6 +218,16 @@ public class AzureCompact {
             return this;
         }
 
+        public Builder withSourceCloudBlobDirectory(CloudBlobDirectory 
sourceCloudBlobDirectory) {
+            this.sourceCloudBlobDirectory = 
checkNotNull(sourceCloudBlobDirectory);
+            return this;
+        }
+
+        public Builder withDestinationCloudBlobDirectory(CloudBlobDirectory 
destinationCloudBlobDirectory) {
+            this.destinationCloudBlobDirectory = 
checkNotNull(destinationCloudBlobDirectory);
+            return this;
+        }
+
         /**
          * Create an executable version of the {@link Compact} command.
          *
@@ -248,6 +259,10 @@ public class AzureCompact {
 
     private Integer persistentCacheSizeGb;
 
+    private CloudBlobDirectory sourceCloudBlobDirectory;
+
+    private CloudBlobDirectory destinationCloudBlobDirectory;
+
     private AzureCompact(Builder builder) {
         this.path = builder.path;
         this.targetPath = builder.targetPath;
@@ -259,12 +274,22 @@ public class AzureCompact {
         this.concurrency = builder.concurrency;
         this.persistentCachePath = builder.persistentCachePath;
         this.persistentCacheSizeGb = builder.persistentCacheSizeGb;
+        this.sourceCloudBlobDirectory = builder.sourceCloudBlobDirectory;
+        this.destinationCloudBlobDirectory = 
builder.destinationCloudBlobDirectory;
     }
 
     public int run() throws IOException, StorageException, URISyntaxException {
         Stopwatch watch = Stopwatch.createStarted();
-        SegmentNodeStorePersistence roPersistence = 
newSegmentNodeStorePersistence(SegmentStoreType.AZURE, path, 
persistentCachePath, persistentCacheSizeGb);
-        SegmentNodeStorePersistence rwPersistence = 
newSegmentNodeStorePersistence(SegmentStoreType.AZURE, targetPath);
+
+        SegmentNodeStorePersistence roPersistence;
+        SegmentNodeStorePersistence rwPersistence;
+        if (sourceCloudBlobDirectory != null && destinationCloudBlobDirectory 
!= null) {
+            roPersistence = decorateWithCache(new 
AzurePersistence(sourceCloudBlobDirectory), persistentCachePath, 
persistentCacheSizeGb);
+            rwPersistence = new 
AzurePersistence(destinationCloudBlobDirectory);
+        } else {
+            roPersistence = 
newSegmentNodeStorePersistence(SegmentStoreType.AZURE, path, 
persistentCachePath, persistentCacheSizeGb);
+            rwPersistence = 
newSegmentNodeStorePersistence(SegmentStoreType.AZURE, targetPath);
+        }
 
         SegmentNodeStorePersistence splitPersistence = new 
SplitPersistence(roPersistence, rwPersistence);
 
diff --git 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java
 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java
index 4e73a79578..f1845bc0a6 100644
--- 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java
+++ 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/tool/ToolUtils.java
@@ -134,11 +134,7 @@ public class ToolUtils {
         switch (storeType) {
         case AZURE:
             CloudBlobDirectory cloudBlobDirectory = 
createCloudBlobDirectory(pathOrUri.substring(3));
-            SegmentNodeStorePersistence basePersistence = new 
AzurePersistence(cloudBlobDirectory);
-
-            PersistentCache persistentCache = new PersistentDiskCache(new 
File(persistentCachePath),
-                        persistentCacheSize * 1024, new 
DiskCacheIOMonitor(StatisticsProvider.NOOP));
-            persistence = new CachingPersistence(persistentCache, 
basePersistence);
+            persistence = decorateWithCache(new 
AzurePersistence(cloudBlobDirectory), persistentCachePath, persistentCacheSize);
             break;
         default:
             persistence = new TarPersistence(new File(pathOrUri));
@@ -147,6 +143,13 @@ public class ToolUtils {
         return persistence;
     }
 
+    public static SegmentNodeStorePersistence 
decorateWithCache(SegmentNodeStorePersistence persistence,
+            String persistentCachePath, Integer persistentCacheSize) {
+        PersistentCache persistentCache = new PersistentDiskCache(new 
File(persistentCachePath),
+                persistentCacheSize * 1024, new 
DiskCacheIOMonitor(StatisticsProvider.NOOP));
+        return new CachingPersistence(persistentCache, persistence);
+    }
+
     public static SegmentNodeStorePersistence 
newSegmentNodeStorePersistence(SegmentStoreType storeType,
             String pathOrUri) {
         SegmentNodeStorePersistence persistence = null;

Reply via email to