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

jsedding pushed a commit to branch fix/OAK-11847-AzureJournalFile-rotation
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git

commit fd5f99fdd07e2a130013ae14847046fff0243473
Author: Julian Sedding <[email protected]>
AuthorDate: Thu Aug 7 16:48:07 2025 +0200

    OAK-11847 - AzureJournalFile fails to rotate journal
---
 .../oak/segment/azure/AzureJournalFile.java        | 38 ++++++++++++----------
 .../oak/segment/azure/AzurePersistence.java        | 11 +++++--
 2 files changed, 29 insertions(+), 20 deletions(-)

diff --git 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureJournalFile.java
 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureJournalFile.java
index 02b6cc7b15..793a98de4a 100644
--- 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureJournalFile.java
+++ 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureJournalFile.java
@@ -33,16 +33,19 @@ import org.slf4j.LoggerFactory;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
-import java.util.*;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 public class AzureJournalFile implements JournalFile {
 
     private static final Logger log = 
LoggerFactory.getLogger(AzureJournalFile.class);
 
-    private static final int JOURNAL_LINE_LIMIT = 
Integer.getInteger("org.apache.jackrabbit.oak.segment.azure.journal.lines", 
40_000);
+    static final int JOURNAL_LINE_LIMIT = 
Integer.getInteger("org.apache.jackrabbit.oak.segment.azure.journal.lines", 
40_000);
 
     private final BlobContainerClient readBlobContainerClient;
 
@@ -245,23 +248,22 @@ public class AzureJournalFile implements JournalFile {
         }
 
         private int parseCurrentSuffix() {
-            String name = AzureUtilities.getName(currentBlob);
-            Pattern pattern = Pattern.compile(Pattern.quote(journalNamePrefix) 
+ "\\.(\\d+)");
-            Matcher matcher = pattern.matcher(name);
-            int parsedSuffix;
-            if (matcher.find()) {
-                String suffix = matcher.group(1);
-                try {
-                    parsedSuffix = Integer.parseInt(suffix);
-                } catch (NumberFormatException e) {
-                    log.warn("Can't parse suffix for journal file {}", name);
-                    parsedSuffix = 0;
+            String name = currentBlob.getBlobName();
+            String index;
+            if (name.startsWith(journalNamePrefix + ".")) {
+                index = name.substring(journalNamePrefix.length() + 1);
+                if (index.chars().allMatch(Character::isDigit)) {
+                    try {
+                        return Integer.parseInt(index);
+                    } catch (NumberFormatException e) {
+                        // fall through to next warning
+                    }
                 }
+                log.warn("Can't parse suffix for journal file {}, unable to 
rotate journal", name);
             } else {
-                log.warn("Can't parse journal file name {}", name);
-                parsedSuffix = 0;
+                log.warn("Journal file {} doesn't start with {}, unable to 
rotate journal", name, journalNamePrefix);
             }
-            return parsedSuffix;
+            return 0;
         }
 
         @Override
diff --git 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java
 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java
index 9a6f75595c..2cb755f0cb 100644
--- 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java
+++ 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistence.java
@@ -49,6 +49,8 @@ public class AzurePersistence implements 
SegmentNodeStorePersistence {
 
     protected final String rootPrefix;
 
+    protected final int journalLineLimit;
+
     protected AzureHttpRequestLoggingPolicy azureHttpRequestLoggingPolicy;
 
     protected WriteAccessController writeAccessController = new 
WriteAccessController();
@@ -61,12 +63,17 @@ public class AzurePersistence implements 
SegmentNodeStorePersistence {
         this(readBlobContainerClient, writeBlobContainerClient, 
noRetryBlobContainerClient, rootPrefix, null);
     }
 
-    public AzurePersistence(BlobContainerClient readBlobContainerClient, 
BlobContainerClient writeBlobContainerClient, BlobContainerClient 
noRetryBlobContainerClient, String rootPrefix, AzureHttpRequestLoggingPolicy 
azureHttpRequestLoggingPolicy) {
+    AzurePersistence(BlobContainerClient readBlobContainerClient, 
BlobContainerClient writeBlobContainerClient, BlobContainerClient 
noRetryBlobContainerClient, String rootPrefix, AzureHttpRequestLoggingPolicy 
azureHttpRequestLoggingPolicy) {
+        this(readBlobContainerClient, writeBlobContainerClient, 
noRetryBlobContainerClient, rootPrefix, azureHttpRequestLoggingPolicy, 
AzureJournalFile.JOURNAL_LINE_LIMIT);
+    }
+
+    AzurePersistence(BlobContainerClient readBlobContainerClient, 
BlobContainerClient writeBlobContainerClient, BlobContainerClient 
noRetryBlobContainerClient, String rootPrefix, AzureHttpRequestLoggingPolicy 
azureHttpRequestLoggingPolicy, int journalLineLimit) {
         this.readBlobContainerClient = readBlobContainerClient;
         this.writeBlobContainerClient = writeBlobContainerClient;
         this.noRetryBlobContainerClient = noRetryBlobContainerClient;
         this.azureHttpRequestLoggingPolicy = azureHttpRequestLoggingPolicy;
         this.rootPrefix = rootPrefix;
+        this.journalLineLimit = journalLineLimit;
     }
 
     @Override
@@ -89,7 +96,7 @@ public class AzurePersistence implements 
SegmentNodeStorePersistence {
 
     @Override
     public JournalFile getJournalFile() {
-        return new AzureJournalFile(readBlobContainerClient, 
writeBlobContainerClient, rootPrefix + "/journal.log", writeAccessController);
+        return new AzureJournalFile(readBlobContainerClient, 
writeBlobContainerClient, rootPrefix + "/journal.log", writeAccessController, 
journalLineLimit);
     }
 
     @Override

Reply via email to