From ff9cd68900bc9a139049e1719a771232bd8e5048 Mon Sep 17 00:00:00 2001 From: Toshihiro Suzuki Date: Tue, 24 Dec 2019 20:16:31 +0900 Subject: [PATCH] HBASE-23581 Creating table gets stuck when specifying an invalid split policy as METADATA (#942) Signed-off-by: Lijin Bin Signed-off-by: Anoop Sam John Signed-off-by: Xu Cang (cherry picked from commit e18c99f9271d06a9f962e12ee21790d5897f1f1a) Change-Id: Iee5c19809916e646bf4ff5697f2496ba741e5abe --- .../hadoop/hbase/regionserver/HRegion.java | 26 +++---------------- .../hbase/util/TableDescriptorChecker.java | 12 ++++++--- .../client/TestIllegalTableDescriptor.java | 6 +++++ 3 files changed, 18 insertions(+), 26 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 7efdb887a476..5c280cd89c99 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -168,6 +168,7 @@ import org.apache.hadoop.hbase.util.NonceKey; import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.util.ServerRegionReplicaUtil; +import org.apache.hadoop.hbase.util.TableDescriptorChecker; import org.apache.hadoop.hbase.util.Threads; import org.apache.hadoop.hbase.wal.WAL; import org.apache.hadoop.hbase.wal.WALEdit; @@ -7329,12 +7330,12 @@ protected HRegion openHRegion(final CancelableProgressable reporter) throws IOException { try { // Refuse to open the region if we are missing local compression support - checkCompressionCodecs(); + TableDescriptorChecker.checkCompression(htableDescriptor); // Refuse to open the region if encryption configuration is incorrect or // codec support is missing - checkEncryption(); + TableDescriptorChecker.checkEncryption(conf, htableDescriptor); // Refuse to open the region if a required class cannot be loaded - checkClassLoading(); + TableDescriptorChecker.checkClassLoading(conf, htableDescriptor); this.openSeqNum = initialize(reporter); this.mvcc.advanceTo(openSeqNum); // The openSeqNum must be increased every time when a region is assigned, as we rely on it to @@ -7405,25 +7406,6 @@ public static void warmupHRegion(final RegionInfo info, r.initializeWarmup(reporter); } - - private void checkCompressionCodecs() throws IOException { - for (ColumnFamilyDescriptor fam: this.htableDescriptor.getColumnFamilies()) { - CompressionTest.testCompression(fam.getCompressionType()); - CompressionTest.testCompression(fam.getCompactionCompressionType()); - } - } - - private void checkEncryption() throws IOException { - for (ColumnFamilyDescriptor fam: this.htableDescriptor.getColumnFamilies()) { - EncryptionTest.testEncryption(conf, fam.getEncryptionType(), fam.getEncryptionKey()); - } - } - - private void checkClassLoading() throws IOException { - RegionSplitPolicy.getSplitPolicyClass(this.htableDescriptor, conf); - RegionCoprocessorHost.testTableCoprocessorAttrs(conf, this.htableDescriptor); - } - /** * Computes the Path of the HRegion * diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java index 3852a4177516..906ae454d6a8 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java @@ -63,8 +63,12 @@ private TableDescriptorChecker() { * Checks whether the table conforms to some sane limits, and configured * values (compression, etc) work. Throws an exception if something is wrong. */ - public static void sanityCheck(final Configuration conf, final TableDescriptor td) + public static void sanityCheck(final Configuration c, final TableDescriptor td) throws IOException { + CompoundConfiguration conf = new CompoundConfiguration() + .add(c) + .addBytesMap(td.getValues()); + // Setting this to true logs the warning instead of throwing exception boolean logWarn = false; if (!conf.getBoolean(TABLE_SANITY_CHECKS, DEFAULT_TABLE_SANITY_CHECKS)) { @@ -276,21 +280,21 @@ private static void checkBloomFilterType(ColumnFamilyDescriptor cfd) throws IOEx } } - private static void checkCompression(final TableDescriptor td) throws IOException { + public static void checkCompression(final TableDescriptor td) throws IOException { for (ColumnFamilyDescriptor cfd : td.getColumnFamilies()) { CompressionTest.testCompression(cfd.getCompressionType()); CompressionTest.testCompression(cfd.getCompactionCompressionType()); } } - private static void checkEncryption(final Configuration conf, final TableDescriptor td) + public static void checkEncryption(final Configuration conf, final TableDescriptor td) throws IOException { for (ColumnFamilyDescriptor cfd : td.getColumnFamilies()) { EncryptionTest.testEncryption(conf, cfd.getEncryptionType(), cfd.getEncryptionKey()); } } - private static void checkClassLoading(final Configuration conf, final TableDescriptor td) + public static void checkClassLoading(final Configuration conf, final TableDescriptor td) throws IOException { RegionSplitPolicy.getSplitPolicyClass(td, conf); RegionCoprocessorHost.testTableCoprocessorAttrs(conf, td); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestIllegalTableDescriptor.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestIllegalTableDescriptor.java index e55f3ff6bccc..dc56cf79645a 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestIllegalTableDescriptor.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestIllegalTableDescriptor.java @@ -31,6 +31,7 @@ import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HColumnDescriptor; +import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.HTableDescriptor; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.testclassification.ClientTests; @@ -112,6 +113,11 @@ public void testIllegalTableDescriptor() throws Exception { htd.setRegionSplitPolicyClassName(null); checkTableIsLegal(htd); + htd.setValue(HConstants.HBASE_REGION_SPLIT_POLICY_KEY, "nonexisting.foo.class"); + checkTableIsIllegal(htd); + htd.remove(HConstants.HBASE_REGION_SPLIT_POLICY_KEY); + checkTableIsLegal(htd); + hcd.setBlocksize(0); checkTableIsIllegal(htd); hcd.setBlocksize(1024 * 1024 * 128); // 128M