diff --git hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java index cadd6cc..17b3850 100644 --- hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java +++ hbase-client/src/main/java/org/apache/hadoop/hbase/client/HBaseAdmin.java @@ -2759,7 +2759,8 @@ public class HBaseAdmin implements Admin { .setName(snapshotName).setTable(tableName.getNameAsString()).build(); // actually restore the snapshot - ClientSnapshotDescriptionUtils.assertSnapshotRequestIsValid(snapshot); + // make sure the snapshot name is valid + TableName.isLegalTableQualifierName(Bytes.toBytes(snapshot.getName()), true); RestoreSnapshotResponse response = executeCallable( new MasterCallable(getConnection(), getRpcControllerFactory()) { diff --git hbase-client/src/main/java/org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java hbase-client/src/main/java/org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java index 88b6bec..72883da 100644 --- hbase-client/src/main/java/org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java +++ hbase-client/src/main/java/org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java @@ -44,7 +44,7 @@ public class ClientSnapshotDescriptionUtils { // make sure the table name is valid, this will implicitly check validity TableName tableName = TableName.valueOf(snapshot.getTable()); - if (tableName.isSystemTable()) { + if (!tableName.isSnapshottable()) { throw new IllegalArgumentException("System table snapshots are not allowed"); } } diff --git hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java index c4c15d0..e3cf515 100644 --- hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java +++ hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java @@ -23,9 +23,9 @@ import java.util.Arrays; import java.util.Set; import java.util.concurrent.CopyOnWriteArraySet; +import org.apache.hadoop.hbase.KeyValue.KVComparator; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.hbase.KeyValue.KVComparator; /** * Immutable POJO class for representing a table name. @@ -112,6 +112,7 @@ public final class TableName implements Comparable { private final String qualifierAsString; private final boolean systemTable; private final int hashCode; + private boolean snapshottable = false; /** * Check passed byte array, "tableName", is legal user-space table name. @@ -527,4 +528,12 @@ public final class TableName implements Comparable { } return KeyValue.COMPARATOR; } + + public boolean isSnapshottable() { + return !systemTable || snapshottable; + } + + public void setSnapshottable(boolean value) { + this.snapshottable = value; + } }