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;
+ }
+}