This is an automated email from the ASF dual-hosted git repository.
weichiu pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git
The following commit(s) were added to refs/heads/master by this push:
new 20471a74e6c HDDS-13905. Bootstrap lock acquired in background services
can lead to deadlock (#9273)
20471a74e6c is described below
commit 20471a74e6ca517848e2ba46b23b44862b4ab96c
Author: Swaminathan Balachandran <[email protected]>
AuthorDate: Wed Nov 12 18:29:45 2025 -0500
HDDS-13905. Bootstrap lock acquired in background services can lead to
deadlock (#9273)
---
.../hadoop/ozone/lock/BootstrapStateHandler.java | 27 +++++-----
.../hadoop/hdds/utils/DBCheckpointServlet.java | 21 +++++---
.../ozone/rocksdiff/RocksDBCheckpointDiffer.java | 7 +--
.../apache/ozone/rocksdiff/TestCompactionDag.java | 6 +--
.../rocksdiff/TestRocksDBCheckpointDiffer.java | 6 +--
.../hdds/scm/TestSCMDbCheckpointServlet.java | 2 +-
.../hadoop/ozone/om/TestOMDbCheckpointServlet.java | 10 ++--
.../TestOMDbCheckpointServletInodeBasedXfer.java | 59 +++++++++++++---------
.../snapshot/TestSnapshotBackgroundServices.java | 1 -
.../hadoop/ozone/om/OMDBCheckpointServlet.java | 14 ++---
.../om/OMDBCheckpointServletInodeBasedXfer.java | 3 +-
.../hadoop/ozone/om/SstFilteringService.java | 9 ++--
.../om/service/AbstractKeyDeletingService.java | 37 ++++++++++++++
.../ozone/om/service/DirectoryDeletingService.java | 18 +++----
.../ozone/om/service/KeyDeletingService.java | 14 +++--
.../ozone/om/service/SnapshotDeletingService.java | 18 +++----
.../ozone/om/service/TestKeyDeletingService.java | 3 +-
.../ozone/om/snapshot/TestSstFilteringService.java | 5 +-
18 files changed, 151 insertions(+), 109 deletions(-)
diff --git
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/lock/BootstrapStateHandler.java
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/lock/BootstrapStateHandler.java
index d6de873b842..eee070e9d2c 100644
---
a/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/lock/BootstrapStateHandler.java
+++
b/hadoop-hdds/common/src/main/java/org/apache/hadoop/ozone/lock/BootstrapStateHandler.java
@@ -17,28 +17,31 @@
package org.apache.hadoop.ozone.lock;
-import java.util.concurrent.Semaphore;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
+import org.apache.ratis.util.UncheckedAutoCloseable;
/** Bootstrap state handler interface. */
public interface BootstrapStateHandler {
Lock getBootstrapStateLock();
- /** Bootstrap state handler lock implementation. */
- class Lock implements AutoCloseable {
- private final Semaphore semaphore = new Semaphore(1);
+ /** Bootstrap state handler lock implementation. Should be always acquired
before opening any snapshot to avoid
+ * deadlocks*/
+ class Lock {
+ private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
- public Lock lock() throws InterruptedException {
- semaphore.acquire();
- return this;
+ private UncheckedAutoCloseable lock(boolean readLock) {
+ java.util.concurrent.locks.Lock lock = readLock ?
readWriteLock.readLock() : readWriteLock.writeLock();
+ lock.lock();
+ return lock::unlock;
}
- public void unlock() {
- semaphore.release();
+ public UncheckedAutoCloseable acquireWriteLock() throws
InterruptedException {
+ return lock(false);
}
- @Override
- public void close() {
- unlock();
+ public UncheckedAutoCloseable acquireReadLock() throws
InterruptedException {
+ return lock(true);
}
}
}
diff --git
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/DBCheckpointServlet.java
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/DBCheckpointServlet.java
index dae2df9e5c3..2e0bbc5eb15 100644
---
a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/DBCheckpointServlet.java
+++
b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/DBCheckpointServlet.java
@@ -54,6 +54,7 @@
import org.apache.hadoop.hdds.utils.db.DBStore;
import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
import org.apache.hadoop.security.UserGroupInformation;
+import org.apache.ratis.util.UncheckedAutoCloseable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -96,7 +97,7 @@ public void initialize(DBStore store, DBCheckpointMetrics
metrics,
this.aclEnabled = omAclEnabled;
this.admins = new OzoneAdmins(allowedAdminUsers, allowedAdminGroups);
this.isSpnegoEnabled = isSpnegoAuthEnabled;
- lock = new Lock();
+ lock = new NoOpLock();
// Create a directory for temp bootstrap data
File dbLocation = dbStore.getDbLocation();
@@ -214,7 +215,7 @@ public void
processMetadataSnapshotRequest(HttpServletRequest request, HttpServl
Set<String> receivedSstFiles = extractSstFilesToExclude(sstParam);
DBCheckpoint checkpoint = null;
Path tmpdir = null;
- try (BootstrapStateHandler.Lock lock = getBootstrapStateLock().lock()) {
+ try (UncheckedAutoCloseable lock =
getBootstrapStateLock().acquireWriteLock()) {
tmpdir = Files.createTempDirectory(bootstrapTempData.toPath(),
"bootstrap-data-");
checkpoint = getCheckpoint(tmpdir, flush);
@@ -393,18 +394,22 @@ public BootstrapStateHandler.Lock getBootstrapStateLock()
{
/**
* This lock is a no-op but can overridden by child classes.
*/
- public static class Lock extends BootstrapStateHandler.Lock {
- public Lock() {
+ public static class NoOpLock extends BootstrapStateHandler.Lock {
+
+ private final UncheckedAutoCloseable noopLock = () -> {
+ };
+
+ public NoOpLock() {
}
@Override
- public BootstrapStateHandler.Lock lock()
- throws InterruptedException {
- return this;
+ public UncheckedAutoCloseable acquireReadLock() {
+ return noopLock;
}
@Override
- public void unlock() {
+ public UncheckedAutoCloseable acquireWriteLock() {
+ return noopLock;
}
}
}
diff --git
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/RocksDBCheckpointDiffer.java
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/RocksDBCheckpointDiffer.java
index 44cbc45ad6b..9de00948da7 100644
---
a/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/RocksDBCheckpointDiffer.java
+++
b/hadoop-hdds/rocksdb-checkpoint-differ/src/main/java/org/apache/ozone/rocksdiff/RocksDBCheckpointDiffer.java
@@ -85,6 +85,7 @@
import org.apache.ozone.compaction.log.CompactionFileInfo;
import org.apache.ozone.compaction.log.CompactionLogEntry;
import org.apache.ozone.rocksdb.util.RdbUtil;
+import org.apache.ratis.util.UncheckedAutoCloseable;
import org.rocksdb.AbstractEventListener;
import org.rocksdb.ColumnFamilyHandle;
import org.rocksdb.CompactionJobInfo;
@@ -1104,7 +1105,7 @@ public void pruneOlderSnapshotsWithCompactionHistory() {
sstFileNodesRemoved);
}
- try (BootstrapStateHandler.Lock lock = getBootstrapStateLock().lock()) {
+ try (UncheckedAutoCloseable lock =
getBootstrapStateLock().acquireReadLock()) {
removeSstFiles(sstFileNodesRemoved);
removeKeyFromCompactionLogTable(keysToRemove);
} catch (InterruptedException e) {
@@ -1266,7 +1267,7 @@ public void pruneSstFiles() {
nonLeafSstFiles);
}
- try (BootstrapStateHandler.Lock lock = getBootstrapStateLock().lock()) {
+ try (UncheckedAutoCloseable lock =
getBootstrapStateLock().acquireReadLock()) {
removeSstFiles(nonLeafSstFiles);
} catch (InterruptedException e) {
throw new RuntimeException(e);
@@ -1325,7 +1326,7 @@ public void pruneSstFileValues() {
prunedSSTFilePath.toFile().getAbsolutePath());
// Move pruned.sst.tmp => file.sst and replace existing file
atomically.
- try (BootstrapStateHandler.Lock lock =
getBootstrapStateLock().lock()) {
+ try (UncheckedAutoCloseable lock =
getBootstrapStateLock().acquireReadLock()) {
Files.move(prunedSSTFilePath, sstFilePath,
StandardCopyOption.ATOMIC_MOVE,
StandardCopyOption.REPLACE_EXISTING);
}
diff --git
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestCompactionDag.java
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestCompactionDag.java
index 025aabd1cb2..f9733eec24e 100644
---
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestCompactionDag.java
+++
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestCompactionDag.java
@@ -65,9 +65,9 @@
import org.apache.hadoop.hdds.utils.db.managed.ManagedRawSSTFileReader;
import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksDB;
import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksIterator;
-import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
import org.apache.ozone.compaction.log.CompactionLogEntry;
import org.apache.ozone.test.GenericTestUtils;
+import org.apache.ratis.util.UncheckedAutoCloseable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.params.ParameterizedTest;
@@ -699,8 +699,8 @@ private void waitForLock(RocksDBCheckpointDiffer differ,
Future<Boolean> future;
// Take the lock and start the consumer.
- try (BootstrapStateHandler.Lock lock =
- differ.getBootstrapStateLock().lock()) {
+ try (UncheckedAutoCloseable lock =
+ differ.getBootstrapStateLock().acquireWriteLock()) {
future = executorService.submit(
() -> {
c.accept(differ);
diff --git
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
index c59f6aeb491..d24790dfcfc 100644
---
a/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
+++
b/hadoop-hdds/rocksdb-checkpoint-differ/src/test/java/org/apache/ozone/rocksdiff/TestRocksDBCheckpointDiffer.java
@@ -101,13 +101,13 @@
import org.apache.hadoop.hdds.utils.db.managed.ManagedSstFileReader;
import org.apache.hadoop.hdds.utils.db.managed.ManagedSstFileReaderIterator;
import org.apache.hadoop.hdds.utils.db.managed.ManagedSstFileWriter;
-import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
import org.apache.hadoop.util.Time;
import org.apache.ozone.compaction.log.CompactionFileInfo;
import org.apache.ozone.compaction.log.CompactionLogEntry;
import org.apache.ozone.rocksdb.util.RdbUtil;
import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer.NodeComparator;
import org.apache.ozone.test.GenericTestUtils;
+import org.apache.ratis.util.UncheckedAutoCloseable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeEach;
@@ -1223,8 +1223,8 @@ private void waitForLock(RocksDBCheckpointDiffer differ,
Future<Boolean> future;
// Take the lock and start the consumer.
- try (BootstrapStateHandler.Lock lock =
- differ.getBootstrapStateLock().lock()) {
+ try (UncheckedAutoCloseable lock =
+ differ.getBootstrapStateLock().acquireWriteLock()) {
future = executorService.submit(
() -> {
c.accept(differ);
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMDbCheckpointServlet.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMDbCheckpointServlet.java
index 3715d4ede36..31d00b7228a 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMDbCheckpointServlet.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/hdds/scm/TestSCMDbCheckpointServlet.java
@@ -171,7 +171,7 @@ public void write(int b) throws IOException {
});
when(scmDbCheckpointServletMock.getBootstrapStateLock()).thenReturn(
- new DBCheckpointServlet.Lock());
+ new DBCheckpointServlet.NoOpLock());
scmDbCheckpointServletMock.init();
long initialCheckpointCount =
scmMetrics.getDBCheckpointMetrics().getNumCheckpoints();
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMDbCheckpointServlet.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMDbCheckpointServlet.java
index d0b38116d5f..df15d50e150 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMDbCheckpointServlet.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMDbCheckpointServlet.java
@@ -114,6 +114,7 @@
import org.apache.hadoop.ozone.om.protocol.OzoneManagerProtocol;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.ozone.test.GenericTestUtils;
+import org.apache.ratis.util.UncheckedAutoCloseable;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -856,8 +857,7 @@ private void testBootstrapLocking() throws Exception {
// Confirm the other handlers are locked out when the bootstrap
// servlet takes the lock.
- try (BootstrapStateHandler.Lock ignoredLock =
- spyServlet.getBootstrapStateLock().lock()) {
+ try (AutoCloseable ignoredLock =
spyServlet.getBootstrapStateLock().acquireWriteLock()) {
confirmServletLocksOutOtherHandler(keyDeletingService, executorService);
confirmServletLocksOutOtherHandler(snapshotDeletingService,
executorService);
@@ -898,8 +898,7 @@ private void
confirmServletLocksOutOtherHandler(BootstrapStateHandler handler,
private void confirmOtherHandlerLocksOutServlet(BootstrapStateHandler
handler,
BootstrapStateHandler servlet, ExecutorService executorService)
throws InterruptedException {
- try (BootstrapStateHandler.Lock ignoredLock =
- handler.getBootstrapStateLock().lock()) {
+ try (UncheckedAutoCloseable ignoredLock =
handler.getBootstrapStateLock().acquireWriteLock()) {
Future<Boolean> test = checkLock(servlet, executorService);
// Servlet should fail to lock when other handler has taken it.
assertThrows(TimeoutException.class,
@@ -912,8 +911,7 @@ private Future<Boolean> checkLock(BootstrapStateHandler
handler,
ExecutorService executorService) {
return executorService.submit(() -> {
try {
- handler.getBootstrapStateLock().lock();
- handler.getBootstrapStateLock().unlock();
+ handler.getBootstrapStateLock().acquireWriteLock().close();
return true;
} catch (InterruptedException e) {
}
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMDbCheckpointServletInodeBasedXfer.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMDbCheckpointServletInodeBasedXfer.java
index b936d7ab518..7c8f2eb8db4 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMDbCheckpointServletInodeBasedXfer.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/TestOMDbCheckpointServletInodeBasedXfer.java
@@ -114,6 +114,7 @@
import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer;
import org.apache.ozone.test.GenericTestUtils;
import org.apache.ratis.protocol.ClientId;
+import org.apache.ratis.util.UncheckedAutoCloseable;
import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeEach;
@@ -637,10 +638,25 @@ public void testBootstrapLockCoordination() throws
Exception {
RocksDBCheckpointDiffer mockCheckpointDiffer =
mock(RocksDBCheckpointDiffer.class);
// Create mock locks for each service
BootstrapStateHandler.Lock mockDeletingLock =
mock(BootstrapStateHandler.Lock.class);
+ UncheckedAutoCloseable mockDeletingAcquiredLock =
mock(UncheckedAutoCloseable.class);
+
when(mockDeletingLock.acquireWriteLock()).thenReturn(mockDeletingAcquiredLock);
+
BootstrapStateHandler.Lock mockDirDeletingLock =
mock(BootstrapStateHandler.Lock.class);
+ UncheckedAutoCloseable mockDirDeletingAcquiredLock =
mock(UncheckedAutoCloseable.class);
+
when(mockDirDeletingLock.acquireWriteLock()).thenReturn(mockDirDeletingAcquiredLock);
+
BootstrapStateHandler.Lock mockFilteringLock =
mock(BootstrapStateHandler.Lock.class);
+ UncheckedAutoCloseable mockFilteringAcquiredLock =
mock(UncheckedAutoCloseable.class);
+
when(mockFilteringLock.acquireWriteLock()).thenReturn(mockFilteringAcquiredLock);
+
BootstrapStateHandler.Lock mockSnapshotDeletingLock =
mock(BootstrapStateHandler.Lock.class);
+ UncheckedAutoCloseable mockSnapshotDeletingAcquiredLock =
mock(UncheckedAutoCloseable.class);
+
when(mockSnapshotDeletingLock.acquireWriteLock()).thenReturn(mockSnapshotDeletingAcquiredLock);
+
BootstrapStateHandler.Lock mockCheckpointDifferLock =
mock(BootstrapStateHandler.Lock.class);
+ UncheckedAutoCloseable mockCheckpointDifferAcquiredLock =
mock(UncheckedAutoCloseable.class);
+
when(mockCheckpointDifferLock.acquireWriteLock()).thenReturn(mockCheckpointDifferAcquiredLock);
+
// Configure service mocks to return their respective locks
when(mockDeletingService.getBootstrapStateLock()).thenReturn(mockDeletingLock);
when(mockDirDeletingService.getBootstrapStateLock()).thenReturn(mockDirDeletingLock);
@@ -665,25 +681,23 @@ public void testBootstrapLockCoordination() throws
Exception {
// Create the actual Lock instance (this tests the real implementation)
OMDBCheckpointServlet.Lock bootstrapLock = new
OMDBCheckpointServlet.Lock(mockOM);
// Test successful lock acquisition
- BootstrapStateHandler.Lock result = bootstrapLock.lock();
+ UncheckedAutoCloseable result = bootstrapLock.acquireWriteLock();
// Verify all service locks were acquired
- verify(mockDeletingLock).lock();
- verify(mockDirDeletingLock).lock();
- verify(mockFilteringLock).lock();
- verify(mockSnapshotDeletingLock).lock();
- verify(mockCheckpointDifferLock).lock();
+ verify(mockDeletingLock).acquireWriteLock();
+ verify(mockDirDeletingLock).acquireWriteLock();
+ verify(mockFilteringLock).acquireWriteLock();
+ verify(mockSnapshotDeletingLock).acquireWriteLock();
+ verify(mockCheckpointDifferLock).acquireWriteLock();
// Verify double buffer flush was called
verify(mockOM).awaitDoubleBufferFlush();
- // Verify the lock returns itself
- assertEquals(bootstrapLock, result);
// Test unlock
- bootstrapLock.unlock();
+ result.close();
// Verify all service locks were released
- verify(mockDeletingLock).unlock();
- verify(mockDirDeletingLock).unlock();
- verify(mockFilteringLock).unlock();
- verify(mockSnapshotDeletingLock).unlock();
- verify(mockCheckpointDifferLock).unlock();
+ verify(mockDeletingAcquiredLock).close();
+ verify(mockDirDeletingAcquiredLock).close();
+ verify(mockFilteringAcquiredLock).close();
+ verify(mockSnapshotDeletingAcquiredLock).close();
+ verify(mockCheckpointDifferAcquiredLock).close();
}
/**
@@ -709,13 +723,11 @@ public void testBootstrapLockBlocksMultipleServices()
throws Exception {
AtomicInteger servicesSucceeded = new AtomicInteger(0);
// Checkpoint thread holds bootstrap lock
Thread checkpointThread = new Thread(() -> {
- try {
- LOG.info("Acquiring bootstrap lock for checkpoint...");
- BootstrapStateHandler.Lock acquired = bootstrapLock.lock();
+ LOG.info("Acquiring bootstrap lock for checkpoint...");
+ try (UncheckedAutoCloseable acquired = bootstrapLock.acquireWriteLock())
{
bootstrapAcquired.countDown();
Thread.sleep(3000); // Hold for 3 seconds
LOG.info("Releasing bootstrap lock...");
- acquired.unlock();
} catch (Exception e) {
fail("Checkpoint failed: " + e.getMessage());
}
@@ -729,11 +741,12 @@ public void testBootstrapLockBlocksMultipleServices()
throws Exception {
LOG.info("{} : Trying to acquire lock...", serviceName);
servicesBlocked.incrementAndGet();
BootstrapStateHandler.Lock serviceLock =
service.getBootstrapStateLock();
- serviceLock.lock(); // Should block!
- servicesBlocked.decrementAndGet();
- servicesSucceeded.incrementAndGet();
- LOG.info(" {} : Lock acquired!", serviceName);
- serviceLock.unlock();
+ try (UncheckedAutoCloseable lock =
serviceLock.acquireReadLock()) {
+ // Should block!
+ servicesBlocked.decrementAndGet();
+ servicesSucceeded.incrementAndGet();
+ LOG.info(" {} : Lock acquired!", serviceName);
+ }
}
allServicesCompleted.countDown();
} catch (Exception e) {
diff --git
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java
index eabafc45176..635002aa098 100644
---
a/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java
+++
b/hadoop-ozone/integration-test/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSnapshotBackgroundServices.java
@@ -191,7 +191,6 @@ public void shutdown() {
}
@Test
- @Flaky("HDDS-13889")
@DisplayName("testSnapshotAndKeyDeletionBackgroundServices")
@SuppressWarnings("methodlength")
public void testSnapshotAndKeyDeletionBackgroundServices()
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java
index efe9fc0aeea..ebc77f5da7d 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServlet.java
@@ -40,6 +40,7 @@
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
+import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -74,6 +75,7 @@
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.hadoop.util.Time;
import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer;
+import org.apache.ratis.util.UncheckedAutoCloseable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -684,21 +686,21 @@ static class Lock extends BootstrapStateHandler.Lock {
}
@Override
- public BootstrapStateHandler.Lock lock()
- throws InterruptedException {
+ public UncheckedAutoCloseable acquireWriteLock() throws
InterruptedException {
// First lock all the handlers.
+ List<UncheckedAutoCloseable> acquiredLocks = new
ArrayList<>(locks.size());
for (BootstrapStateHandler.Lock lock : locks) {
- lock.lock();
+ acquiredLocks.add(lock.acquireWriteLock());
}
// Then wait for the double buffer to be flushed.
om.awaitDoubleBufferFlush();
- return this;
+ return () -> acquiredLocks.forEach(UncheckedAutoCloseable::close);
}
@Override
- public void unlock() {
- locks.forEach(BootstrapStateHandler.Lock::unlock);
+ public UncheckedAutoCloseable acquireReadLock() {
+ throw new UnsupportedOperationException("Read locks are not supported
for OMDBCheckpointServlet");
}
}
}
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java
index 3291c37a0b8..4eb49db24aa 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OMDBCheckpointServletInodeBasedXfer.java
@@ -78,6 +78,7 @@
import org.apache.hadoop.util.Time;
import org.apache.ozone.compaction.log.CompactionLogEntry;
import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer;
+import org.apache.ratis.util.UncheckedAutoCloseable;
import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -148,7 +149,7 @@ public void
processMetadataSnapshotRequest(HttpServletRequest request, HttpServl
OZONE_DB_CHECKPOINT_REQUEST_TO_EXCLUDE_SST);
Set<String> receivedSstFiles = extractFilesToExclude(sstParam);
Path tmpdir = null;
- try (BootstrapStateHandler.Lock lock = getBootstrapStateLock().lock()) {
+ try (UncheckedAutoCloseable lock =
getBootstrapStateLock().acquireWriteLock()) {
tmpdir = Files.createTempDirectory(getBootstrapTempData().toPath(),
"bootstrap-data-");
if (tmpdir == null) {
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
index 8ff0a71d68d..e7c76bc539d 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java
@@ -45,6 +45,7 @@
import org.apache.hadoop.ozone.om.exceptions.OMException;
import org.apache.hadoop.ozone.om.helpers.SnapshotInfo;
import org.apache.hadoop.ozone.om.lock.OMLockDetails;
+import org.apache.ratis.util.UncheckedAutoCloseable;
import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -185,7 +186,7 @@ public BackgroundTaskResult call() throws Exception {
ozoneManager.getMetadataManager().getTableBucketPrefix(snapshotInfo.getVolumeName(),
snapshotInfo.getBucketName());
- try (
+ try (UncheckedAutoCloseable lock =
getBootstrapStateLock().acquireReadLock();
UncheckedAutoCloseableSupplier<OmSnapshot>
snapshotMetadataReader =
snapshotManager.get().getActiveSnapshot(
snapshotInfo.getVolumeName(),
@@ -195,10 +196,8 @@ public BackgroundTaskResult call() throws Exception {
RDBStore rdbStore = (RDBStore) omSnapshot.getMetadataManager()
.getStore();
RocksDatabase db = rdbStore.getDb();
- try (BootstrapStateHandler.Lock lock = getBootstrapStateLock()
- .lock()) {
- db.deleteFilesNotMatchingPrefix(bucketPrefixInfo);
- }
+ db.deleteFilesNotMatchingPrefix(bucketPrefixInfo);
+
markSSTFilteredFlagForSnapshot(snapshotInfo);
snapshotLimit--;
snapshotFilteredCount.getAndIncrement();
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/AbstractKeyDeletingService.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/AbstractKeyDeletingService.java
index 5650ab7734e..5a7fc28d762 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/AbstractKeyDeletingService.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/AbstractKeyDeletingService.java
@@ -26,6 +26,9 @@
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicLong;
import org.apache.hadoop.hdds.utils.BackgroundService;
+import org.apache.hadoop.hdds.utils.BackgroundTask;
+import org.apache.hadoop.hdds.utils.BackgroundTaskQueue;
+import org.apache.hadoop.hdds.utils.BackgroundTaskResult;
import org.apache.hadoop.hdds.utils.TransactionInfo;
import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
import org.apache.hadoop.ozone.om.DeletingServiceMetrics;
@@ -36,6 +39,7 @@
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMRequest;
import
org.apache.hadoop.ozone.protocol.proto.OzoneManagerProtocolProtos.OMResponse;
import org.apache.ratis.protocol.ClientId;
+import org.apache.ratis.util.UncheckedAutoCloseable;
/**
* Abstracts common code from KeyDeletingService and DirectoryDeletingService
@@ -67,6 +71,9 @@ public AbstractKeyDeletingService(String serviceName, long
interval,
this.suspended = new AtomicBoolean(false);
}
+ @Override
+ public abstract DeletingServiceTaskQueue getTasks();
+
protected OMResponse submitRequest(OMRequest omRequest) throws
ServiceException {
return OzoneManagerRatisUtils.submitRequest(ozoneManager, omRequest,
clientId, callId.incrementAndGet());
}
@@ -92,6 +99,36 @@ boolean isPreviousPurgeTransactionFlushed() throws
IOException {
return true;
}
+ /**
+ * A specialized implementation of {@link BackgroundTaskQueue} that modifies
+ * the behavior of added tasks to utilize a read lock during execution.
+ *
+ * This class ensures that every {@link BackgroundTask} added to the queue
+ * is wrapped such that its execution acquires a read lock via
+ * {@code getBootstrapStateLock().acquireReadLock()} before performing any
+ * operations. The lock is automatically released upon task completion or
+ * exception, ensuring safe concurrent execution of tasks within the service
when running along with bootstrap flow.
+ */
+ public class DeletingServiceTaskQueue extends BackgroundTaskQueue {
+ @Override
+ public synchronized void add(BackgroundTask task) {
+ super.add(new BackgroundTask() {
+
+ @Override
+ public BackgroundTaskResult call() throws Exception {
+ try (UncheckedAutoCloseable readLock =
getBootstrapStateLock().acquireReadLock()) {
+ return task.call();
+ }
+ }
+
+ @Override
+ public int getPriority() {
+ return task.getPriority();
+ }
+ });
+ }
+ }
+
/**
* Suspend the service.
*/
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
index 39978e8f6e2..45256a7ff05 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/DirectoryDeletingService.java
@@ -54,14 +54,12 @@
import org.apache.hadoop.hdds.conf.ReconfigurationHandler;
import org.apache.hadoop.hdds.conf.StorageUnit;
import org.apache.hadoop.hdds.utils.BackgroundTask;
-import org.apache.hadoop.hdds.utils.BackgroundTaskQueue;
import org.apache.hadoop.hdds.utils.BackgroundTaskResult;
import org.apache.hadoop.hdds.utils.IOUtils;
import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.hdds.utils.db.Table.KeyValue;
import org.apache.hadoop.hdds.utils.db.TableIterator;
import org.apache.hadoop.ozone.ClientVersion;
-import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
import org.apache.hadoop.ozone.om.DeleteKeysResult;
import org.apache.hadoop.ozone.om.KeyManager;
import org.apache.hadoop.ozone.om.OMConfigKeys;
@@ -209,8 +207,8 @@ private synchronized void
updateAndRestart(OzoneConfiguration conf) {
}
@Override
- public BackgroundTaskQueue getTasks() {
- BackgroundTaskQueue queue = new BackgroundTaskQueue();
+ public DeletingServiceTaskQueue getTasks() {
+ DeletingServiceTaskQueue queue = new DeletingServiceTaskQueue();
queue.add(new DirDeletingTask(null));
if (deepCleanSnapshots) {
Iterator<UUID> iterator = null;
@@ -267,7 +265,7 @@ void optimizeDirDeletesAndSubmitRequest(
CheckedFunction<KeyValue<String, OmKeyInfo>, Boolean, IOException>
reclaimableDirChecker,
CheckedFunction<KeyValue<String, OmKeyInfo>, Boolean, IOException>
reclaimableFileChecker,
Map<VolumeBucketId, BucketNameInfo> bucketNameInfoMap,
- UUID expectedPreviousSnapshotId, long rnCnt) throws InterruptedException
{
+ UUID expectedPreviousSnapshotId, long rnCnt) {
// Optimization to handle delete sub-dir and keys to remove quickly
// This case will be useful to handle when depth of directory is high
@@ -464,8 +462,7 @@ private OzoneManagerProtocolProtos.PurgePathRequest
wrapPurgeRequest(
}
private OzoneManagerProtocolProtos.OMResponse
submitPurgePaths(List<PurgePathRequest> requests,
- String snapTableKey, UUID expectedPreviousSnapshotId,
Map<VolumeBucketId, BucketNameInfo> bucketNameInfoMap)
- throws InterruptedException {
+ String snapTableKey, UUID expectedPreviousSnapshotId,
Map<VolumeBucketId, BucketNameInfo> bucketNameInfoMap) {
OzoneManagerProtocolProtos.PurgeDirectoriesRequest.Builder purgeDirRequest
=
OzoneManagerProtocolProtos.PurgeDirectoriesRequest.newBuilder();
@@ -492,7 +489,7 @@ private OzoneManagerProtocolProtos.OMResponse
submitPurgePaths(List<PurgePathReq
.build();
// Submit Purge paths request to OM. Acquire bootstrap lock when
processing deletes for snapshots.
- try (BootstrapStateHandler.Lock lock = snapTableKey != null ?
getBootstrapStateLock().lock() : null) {
+ try {
return submitRequest(omRequest);
} catch (ServiceException e) {
LOG.error("PurgePaths request failed. Will retry at next run.", e);
@@ -558,9 +555,6 @@ void processDeletedDirsForStore(SnapshotInfo
currentSnapshotInfo, KeyManager key
try {
return processDeletedDirectories(currentSnapshotInfo,
keyManager, dirSupplier, remainingBufLimit,
expectedPreviousSnapshotId, exclusiveSizeMap, rnCnt);
- } catch (InterruptedException e) {
- Thread.currentThread().interrupt();
- return false;
} catch (Throwable e) {
return false;
}
@@ -609,7 +603,7 @@ void processDeletedDirsForStore(SnapshotInfo
currentSnapshotInfo, KeyManager key
*/
private boolean processDeletedDirectories(SnapshotInfo
currentSnapshotInfo, KeyManager keyManager,
DeletedDirSupplier dirSupplier, long remainingBufLimit, UUID
expectedPreviousSnapshotId,
- Map<UUID, Pair<Long, Long>> totalExclusiveSizeMap, long runCount)
throws InterruptedException {
+ Map<UUID, Pair<Long, Long>> totalExclusiveSizeMap, long runCount) {
OmSnapshotManager omSnapshotManager =
getOzoneManager().getOmSnapshotManager();
IOzoneManagerLock lock =
getOzoneManager().getMetadataManager().getLock();
String snapshotTableKey = currentSnapshotInfo == null ? null :
currentSnapshotInfo.getTableKey();
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
index 254184f8b82..75019adf7ec 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/KeyDeletingService.java
@@ -45,7 +45,6 @@
import org.apache.hadoop.hdds.conf.StorageUnit;
import org.apache.hadoop.hdds.scm.protocol.ScmBlockLocationProtocol;
import org.apache.hadoop.hdds.utils.BackgroundTask;
-import org.apache.hadoop.hdds.utils.BackgroundTaskQueue;
import org.apache.hadoop.hdds.utils.BackgroundTaskResult;
import org.apache.hadoop.hdds.utils.BackgroundTaskResult.EmptyTaskResult;
import org.apache.hadoop.hdds.utils.db.Table;
@@ -387,7 +386,7 @@ private Pair<Pair<Integer, Long>, Boolean>
submitPurgeKeysRequest(
bucketPurgeKeysSizeMap.values().stream().map(BucketPurgeSize::toProtobuf)
.forEach(requestBuilder::addBucketPurgeKeysSize);
bucketPurgeKeysSizeMap.clear();
- purgeSuccess = submitPurgeRequest(snapTableKey, purgeSuccess,
requestBuilder);
+ purgeSuccess = submitPurgeRequest(purgeSuccess, requestBuilder);
requestBuilder = getPurgeKeysRequest(snapTableKey,
expectedPreviousSnapshotId);
currSize = baseSize;
}
@@ -418,19 +417,18 @@ private static PurgeKeysRequest.Builder
getPurgeKeysRequest(String snapTableKey,
return requestBuilder;
}
- private boolean submitPurgeRequest(String snapTableKey, boolean purgeSuccess,
- PurgeKeysRequest.Builder requestBuilder) {
+ private boolean submitPurgeRequest(boolean purgeSuccess,
PurgeKeysRequest.Builder requestBuilder) {
OzoneManagerProtocolProtos.OMRequest omRequest =
OzoneManagerProtocolProtos.OMRequest.newBuilder().setCmdType(OzoneManagerProtocolProtos.Type.PurgeKeys)
.setPurgeKeysRequest(requestBuilder.build()).setClientId(getClientId().toString()).build();
- try (Lock lock = snapTableKey != null ? getBootstrapStateLock().lock() :
null) {
+ try {
OzoneManagerProtocolProtos.OMResponse omResponse =
submitRequest(omRequest);
if (omResponse != null) {
purgeSuccess = purgeSuccess && omResponse.getSuccess();
}
- } catch (ServiceException | InterruptedException e) {
+ } catch (ServiceException e) {
LOG.error("PurgeKey request failed in batch. Will retry at next run.",
e);
purgeSuccess = false;
// Continue to next batch instead of returning immediately
@@ -466,9 +464,9 @@ private void resetMetrics() {
}
@Override
- public BackgroundTaskQueue getTasks() {
+ public DeletingServiceTaskQueue getTasks() {
resetMetrics();
- BackgroundTaskQueue queue = new BackgroundTaskQueue();
+ DeletingServiceTaskQueue queue = new DeletingServiceTaskQueue();
queue.add(new KeyDeletingTask(null));
if (deepCleanSnapshots) {
Iterator<UUID> iterator = null;
diff --git
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
index ab40a0530fc..07f11cbe593 100644
---
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
+++
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/SnapshotDeletingService.java
@@ -39,11 +39,9 @@
import org.apache.hadoop.hdds.conf.StorageUnit;
import org.apache.hadoop.hdds.protocol.proto.HddsProtos;
import org.apache.hadoop.hdds.utils.BackgroundTask;
-import org.apache.hadoop.hdds.utils.BackgroundTaskQueue;
import org.apache.hadoop.hdds.utils.BackgroundTaskResult;
import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.ozone.ClientVersion;
-import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
import org.apache.hadoop.ozone.om.KeyManager;
import org.apache.hadoop.ozone.om.OMConfigKeys;
import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
@@ -231,7 +229,7 @@ public BackgroundTaskResult call() throws
InterruptedException {
return BackgroundTaskResult.EmptyTaskResult.newResult();
}
- private void submitSnapshotPurgeRequest(List<String> purgeSnapshotKeys)
throws InterruptedException {
+ private void submitSnapshotPurgeRequest(List<String> purgeSnapshotKeys) {
if (!purgeSnapshotKeys.isEmpty()) {
SnapshotPurgeRequest snapshotPurgeRequest = SnapshotPurgeRequest
.newBuilder()
@@ -244,16 +242,14 @@ private void submitSnapshotPurgeRequest(List<String>
purgeSnapshotKeys) throws I
.setClientId(clientId.toString())
.build();
- try (BootstrapStateHandler.Lock lock = getBootstrapStateLock().lock())
{
- submitOMRequest(omRequest);
- }
+ submitOMRequest(omRequest);
}
}
private void submitSnapshotMoveDeletedKeys(SnapshotInfo snapInfo,
List<SnapshotMoveKeyInfos>
deletedKeys,
List<HddsProtos.KeyValue>
renamedList,
- List<SnapshotMoveKeyInfos>
dirsToMove) throws InterruptedException {
+ List<SnapshotMoveKeyInfos>
dirsToMove) {
SnapshotMoveTableKeysRequest.Builder moveDeletedKeysBuilder =
SnapshotMoveTableKeysRequest.newBuilder()
.setFromSnapshotID(toProtobuf(snapInfo.getSnapshotId()));
@@ -282,9 +278,7 @@ private void submitSnapshotMoveDeletedKeys(SnapshotInfo
snapInfo,
.setSnapshotMoveTableKeysRequest(moveDeletedKeys)
.setClientId(clientId.toString())
.build();
- try (BootstrapStateHandler.Lock lock = getBootstrapStateLock().lock()) {
- submitOMRequest(omRequest);
- }
+ submitOMRequest(omRequest);
}
private void submitOMRequest(OMRequest omRequest) {
@@ -313,8 +307,8 @@ boolean shouldIgnoreSnapshot(SnapshotInfo snapInfo) throws
IOException {
}
@Override
- public BackgroundTaskQueue getTasks() {
- BackgroundTaskQueue queue = new BackgroundTaskQueue();
+ public DeletingServiceTaskQueue getTasks() {
+ DeletingServiceTaskQueue queue = new DeletingServiceTaskQueue();
queue.add(new SnapshotDeletingTask());
return queue;
}
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java
index 3dcddaeeafa..4d136bac17d 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestKeyDeletingService.java
@@ -71,7 +71,6 @@
import org.apache.hadoop.hdds.conf.StorageUnit;
import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
import org.apache.hadoop.hdds.server.ServerUtils;
-import org.apache.hadoop.hdds.utils.BackgroundTaskQueue;
import org.apache.hadoop.hdds.utils.db.DBConfigFromFile;
import org.apache.hadoop.hdds.utils.db.Table;
import org.apache.hadoop.ozone.common.BlockGroup;
@@ -658,7 +657,7 @@ public void
testKeyDeletingServiceWithDeepCleanedSnapshots() throws Exception {
KeyDeletingService kds = Mockito.spy(new
KeyDeletingService(ozoneManager, scmBlockTestingClient, 10000,
100000, conf, 10, true));
when(kds.getTasks()).thenAnswer(i -> {
- BackgroundTaskQueue queue = new BackgroundTaskQueue();
+ AbstractKeyDeletingService.DeletingServiceTaskQueue queue = kds.new
DeletingServiceTaskQueue();
for (UUID id : snapshotIds) {
queue.add(kds.new KeyDeletingTask(id));
}
diff --git
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java
index 108dd30c822..b25ff5c52e4 100644
---
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java
+++
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/snapshot/TestSstFilteringService.java
@@ -49,7 +49,6 @@
import org.apache.hadoop.hdds.scm.container.common.helpers.ExcludeList;
import org.apache.hadoop.hdds.utils.db.DBProfile;
import org.apache.hadoop.hdds.utils.db.RDBStore;
-import org.apache.hadoop.ozone.lock.BootstrapStateHandler;
import org.apache.hadoop.ozone.om.KeyManager;
import org.apache.hadoop.ozone.om.OMMetadataManager;
import org.apache.hadoop.ozone.om.OmSnapshot;
@@ -67,6 +66,7 @@
import org.apache.hadoop.ozone.om.request.OMRequestTestUtils;
import org.apache.hadoop.security.UserGroupInformation;
import org.apache.ratis.util.ExitUtils;
+import org.apache.ratis.util.UncheckedAutoCloseable;
import org.apache.ratis.util.function.UncheckedAutoCloseableSupplier;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
@@ -243,8 +243,7 @@ public void testIrrelevantSstFileDeletion()
String snapshotName2 = "snapshot2";
final long count;
- try (BootstrapStateHandler.Lock lock =
- filteringService.getBootstrapStateLock().lock()) {
+ try (UncheckedAutoCloseable lock =
filteringService.getBootstrapStateLock().acquireWriteLock()) {
count = filteringService.getSnapshotFilteredCount().get();
createSnapshot(volumeName, bucketName2, snapshotName2);
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]