From e5463e8f4eccb6012601b4b186bba17b2b8a300a Mon Sep 17 00:00:00 2001 From: Xin Sun Date: Tue, 15 Nov 2022 11:10:37 +0800 Subject: [PATCH] HBASE-27469 IllegalArgumentException is thrown by SnapshotScannerHDFSAclController when dropping a table (#4865) Signed-off-by: Duo Zhang --- .../SnapshotScannerHDFSAclController.java | 4 ++-- .../TestSnapshotScannerHDFSAclController.java | 22 ++++++++++++++++++- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclController.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclController.java index 4eb40019b6d..f4e4a4a9ffb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclController.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/security/access/SnapshotScannerHDFSAclController.java @@ -555,7 +555,7 @@ public class SnapshotScannerHDFSAclController implements MasterCoprocessor, Mast if (aclTableInitialized) { return true; } else { - LOG.warn("Skip set HDFS acls because acl table is not initialized when " + operation); + LOG.warn("Skip set HDFS acls because acl table is not initialized when {}", operation); } } return false; @@ -610,7 +610,7 @@ public class SnapshotScannerHDFSAclController implements MasterCoprocessor, Mast PermissionStorage.isGlobalEntry(entry) || (PermissionStorage.isNamespaceEntry(entry) && Bytes.equals(PermissionStorage.fromNamespaceEntry(entry), namespace)) - || (!Bytes.equals(tableName.getName(), entry) + || (PermissionStorage.isTableEntry(entry) && !Bytes.equals(tableName.getName(), entry) && Bytes.equals(TableName.valueOf(entry).getNamespace(), namespace)) ) { remove = false; diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestSnapshotScannerHDFSAclController.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestSnapshotScannerHDFSAclController.java index e8b4fe01e7c..d79e3f30810 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestSnapshotScannerHDFSAclController.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/security/access/TestSnapshotScannerHDFSAclController.java @@ -654,7 +654,7 @@ public class TestSnapshotScannerHDFSAclController { // delete table admin.disableTable(table); admin.deleteTable(table); - // grantUser2 and grantUser3 should have data/ns acl + // grantUser2 should have data/ns acl TestHDFSAclHelper.canUserScanSnapshot(TEST_UTIL, grantUser1, snapshot1, -1); TestHDFSAclHelper.canUserScanSnapshot(TEST_UTIL, grantUser2, snapshot1, 6); assertTrue(hasUserNamespaceHdfsAcl(aclTable, grantUserName2, namespace)); @@ -673,6 +673,26 @@ public class TestSnapshotScannerHDFSAclController { deleteTable(table); } + @Test + public void testDeleteTable2() throws Exception { + String namespace1 = name.getMethodName() + "1"; + String namespace2 = name.getMethodName() + "2"; + String grantUser = name.getMethodName(); + TableName table = TableName.valueOf(namespace1, name.getMethodName()); + + TestHDFSAclHelper.createTableAndPut(TEST_UTIL, table); + // grant user table permission + TestHDFSAclHelper.grantOnTable(TEST_UTIL, grantUser, table, READ); + // grant user other namespace permission + SecureTestUtil.grantOnNamespace(TEST_UTIL, grantUser, namespace2, READ); + // delete table + admin.disableTable(table); + admin.deleteTable(table); + // grantUser should have namespace2's acl + assertFalse(hasUserTableHdfsAcl(aclTable, grantUser, table)); + assertTrue(hasUserNamespaceHdfsAcl(aclTable, grantUser, namespace2)); + } + @Test public void testDeleteNamespace() throws Exception { String grantUserName = name.getMethodName();