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
