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..87b3411 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 @@ -28,6 +28,7 @@ import java.util.List; import java.util.Map; import java.util.Set; import java.util.concurrent.ThreadPoolExecutor; +import java.util.concurrent.atomic.AtomicBoolean; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FSDataInputStream; @@ -162,6 +163,7 @@ public class SnapshotManager extends MasterProcedureManager implements Stoppable private Path rootDir; private ExecutorService executorService; + private AtomicBoolean snapshotAllowed = new AtomicBoolean(true); /** * Locks for snapshot operations @@ -438,6 +440,10 @@ public class SnapshotManager extends MasterProcedureManager implements Stoppable TableName snapshotTable = TableName.valueOf(snapshot.getTable()); + if (!this.snapshotAllowed.get()) { + 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 +519,18 @@ public class SnapshotManager extends MasterProcedureManager implements Stoppable snapshotTable(snapshot, handler); } + void enableSnapshot() { + snapshotAllowed.set(true); + } + + boolean disbleSnapshot() { + return snapshotAllowed.getAndSet(false); + } + + boolean isAnySnapshotRunning() { + return !this.snapshotHandlers.isEmpty(); + } + /** * Take a snapshot using the specified handler. * On failure the snapshot temporary working directory is removed.