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

miroslav pushed a commit to branch issue/OAK-10006
in repository https://gitbox.apache.org/repos/asf/jackrabbit-oak.git


The following commit(s) were added to refs/heads/issue/OAK-10006 by this push:
     new 66bde1cbf4 OAK-10006 added test for WriteAccessController and fixed 
tests in oak-segment-azure
66bde1cbf4 is described below

commit 66bde1cbf4a281a501076ee477e09765b44e1d51
Author: smiroslav <[email protected]>
AuthorDate: Fri Nov 10 17:12:52 2023 +0100

    OAK-10006 added test for WriteAccessController and fixed tests in 
oak-segment-azure
---
 .../oak/segment/azure/AzurePersistence.java        | 11 +++--
 .../segment/azure/AzureSegmentArchiveWriter.java   |  6 +--
 .../segment/azure/tool/SegmentCopyTestBase.java    | 12 ++---
 .../oak/segment/azure/AzureArchiveManagerTest.java | 22 ++++++---
 .../oak/segment/azure/AzureJournalFileTest.java    |  4 +-
 .../oak/segment/azure/AzureReadSegmentTest.java    |  4 +-
 .../azure/AzureSegmentArchiveWriterTest.java       |  7 ++-
 .../oak/segment/azure/AzureTarFileTest.java        |  7 ++-
 .../oak/segment/azure/AzureTarFilesTest.java       |  7 ++-
 .../oak/segment/azure/AzureTarWriterTest.java      | 12 +++--
 .../oak/segment/remote/WriteAccessController.java  | 45 ++++++-----------
 .../segment/remote/WriteAccessControllerTest.java  | 57 ++++++++++++++++++++++
 12 files changed, 130 insertions(+), 64 deletions(-)

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 ac0f0d5f29..eed07004e5 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
@@ -65,7 +65,7 @@ public class AzurePersistence implements 
SegmentNodeStorePersistence {
 
     protected final CloudBlobDirectory segmentstoreDirectory;
 
-    private WriteAccessController writeAccessController = new 
WriteAccessController();
+    protected WriteAccessController writeAccessController = new 
WriteAccessController();
 
     public AzurePersistence(CloudBlobDirectory segmentStoreDirectory) {
         this.segmentstoreDirectory = segmentStoreDirectory;
@@ -181,8 +181,11 @@ public class AzurePersistence implements 
SegmentNodeStorePersistence {
         });
     }
 
-        public CloudBlobDirectory getSegmentstoreDirectory() {
-            return segmentstoreDirectory;
-        }
+    public CloudBlobDirectory getSegmentstoreDirectory() {
+        return segmentstoreDirectory;
+    }
 
+    public void setWriteAccessController(WriteAccessController 
writeAccessController) {
+        this.writeAccessController = writeAccessController;
+    }
 }
diff --git 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveWriter.java
 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveWriter.java
index f20ad4f67b..3df0eaafa6 100644
--- 
a/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveWriter.java
+++ 
b/oak-segment-azure/src/main/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveWriter.java
@@ -47,13 +47,9 @@ public class AzureSegmentArchiveWriter extends 
AbstractRemoteSegmentArchiveWrite
             
Integer.getInteger("azure.segment.archive.writer.retries.intervalMs", 5000)
     );
 
-    public AzureSegmentArchiveWriter(CloudBlobDirectory archiveDirectory, 
IOMonitor ioMonitor, FileStoreMonitor monitor) {
+    public AzureSegmentArchiveWriter(CloudBlobDirectory archiveDirectory, 
IOMonitor ioMonitor, FileStoreMonitor monitor, WriteAccessController 
writeAccessController) {
         super(ioMonitor, monitor);
         this.archiveDirectory = archiveDirectory;
-    }
-
-    public AzureSegmentArchiveWriter(CloudBlobDirectory directory, IOMonitor 
ioMonitor, FileStoreMonitor monitor, WriteAccessController 
writeAccessController) {
-        this(directory, ioMonitor, monitor);
         this.writeAccessController = writeAccessController;
     }
 
diff --git 
a/oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java
 
b/oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java
index 97b9afee62..22005310be 100644
--- 
a/oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java
+++ 
b/oak-segment-azure/src/test/java/oak/apache/jackrabbit/oak/segment/azure/tool/SegmentCopyTestBase.java
@@ -51,13 +51,7 @@ import 
org.apache.jackrabbit.oak.segment.azure.tool.ToolUtils.SegmentStoreType;
 import 
org.apache.jackrabbit.oak.segment.compaction.SegmentGCOptions.CompactorType;
 import org.apache.jackrabbit.oak.segment.file.FileStore;
 import org.apache.jackrabbit.oak.segment.spi.monitor.*;
-import org.apache.jackrabbit.oak.segment.spi.persistence.GCJournalFile;
-import org.apache.jackrabbit.oak.segment.spi.persistence.JournalFileReader;
-import org.apache.jackrabbit.oak.segment.spi.persistence.ManifestFile;
-import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveEntry;
-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.SegmentNodeStorePersistence;
+import org.apache.jackrabbit.oak.segment.spi.persistence.*;
 import org.apache.jackrabbit.oak.spi.commit.CommitInfo;
 import org.apache.jackrabbit.oak.spi.commit.EmptyHook;
 import org.apache.jackrabbit.oak.spi.state.NodeBuilder;
@@ -92,6 +86,8 @@ public abstract class SegmentCopyTestBase {
         SegmentNodeStorePersistence srcPersistence = getSrcPersistence();
         SegmentNodeStorePersistence destPersistence = getDestPersistence();
 
+        RepositoryLock desetRepositoryLock = destPersistence.lockRepository();
+
         String srcPathOrUri = getSrcPathOrUri();
         String destPathOrUri = getDestPathOrUri();
 
@@ -111,6 +107,8 @@ public abstract class SegmentCopyTestBase {
         checkJournal(srcPersistence, destPersistence);
         checkGCJournal(srcPersistence, destPersistence);
         checkManifest(srcPersistence, destPersistence);
+
+        desetRepositoryLock.unlock();
     }
 
     private int runSegmentCopy(SegmentNodeStorePersistence srcPersistence, 
SegmentNodeStorePersistence destPersistence,
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 86b649cccf..ab7f2f5231 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
@@ -91,14 +91,21 @@ public class AzureArchiveManagerTest {
 
     private CloudBlobContainer container;
 
+    private AzurePersistence azurePersistence;
+
     @Before
     public void setup() throws StorageException, InvalidKeyException, 
URISyntaxException {
         container = azurite.getContainer("oak-test");
+
+        WriteAccessController writeAccessController = new 
WriteAccessController();
+        writeAccessController.enableWriting();
+        azurePersistence = new 
AzurePersistence(container.getDirectoryReference("oak"));
+        azurePersistence.setWriteAccessController(writeAccessController);
     }
 
     @Test
     public void testRecovery() throws StorageException, URISyntaxException, 
IOException {
-        SegmentArchiveManager manager = new 
AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(false,
 false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new 
RemoteStoreMonitorAdapter());
+        SegmentArchiveManager manager = 
azurePersistence.createArchiveManager(false, false, new IOMonitorAdapter(), new 
FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter());
         SegmentArchiveWriter writer = manager.create("data00000a.tar");
 
         List<UUID> uuids = new ArrayList<>();
@@ -120,7 +127,7 @@ public class AzureArchiveManagerTest {
 
     @Test
     public void testBackupWithRecoveredEntries() throws StorageException, 
URISyntaxException, IOException {
-        SegmentArchiveManager manager = new 
AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(false,
 false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new 
RemoteStoreMonitorAdapter());
+        SegmentArchiveManager manager = 
azurePersistence.createArchiveManager(false, false, new IOMonitorAdapter(), new 
FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter());
         SegmentArchiveWriter writer = manager.create("data00000a.tar");
 
         List<UUID> uuids = new ArrayList<>();
@@ -259,7 +266,7 @@ public class AzureArchiveManagerTest {
 
     @Test
     public void testExists() throws IOException, URISyntaxException {
-        SegmentArchiveManager manager = new 
AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(false,
 false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new 
RemoteStoreMonitorAdapter());
+        SegmentArchiveManager manager = 
azurePersistence.createArchiveManager(false, false, new IOMonitorAdapter(), new 
FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter());
         SegmentArchiveWriter writer = manager.create("data00000a.tar");
 
         List<UUID> uuids = new ArrayList<>();
@@ -278,7 +285,7 @@ public class AzureArchiveManagerTest {
 
     @Test
     public void testArchiveExistsAfterFlush() throws URISyntaxException, 
IOException {
-        SegmentArchiveManager manager = new 
AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(false,
 false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new 
RemoteStoreMonitorAdapter());
+        SegmentArchiveManager manager = 
azurePersistence.createArchiveManager(false, false, new IOMonitorAdapter(), new 
FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter());
         SegmentArchiveWriter writer = manager.create("data00000a.tar");
 
         Assert.assertFalse(manager.exists("data00000a.tar"));
@@ -289,10 +296,7 @@ public class AzureArchiveManagerTest {
     }
 
     @Test(expected = FileNotFoundException.class)
-    public void testSegmentDeletedAfterCreatingReader() throws IOException, 
URISyntaxException, StorageException, InvalidFileStoreVersionException {
-
-        AzurePersistence azurePersistence = new 
AzurePersistence(container.getDirectoryReference("oak"));
-
+    public void testSegmentDeletedAfterCreatingReader() throws IOException, 
URISyntaxException, StorageException {
         SegmentArchiveManager manager = 
azurePersistence.createArchiveManager(false, false, new IOMonitorAdapter(), new 
FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter());
         SegmentArchiveWriter writer = manager.create("data00000a.tar");
 
@@ -537,6 +541,8 @@ public class AzureArchiveManagerTest {
         assertNull(builder2.getProperty("foo"));
 
         rwFileStore2.close();
+
+        Mockito.doCallRealMethod().when(blobMocked).renewLease(Mockito.any());
     }
 
     private PersistentCache createPersistenceCache() {
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 78c1da1eae..ddc8a7de63 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
@@ -55,7 +55,9 @@ public class AzureJournalFileTest {
     @Before
     public void setup() throws StorageException, InvalidKeyException, 
URISyntaxException {
         container = azurite.getContainer("oak-test");
-        journal = new 
AzureJournalFile(container.getDirectoryReference("journal"), "journal.log", 50, 
new WriteAccessController());
+        WriteAccessController writeAccessController = new 
WriteAccessController();
+        writeAccessController.enableWriting();
+        journal = new 
AzureJournalFile(container.getDirectoryReference("journal"), "journal.log", 50, 
writeAccessController);
     }
 
     @Test
diff --git 
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureReadSegmentTest.java
 
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureReadSegmentTest.java
index f98e2dab33..63a2da2688 100644
--- 
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureReadSegmentTest.java
+++ 
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureReadSegmentTest.java
@@ -94,7 +94,7 @@ public class AzureReadSegmentTest {
         @Override
         public SegmentArchiveManager createArchiveManager(boolean mmap, 
boolean offHeapAccess, IOMonitor ioMonitor,
                 FileStoreMonitor fileStoreMonitor, RemoteStoreMonitor 
remoteStoreMonitor) {
-            return new AzureArchiveManager(segmentstoreDirectory, ioMonitor, 
fileStoreMonitor) {
+            return new AzureArchiveManager(segmentstoreDirectory, ioMonitor, 
fileStoreMonitor, writeAccessController) {
                 @Override
                 public SegmentArchiveReader open(String archiveName) throws 
IOException {
                     CloudBlobDirectory archiveDirectory = 
getDirectory(archiveName);
@@ -110,7 +110,7 @@ public class AzureReadSegmentTest {
                 @Override
                 public SegmentArchiveWriter create(String archiveName) throws 
IOException {
                     CloudBlobDirectory archiveDirectory = 
getDirectory(archiveName);
-                    return new AzureSegmentArchiveWriter(archiveDirectory, 
ioMonitor, fileStoreMonitor) {
+                    return new AzureSegmentArchiveWriter(archiveDirectory, 
ioMonitor, fileStoreMonitor, writeAccessController) {
                         @Override
                         public Buffer readSegment(long msb, long lsb) throws 
IOException {
                             throw new RepositoryNotReachableException(
diff --git 
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveWriterTest.java
 
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveWriterTest.java
index 4b02c004c1..ff45bf67cd 100644
--- 
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveWriterTest.java
+++ 
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureSegmentArchiveWriterTest.java
@@ -20,6 +20,7 @@ package org.apache.jackrabbit.oak.segment.azure;
 
 import com.microsoft.azure.storage.StorageException;
 import com.microsoft.azure.storage.blob.CloudBlobContainer;
+import org.apache.jackrabbit.oak.segment.remote.WriteAccessController;
 import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.spi.monitor.RemoteStoreMonitorAdapter;
@@ -167,7 +168,11 @@ public class AzureSegmentArchiveWriterTest {
 
     @NotNull
     private SegmentArchiveWriter createSegmentArchiveWriter() throws 
URISyntaxException, IOException {
-        SegmentArchiveManager manager = new 
AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(false,
 false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new 
RemoteStoreMonitorAdapter());
+        WriteAccessController writeAccessController = new 
WriteAccessController();
+        writeAccessController.enableWriting();
+        AzurePersistence azurePersistence = new 
AzurePersistence(container.getDirectoryReference("oak"));/**/
+        azurePersistence.setWriteAccessController(writeAccessController);
+        SegmentArchiveManager manager = 
azurePersistence.createArchiveManager(false, false, new IOMonitorAdapter(), new 
FileStoreMonitorAdapter(), new RemoteStoreMonitorAdapter());
         SegmentArchiveWriter writer = manager.create("data00000a.tar");
         return writer;
     }
diff --git 
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java
 
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java
index b26cb7dcd9..009ec430a7 100644
--- 
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java
+++ 
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFileTest.java
@@ -20,6 +20,7 @@ import com.microsoft.azure.storage.StorageException;
 import com.microsoft.azure.storage.blob.CloudBlobContainer;
 
 import 
org.apache.jackrabbit.oak.blob.cloud.azure.blobstorage.AzuriteDockerRule;
+import org.apache.jackrabbit.oak.segment.remote.WriteAccessController;
 import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFileTest;
@@ -45,7 +46,11 @@ public class AzureTarFileTest extends TarFileTest {
     public void setUp() throws IOException {
         try {
             container = azurite.getContainer("oak-test");
-            archiveManager = new 
AzurePersistence(container.getDirectoryReference("oak")).createArchiveManager(true,
 false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new 
RemoteStoreMonitorAdapter());
+            AzurePersistence azurePersistence = new 
AzurePersistence(container.getDirectoryReference("oak"));
+            WriteAccessController writeAccessController = new 
WriteAccessController();
+            writeAccessController.enableWriting();
+            azurePersistence.setWriteAccessController(writeAccessController);
+            archiveManager = azurePersistence.createArchiveManager(true, 
false, new IOMonitorAdapter(), new FileStoreMonitorAdapter(), new 
RemoteStoreMonitorAdapter());
         } catch (StorageException | InvalidKeyException | URISyntaxException 
e) {
             throw new IOException(e);
         }
diff --git 
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFilesTest.java
 
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFilesTest.java
index 065f4f7cf1..3be1367531 100644
--- 
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFilesTest.java
+++ 
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarFilesTest.java
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.segment.azure;
 import com.microsoft.azure.storage.blob.CloudBlobContainer;
 
 import 
org.apache.jackrabbit.oak.blob.cloud.azure.blobstorage.AzuriteDockerRule;
+import org.apache.jackrabbit.oak.segment.remote.WriteAccessController;
 import org.apache.jackrabbit.oak.segment.spi.monitor.FileStoreMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.file.tar.TarFiles;
@@ -38,6 +39,10 @@ public class AzureTarFilesTest extends TarFilesTest {
     @Override
     public void setUp() throws Exception {
         container = azurite.getContainer("oak-test");
+        AzurePersistence azurePersistence = new 
AzurePersistence(container.getDirectoryReference("oak"));
+        WriteAccessController writeAccessController = new 
WriteAccessController();
+        writeAccessController.enableWriting();
+        azurePersistence.setWriteAccessController(writeAccessController);
         tarFiles = TarFiles.builder()
                 .withDirectory(folder.newFolder())
                 .withTarRecovery((id, data, recovery) -> {
@@ -47,7 +52,7 @@ public class AzureTarFilesTest extends TarFilesTest {
                 .withFileStoreMonitor(new FileStoreMonitorAdapter())
                 .withRemoteStoreMonitor(new RemoteStoreMonitorAdapter())
                 .withMaxFileSize(MAX_FILE_SIZE)
-                .withPersistence(new 
AzurePersistence(container.getDirectoryReference("oak")))
+                .withPersistence(azurePersistence)
                 .build();
     }
 }
diff --git 
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java
 
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java
index 1ca8b200d4..c27e3a703a 100644
--- 
a/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java
+++ 
b/oak-segment-azure/src/test/java/org/apache/jackrabbit/oak/segment/azure/AzureTarWriterTest.java
@@ -19,6 +19,7 @@ package org.apache.jackrabbit.oak.segment.azure;
 import com.microsoft.azure.storage.blob.CloudBlobContainer;
 
 import 
org.apache.jackrabbit.oak.blob.cloud.azure.blobstorage.AzuriteDockerRule;
+import org.apache.jackrabbit.oak.segment.remote.WriteAccessController;
 import org.apache.jackrabbit.oak.segment.spi.monitor.IOMonitorAdapter;
 import org.apache.jackrabbit.oak.segment.file.tar.TarWriterTest;
 import org.apache.jackrabbit.oak.segment.spi.persistence.SegmentArchiveManager;
@@ -44,16 +45,21 @@ public class AzureTarWriterTest extends TarWriterTest {
     @NotNull
     @Override
     protected SegmentArchiveManager getSegmentArchiveManager() throws 
Exception {
-        return new AzureArchiveManager(container.getDirectoryReference("oak"), 
new IOMonitorAdapter(), monitor);
+        WriteAccessController writeAccessController = new 
WriteAccessController();
+        writeAccessController.enableWriting();
+        AzureArchiveManager azureArchiveManager = new 
AzureArchiveManager(container.getDirectoryReference("oak"), new 
IOMonitorAdapter(), monitor, writeAccessController);
+        return azureArchiveManager;
     }
 
     @NotNull
     @Override
     protected SegmentArchiveManager getFailingSegmentArchiveManager() throws 
Exception {
-        return new AzureArchiveManager(container.getDirectoryReference("oak"), 
new IOMonitorAdapter(), monitor) {
+        final WriteAccessController writeAccessController = new 
WriteAccessController();
+        writeAccessController.enableWriting();
+        return new AzureArchiveManager(container.getDirectoryReference("oak"), 
new IOMonitorAdapter(), monitor, writeAccessController) {
             @Override
             public SegmentArchiveWriter create(String archiveName) throws 
IOException {
-                return new 
AzureSegmentArchiveWriter(getDirectory(archiveName), ioMonitor, monitor) {
+                return new 
AzureSegmentArchiveWriter(getDirectory(archiveName), ioMonitor, monitor, 
writeAccessController) {
                     @Override
                     public void writeGraph(@NotNull byte[] data) throws 
IOException {
                         throw new IOException("test");
diff --git 
a/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/WriteAccessController.java
 
b/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/WriteAccessController.java
index 93a6b96a6c..114e806a78 100644
--- 
a/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/WriteAccessController.java
+++ 
b/oak-segment-remote/src/main/java/org/apache/jackrabbit/oak/segment/remote/WriteAccessController.java
@@ -16,48 +16,31 @@
  */
 package org.apache.jackrabbit.oak.segment.remote;
 
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-
 public class WriteAccessController {
-    private boolean isWritingAllowed = false;
-    private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
+    private volatile boolean isWritingAllowed = false;
 
     public void disableWriting() {
-        lock.writeLock().lock();
-        try {
-            this.isWritingAllowed = false;
-        } finally {
-            lock.writeLock().unlock();
-        }
+        this.isWritingAllowed = false;
     }
 
     public void enableWriting() {
-            lock.writeLock().lock();
-            try {
-                this.isWritingAllowed = true;
-                synchronized (this) {
-                    this.notifyAll();
-                }
-            } finally {
-                lock.writeLock().unlock();
-            }
+        this.isWritingAllowed = true;
+
+        synchronized (this) {
+            this.notifyAll();
+        }
     }
 
     public void checkWritingAllowed() {
-        lock.readLock().lock();
-        try {
-            while (!isWritingAllowed) {
-                synchronized (this) {
-                    try {
-                        this.wait();
-                    } catch (InterruptedException e) {
-                        Thread.currentThread().interrupt();
-                        throw new RuntimeException("Interrupted while waiting 
for writing to be allowed", e);
-                    }
+        while (!isWritingAllowed) {
+            synchronized (this) {
+                try {
+                    this.wait();
+                } catch (InterruptedException e) {
+                    Thread.currentThread().interrupt();
+                    throw new RuntimeException("Interrupted while waiting for 
writing to be allowed", e);
                 }
             }
-        } finally {
-            lock.readLock().unlock();
         }
     }
 }
diff --git 
a/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/WriteAccessControllerTest.java
 
b/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/WriteAccessControllerTest.java
new file mode 100644
index 0000000000..4302d8158e
--- /dev/null
+++ 
b/oak-segment-remote/src/test/java/org/apache/jackrabbit/oak/segment/remote/WriteAccessControllerTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.jackrabbit.oak.segment.remote;
+
+import org.junit.Test;
+
+import static org.junit.Assert.assertFalse;
+
+public class WriteAccessControllerTest {
+
+    @Test
+    public void testThreadBlocking() throws InterruptedException {
+        WriteAccessController controller = new WriteAccessController();
+
+        Thread t1 = new Thread(() -> {
+            controller.checkWritingAllowed();
+        });
+        Thread t2 = new Thread(() -> {
+            controller.checkWritingAllowed();
+        });
+
+        controller.disableWriting();
+
+        t1.start();
+        t2.start();
+
+        Thread.sleep(200);
+
+        assertThreadWaiting(t1.getState());
+        assertThreadWaiting(t2.getState());
+
+        controller.enableWriting();
+
+        Thread.sleep(200);
+
+        assertFalse(t1.isAlive());
+        assertFalse(t2.isAlive());
+    }
+
+    private void assertThreadWaiting(Thread.State state) {
+        assert state == Thread.State.WAITING || state == 
Thread.State.TIMED_WAITING;
+    }
+}

Reply via email to