diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.java index 358b4ea..1c7b3d7 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotFileCache.java @@ -184,22 +184,33 @@ public class SnapshotFileCache implements Stoppable { List unReferencedFiles = Lists.newArrayList(); List snapshotsInProgress = null; boolean refreshed = false; - for (FileStatus file : files) { - String fileName = file.getPath().getName(); - if (!refreshed && !cache.contains(fileName)) { - refreshCache(); - refreshed = true; - } - if (cache.contains(fileName)) { - continue; + boolean prev = snapshotManager == null ? false : snapshotManager.disbleSnapshot(); + try { + if (prev && snapshotManager.isAnySnapshotRunning()) { + LOG.debug("Not checking unreferenced files since snapshot is running"); + return unReferencedFiles; } - if (snapshotsInProgress == null) { - snapshotsInProgress = getSnapshotsInProgress(snapshotManager); + for (FileStatus file : files) { + String fileName = file.getPath().getName(); + if (!refreshed && !cache.contains(fileName)) { + refreshCache(); + refreshed = true; + } + if (cache.contains(fileName)) { + continue; + } + if (snapshotsInProgress == null) { + snapshotsInProgress = getSnapshotsInProgress(snapshotManager); + } + if (snapshotsInProgress.contains(fileName)) { + continue; + } + unReferencedFiles.add(file); } - if (snapshotsInProgress.contains(fileName)) { - continue; + } finally { + if (prev) { + snapshotManager.enableSnapshot(); } - unReferencedFiles.add(file); } return unReferencedFiles; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.java index e496b44..2f950b6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/snapshot/SnapshotManager.java @@ -162,6 +162,7 @@ public class SnapshotManager extends MasterProcedureManager implements Stoppable private Path rootDir; private ExecutorService executorService; + private volatile boolean snapshotAllowed = true; /** * Locks for snapshot operations @@ -438,6 +439,10 @@ public class SnapshotManager extends MasterProcedureManager implements Stoppable TableName snapshotTable = TableName.valueOf(snapshot.getTable()); + if (!this.snapshotAllowed) { + throw new SnapshotCreationException("snapshot currently disabled"); + } + // make sure we aren't already running a snapshot if (isTakingSnapshot(snapshot)) { SnapshotSentinel handler = this.snapshotHandlers.get(snapshotTable); @@ -513,6 +518,18 @@ public class SnapshotManager extends MasterProcedureManager implements Stoppable snapshotTable(snapshot, handler); } + public void enableSnapshot() { + snapshotAllowed = true; + } + public boolean disbleSnapshot() { + boolean prev = snapshotAllowed; + snapshotAllowed = false; + return prev; + } + public boolean isAnySnapshotRunning() { + return !this.snapshotHandlers.isEmpty(); + } + /** * Take a snapshot using the specified handler. * On failure the snapshot temporary working directory is removed.