diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java index 71cd3716e566..defe804344eb 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java @@ -198,6 +198,7 @@ public String getSnapshotsParentDir() { return snapshotsParentDir; } + @Override public RocksDBCheckpointDiffer getRocksDBCheckpointDiffer() { return rocksDBCheckpointDiffer; } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java index 37b1c129af43..ad8a1a8887de 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/KeyManagerImpl.java @@ -697,10 +697,12 @@ public BackgroundService getMultipartUploadCleanupService() { return multipartUploadCleanupService; } + @Override public SstFilteringService getSnapshotSstFilteringService() { return snapshotSstFilteringService; } + @Override public SnapshotDeletingService getSnapshotDeletingService() { return snapshotDeletingService; } 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 2a7771fe60a3..3e6d70626728 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 @@ -36,6 +36,7 @@ import org.apache.hadoop.security.UserGroupInformation; import org.apache.ozone.rocksdiff.RocksDBCheckpointDiffer; +import com.google.common.base.Preconditions; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -644,29 +645,35 @@ public BootstrapStateHandler.Lock getBootstrapStateLock() { } static class Lock extends BootstrapStateHandler.Lock { - private final BootstrapStateHandler keyDeletingService; - private final BootstrapStateHandler sstFilteringService; - private final BootstrapStateHandler rocksDbCheckpointDiffer; - private final BootstrapStateHandler snapshotDeletingService; + private final List locks; private final OzoneManager om; Lock(OzoneManager om) { + Preconditions.checkNotNull(om); + Preconditions.checkNotNull(om.getKeyManager()); + Preconditions.checkNotNull(om.getMetadataManager()); + Preconditions.checkNotNull(om.getMetadataManager().getStore()); + this.om = om; - keyDeletingService = om.getKeyManager().getDeletingService(); - sstFilteringService = om.getKeyManager().getSnapshotSstFilteringService(); - rocksDbCheckpointDiffer = om.getMetadataManager().getStore() - .getRocksDBCheckpointDiffer(); - snapshotDeletingService = om.getKeyManager().getSnapshotDeletingService(); + + locks = Stream.of( + om.getKeyManager().getDeletingService(), + om.getKeyManager().getSnapshotSstFilteringService(), + om.getMetadataManager().getStore().getRocksDBCheckpointDiffer(), + om.getKeyManager().getSnapshotDeletingService() + ) + .filter(Objects::nonNull) + .map(BootstrapStateHandler::getBootstrapStateLock) + .collect(Collectors.toList()); } @Override public BootstrapStateHandler.Lock lock() throws InterruptedException { // First lock all the handlers. - keyDeletingService.getBootstrapStateLock().lock(); - sstFilteringService.getBootstrapStateLock().lock(); - rocksDbCheckpointDiffer.getBootstrapStateLock().lock(); - snapshotDeletingService.getBootstrapStateLock().lock(); + for (BootstrapStateHandler.Lock lock : locks) { + lock.lock(); + } // Then wait for the double buffer to be flushed. om.awaitDoubleBufferFlush(); @@ -675,10 +682,7 @@ public BootstrapStateHandler.Lock lock() @Override public void unlock() { - snapshotDeletingService.getBootstrapStateLock().unlock(); - rocksDbCheckpointDiffer.getBootstrapStateLock().unlock(); - sstFilteringService.getBootstrapStateLock().unlock(); - keyDeletingService.getBootstrapStateLock().unlock(); + locks.forEach(BootstrapStateHandler.Lock::unlock); } } }