This is an automated email from the ASF dual-hosted git repository.
reschke 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 dbde447411 OAK-11847 - AzureJournalFile fails to rotate journal (#2438)
dbde447411 is described below
commit dbde4474111fa4e0fe8694d2571c7b9771c3e1ab
Author: Ieran Bogdan <[email protected]>
AuthorDate: Fri Aug 8 14:10:21 2025 +0300
OAK-11847 - AzureJournalFile fails to rotate journal (#2438)
* OAK-11847 - AzureJournalFile fails to rotate journal
* OAK-11847 - AzureJournalFile fails to rotate journal
---
.../jackrabbit/oak/segment/azure/AzureJournalFile.java | 14 ++++++++++----
.../jackrabbit/oak/segment/azure/AzurePersistence.java | 9 ++++++---
.../oak/segment/azure/AzurePersistenceManager.java | 2 +-
.../oak/segment/azure/AzureJournalFileTest.java | 15 +++++++++++----
4 files changed, 28 insertions(+), 12 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..c81f752962 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,7 +33,13 @@ import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.IOException;
-import java.util.*;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Objects;
+import java.util.Map;
+import java.util.Iterator;
+import java.util.HashMap;
+import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
@@ -54,11 +60,11 @@ public class AzureJournalFile implements JournalFile {
private final WriteAccessController writeAccessController;
- AzureJournalFile(BlobContainerClient readBlobContainerClient,
BlobContainerClient writeBlobContainerClient, String journalNamePrefix,
WriteAccessController writeAccessController, int lineLimit) {
+ AzureJournalFile(BlobContainerClient readBlobContainerClient,
BlobContainerClient writeBlobContainerClient, String journalNamePrefix,
WriteAccessController writeAccessController, Integer lineLimit) {
this.readBlobContainerClient = readBlobContainerClient;
this.writeBlobContainerClient = writeBlobContainerClient;
this.journalNamePrefix = journalNamePrefix;
- this.lineLimit = lineLimit;
+ this.lineLimit = Objects.requireNonNullElse(lineLimit,
JOURNAL_LINE_LIMIT);
this.writeAccessController = writeAccessController;
}
@@ -245,7 +251,7 @@ public class AzureJournalFile implements JournalFile {
}
private int parseCurrentSuffix() {
- String name = AzureUtilities.getName(currentBlob);
+ String name = currentBlob.getBlobName();
Pattern pattern = Pattern.compile(Pattern.quote(journalNamePrefix)
+ "\\.(\\d+)");
Matcher matcher = pattern.matcher(name);
int parsedSuffix;
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..295ca41b1e 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
@@ -53,20 +53,23 @@ public class AzurePersistence implements
SegmentNodeStorePersistence {
protected WriteAccessController writeAccessController = new
WriteAccessController();
+ private final Integer journalLineLimit;
+
public AzurePersistence(BlobContainerClient blobContainerClient, String
rootPrefix) {
this(blobContainerClient, blobContainerClient, blobContainerClient,
rootPrefix);
}
public AzurePersistence(BlobContainerClient readBlobContainerClient,
BlobContainerClient writeBlobContainerClient, BlobContainerClient
noRetryBlobContainerClient, String rootPrefix) {
- this(readBlobContainerClient, writeBlobContainerClient,
noRetryBlobContainerClient, rootPrefix, null);
+ this(readBlobContainerClient, writeBlobContainerClient,
noRetryBlobContainerClient, rootPrefix, null, null);
}
- public AzurePersistence(BlobContainerClient readBlobContainerClient,
BlobContainerClient writeBlobContainerClient, BlobContainerClient
noRetryBlobContainerClient, String rootPrefix, AzureHttpRequestLoggingPolicy
azureHttpRequestLoggingPolicy) {
+ public AzurePersistence(BlobContainerClient readBlobContainerClient,
BlobContainerClient writeBlobContainerClient, BlobContainerClient
noRetryBlobContainerClient, String rootPrefix, AzureHttpRequestLoggingPolicy
azureHttpRequestLoggingPolicy, Integer journalLineLimit) {
this.readBlobContainerClient = readBlobContainerClient;
this.writeBlobContainerClient = writeBlobContainerClient;
this.noRetryBlobContainerClient = noRetryBlobContainerClient;
this.azureHttpRequestLoggingPolicy = azureHttpRequestLoggingPolicy;
this.rootPrefix = rootPrefix;
+ this.journalLineLimit = journalLineLimit;
}
@Override
@@ -89,7 +92,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
diff --git
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistenceManager.java
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistenceManager.java
index 0cf5fa072f..1ef8d10165 100644
---
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistenceManager.java
+++
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzurePersistenceManager.java
@@ -196,7 +196,7 @@ public class AzurePersistenceManager {
final String rootPrefixNormalized = normalizePath(rootPrefix);
- return new AzurePersistence(blobContainerClient, writeContainerClient,
noRetryBlobContainerClient, rootPrefixNormalized,
azureHttpRequestLoggingPolicy);
+ return new AzurePersistence(blobContainerClient, writeContainerClient,
noRetryBlobContainerClient, rootPrefixNormalized,
azureHttpRequestLoggingPolicy, null);
}
private static BlobContainerClient getBlobContainerClientWithSas(String
accountName, String containerName, RequestRetryOptions requestRetryOptions,
AzureHttpRequestLoggingPolicy azureHttpRequestLoggingPolicy, String sasToken) {
diff --git
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureJournalFileTest.java
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureJournalFileTest.java
index 7434b71dec..e08f303d26 100644
---
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureJournalFileTest.java
+++
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureJournalFileTest.java
@@ -26,6 +26,7 @@ import com.azure.storage.blob.models.ListBlobsOptions;
import org.apache.commons.lang3.time.StopWatch;
import org.apache.jackrabbit.oak.commons.collections.ListUtils;
import org.apache.jackrabbit.oak.segment.remote.WriteAccessController;
+import org.apache.jackrabbit.oak.segment.spi.persistence.JournalFile;
import org.apache.jackrabbit.oak.segment.spi.persistence.JournalFileReader;
import org.apache.jackrabbit.oak.segment.spi.persistence.JournalFileWriter;
import org.jetbrains.annotations.NotNull;
@@ -51,15 +52,21 @@ public class AzureJournalFileTest {
private BlobContainerClient writeBlobContainerClient;
- private AzureJournalFile journal;
+ private JournalFile journal;
+
+ private final String rootPrefix = "oak";
@Before
- public void setup() throws BlobStorageException {
+ public void setup() throws BlobStorageException, IOException {
readBlobContainerClient =
azurite.getReadBlobContainerClient("oak-test");
writeBlobContainerClient =
azurite.getWriteBlobContainerClient("oak-test");
+ BlobContainerClient noRetryBlobContainerClient =
azurite.getNoRetryBlobContainerClient("oak-test");
+
WriteAccessController writeAccessController = new
WriteAccessController();
writeAccessController.enableWriting();
- journal = new AzureJournalFile(readBlobContainerClient,
writeBlobContainerClient, "journal.log", writeAccessController, 50);
+ AzurePersistence azurePersistence = new
AzurePersistence(readBlobContainerClient, writeBlobContainerClient,
noRetryBlobContainerClient, rootPrefix, null, 50);
+ azurePersistence.lockRepository();
+ journal = azurePersistence.getJournalFile();
}
@Test
@@ -85,7 +92,7 @@ public class AzureJournalFileTest {
private int countJournalBlobs() {
ListBlobsOptions listBlobsOptions = new ListBlobsOptions();
- listBlobsOptions.setPrefix("journal.log");
+ listBlobsOptions.setPrefix(rootPrefix + "/journal.log");
List<BlobItem> result =
readBlobContainerClient.listBlobs(listBlobsOptions,
null).stream().collect(Collectors.toList());
return result.size();