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 5aa2fc78a0a..cc275b4e8e6 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 @@ -405,6 +405,12 @@ private long handleDirectoryCleanUp( while (deletedDirIterator.hasNext()) { Table.KeyValue deletedDir = deletedDirIterator.next(); + String deletedDirKey = deletedDir.getKey(); + + // Exit for dirs out of snapshot scope. + if (!deletedDirKey.startsWith(dbBucketKeyForDir)) { + break; + } if (isDirReclaimable(deletedDir, previousDirTable, renamedTable, renamedList)) { diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotUtils.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotUtils.java index e9b0aa30fd9..89823995d0c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotUtils.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/snapshot/SnapshotUtils.java @@ -34,6 +34,7 @@ import java.io.File; import java.io.IOException; +import java.util.NoSuchElementException; import java.util.HashMap; import java.util.Map; import java.util.UUID; @@ -143,23 +144,33 @@ public static void checkSnapshotActive(SnapshotInfo snapInfo, public static SnapshotInfo getNextActiveSnapshot(SnapshotInfo snapInfo, SnapshotChainManager chainManager, OmSnapshotManager omSnapshotManager) throws IOException { - while (chainManager.hasNextPathSnapshot(snapInfo.getSnapshotPath(), - snapInfo.getSnapshotId())) { - UUID nextPathSnapshot = - chainManager.nextPathSnapshot( - snapInfo.getSnapshotPath(), snapInfo.getSnapshotId()); + // If the snapshot is deleted in the previous run, then the in-memory + // SnapshotChainManager might throw NoSuchElementException as the snapshot + // is removed in-memory but OMDoubleBuffer has not flushed yet. + try { + while (chainManager.hasNextPathSnapshot(snapInfo.getSnapshotPath(), + snapInfo.getSnapshotId())) { - String tableKey = chainManager.getTableKey(nextPathSnapshot); - SnapshotInfo nextSnapshotInfo = - omSnapshotManager.getSnapshotInfo(tableKey); + UUID nextPathSnapshot = + chainManager.nextPathSnapshot( + snapInfo.getSnapshotPath(), snapInfo.getSnapshotId()); - if (nextSnapshotInfo.getSnapshotStatus().equals( - SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE)) { - return nextSnapshotInfo; - } + String tableKey = chainManager.getTableKey(nextPathSnapshot); + SnapshotInfo nextSnapshotInfo = + omSnapshotManager.getSnapshotInfo(tableKey); - snapInfo = nextSnapshotInfo; + if (nextSnapshotInfo.getSnapshotStatus().equals( + SnapshotInfo.SnapshotStatus.SNAPSHOT_ACTIVE)) { + return nextSnapshotInfo; + } + + snapInfo = nextSnapshotInfo; + } + } catch (NoSuchElementException ex) { + LOG.error("The snapshot {} is not longer in snapshot chain, It " + + "maybe removed in the previous Snapshot purge request.", + snapInfo.getTableKey()); } return null; }