HBASE-28183 It's impossible to re-enable the quota table if it gets disabled (#5691)
Signed-off-by: Bryan Beaudreault <bbeaudreault@apache.org>
Signed-off-by: Pankaj Kumar <pankajkumar@apache.org>
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
index ddef3e2..0dc5b61 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/HMaster.java
@@ -2728,16 +2728,20 @@
MasterQuotaManager quotaManager = getMasterQuotaManager();
if (quotaManager != null) {
if (quotaManager.isQuotaInitialized()) {
- SpaceQuotaSnapshot currSnapshotOfTable =
- QuotaTableUtil.getCurrentSnapshotFromQuotaTable(getConnection(), tableName);
- if (currSnapshotOfTable != null) {
- SpaceQuotaStatus quotaStatus = currSnapshotOfTable.getQuotaStatus();
- if (
- quotaStatus.isInViolation()
- && SpaceViolationPolicy.DISABLE == quotaStatus.getPolicy().orElse(null)
- ) {
- throw new AccessDeniedException("Enabling the table '" + tableName
- + "' is disallowed due to a violated space quota.");
+ // skip checking quotas for system tables, see:
+ // https://issues.apache.org/jira/browse/HBASE-28183
+ if (!tableName.isSystemTable()) {
+ SpaceQuotaSnapshot currSnapshotOfTable =
+ QuotaTableUtil.getCurrentSnapshotFromQuotaTable(getConnection(), tableName);
+ if (currSnapshotOfTable != null) {
+ SpaceQuotaStatus quotaStatus = currSnapshotOfTable.getQuotaStatus();
+ if (
+ quotaStatus.isInViolation()
+ && SpaceViolationPolicy.DISABLE == quotaStatus.getPolicy().orElse(null)
+ ) {
+ throw new AccessDeniedException("Enabling the table '" + tableName
+ + "' is disallowed due to a violated space quota.");
+ }
}
}
} else if (LOG.isTraceEnabled()) {
diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java
index c577e9a..817f135 100644
--- a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java
+++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestQuotaAdmin.java
@@ -994,4 +994,15 @@
}
return quotaSettingCount;
}
+
+ @Test
+ public void testQuotaTableDisableAndEnable() throws Exception {
+ final Admin admin = TEST_UTIL.getAdmin();
+ admin.disableTable(QuotaUtil.QUOTA_TABLE_NAME);
+ try {
+ admin.enableTable(QuotaUtil.QUOTA_TABLE_NAME);
+ } catch (Exception ex) {
+ fail("Got an exception while enabling table: " + QuotaUtil.QUOTA_TABLE_NAME);
+ }
+ }
}