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 c4728424cae..33a3739f5e9 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 @@ -376,6 +376,30 @@ public class SnapshotManager implements Stoppable { return false; } + /** + * Check to see if there is a snapshot in progress with the same name or on the same table. + * Currently we have a limitation only allowing a single snapshot per table at a time. Also we + * don't allow snapshot with the same name. + * @param snapshot description of the snapshot being checked. + * @return true if there is a snapshot in progress with the same name or on the same + * table. + */ + synchronized boolean isTakingSnapshot(final SnapshotDescription snapshot) { + TableName snapshotTable = TableName.valueOf(snapshot.getTable()); + if (isTakingSnapshot(snapshotTable)) { + return true; + } + Iterator> it = this.snapshotHandlers.entrySet().iterator(); + while (it.hasNext()) { + Map.Entry entry = it.next(); + SnapshotSentinel sentinel = entry.getValue(); + if (snapshot.getName().equals(sentinel.getSnapshot().getName()) && !sentinel.isFinished()) { + return true; + } + } + return false; + } + /** * Check to see if the specified table has a snapshot in progress. Currently we have a * limitation only allowing a single snapshot per table at a time. @@ -401,12 +425,14 @@ public class SnapshotManager implements Stoppable { TableName.valueOf(snapshot.getTable()); // make sure we aren't already running a snapshot - if (isTakingSnapshot(snapshotTable)) { + if (isTakingSnapshot(snapshot)) { SnapshotSentinel handler = this.snapshotHandlers.get(snapshotTable); throw new SnapshotCreationException("Rejected taking " + ClientSnapshotDescriptionUtils.toString(snapshot) + " because we are already running another snapshot " - + ClientSnapshotDescriptionUtils.toString(handler.getSnapshot()), snapshot); + + (handler != null ? ("on the same table " + + ClientSnapshotDescriptionUtils.toString(handler.getSnapshot())) + : "with the same name"), snapshot); } // make sure we aren't running a restore on the same table