diff --git a/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupRestoreConstants.java b/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupRestoreConstants.java index d05a421a3956..57454d402173 100644 --- a/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupRestoreConstants.java +++ b/hbase-backup/src/main/java/org/apache/hadoop/hbase/backup/BackupRestoreConstants.java @@ -18,6 +18,7 @@ package org.apache.hadoop.hbase.backup; import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.NamespaceDescriptor; import org.apache.hadoop.hbase.coprocessor.CoprocessorHost; import org.apache.yetus.audience.InterfaceAudience; @@ -30,7 +31,8 @@ public interface BackupRestoreConstants { * Backup/Restore constants */ String BACKUP_SYSTEM_TABLE_NAME_KEY = "hbase.backup.system.table.name"; - String BACKUP_SYSTEM_TABLE_NAME_DEFAULT = "backup:system"; + String BACKUP_SYSTEM_TABLE_NAME_DEFAULT = + NamespaceDescriptor.BACKUP_NAMESPACE_NAME_STR + ":system"; String BACKUP_SYSTEM_TTL_KEY = "hbase.backup.system.ttl"; diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java index c5e10f11070a..4928ac7491f0 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/snapshot/ClientSnapshotDescriptionUtils.java @@ -46,7 +46,7 @@ public static void assertSnapshotRequestIsValid(SnapshotProtos.SnapshotDescripti // make sure the table name is valid, this will implicitly check validity TableName tableName = TableName.valueOf(snapshot.getTable()); - if (tableName.isSystemTable()) { + if (tableName.isSystemTable() && !tableName.isBackupsTable()) { throw new IllegalArgumentException("System table snapshots are not allowed"); } } diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/NamespaceDescriptor.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/NamespaceDescriptor.java index 588db0abb446..c36d44fccec7 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/NamespaceDescriptor.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/NamespaceDescriptor.java @@ -41,6 +41,9 @@ public class NamespaceDescriptor { /** Default namespace name. */ public static final byte[] DEFAULT_NAMESPACE_NAME = Bytes.toBytes("default"); public static final String DEFAULT_NAMESPACE_NAME_STR = Bytes.toString(DEFAULT_NAMESPACE_NAME); + /** Backup namespace name. */ + public static final byte[] BACKUP_NAMESPACE_NAME = Bytes.toBytes("backup"); + public static final String BACKUP_NAMESPACE_NAME_STR = Bytes.toString(BACKUP_NAMESPACE_NAME); public static final NamespaceDescriptor DEFAULT_NAMESPACE = NamespaceDescriptor.create(DEFAULT_NAMESPACE_NAME_STR).build(); diff --git a/hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java b/hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java index 83303a1c476c..b6d854c13784 100644 --- a/hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java +++ b/hbase-common/src/main/java/org/apache/hadoop/hbase/TableName.java @@ -106,6 +106,7 @@ public static boolean isMetaTableName(final TableName tn) { private final byte[] qualifier; private final String qualifierAsString; private final boolean systemTable; + private final boolean backupsTable; private final int hashCode; /** @@ -269,6 +270,10 @@ public boolean isSystemTable() { return systemTable; } + public boolean isBackupsTable() { + return backupsTable; + } + @Override public String toString() { return nameAsString; @@ -292,6 +297,7 @@ private TableName(ByteBuffer namespace, ByteBuffer qualifier) throws IllegalArgu this.namespace = NamespaceDescriptor.DEFAULT_NAMESPACE_NAME; this.namespaceAsString = NamespaceDescriptor.DEFAULT_NAMESPACE_NAME_STR; this.systemTable = false; + this.backupsTable = false; // The name does not include the namespace when it's the default one. this.nameAsString = qualifierAsString; @@ -301,11 +307,18 @@ private TableName(ByteBuffer namespace, ByteBuffer qualifier) throws IllegalArgu this.namespace = NamespaceDescriptor.SYSTEM_NAMESPACE_NAME; this.namespaceAsString = NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR; this.systemTable = true; + this.backupsTable = false; + } else if (Bytes.equals(NamespaceDescriptor.BACKUP_NAMESPACE_NAME, namespace)) { + this.namespace = NamespaceDescriptor.BACKUP_NAMESPACE_NAME; + this.namespaceAsString = NamespaceDescriptor.BACKUP_NAMESPACE_NAME_STR; + this.systemTable = true; + this.backupsTable = true; } else { this.namespace = new byte[namespace.remaining()]; namespace.duplicate().get(this.namespace); this.namespaceAsString = Bytes.toString(this.namespace); this.systemTable = false; + this.backupsTable = false; } this.nameAsString = namespaceAsString + NAMESPACE_DELIM + qualifierAsString; this.name = Bytes.toBytes(nameAsString); @@ -325,6 +338,7 @@ private TableName(String qualifier) { this.namespace = NamespaceDescriptor.SYSTEM_NAMESPACE_NAME; this.namespaceAsString = NamespaceDescriptor.SYSTEM_NAMESPACE_NAME_STR; this.systemTable = true; + this.backupsTable = false; // WARNING: nameAsString is different than name for old meta & root! // This is by design.