From e6da835a5df4fc9a26fbbe3a59b51e6aaa0393f3 Mon Sep 17 00:00:00 2001 From: shardul-cr7 Date: Sun, 1 Sep 2019 20:15:02 +0530 Subject: [PATCH 1/3] HBASE-22012 --- .../hbase/quotas/MasterQuotaManager.java | 43 ++++++++++++++++++- .../hbase/quotas/TestMasterQuotaManager.java | 8 ++++ .../TestSpaceQuotaBasicFunctioning.java | 30 +++++++++++++ 3 files changed, 79 insertions(+), 2 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java index 65a47d1b1dbd..abbcc1bdd7c2 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java @@ -25,6 +25,7 @@ import java.util.Iterator; import java.util.Map; import java.util.Map.Entry; +import java.util.Optional; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -702,8 +703,12 @@ int pruneEntriesOlderThan(long timeToPruneBefore) { Iterator> iterator = regionSizes.entrySet().iterator(); while (iterator.hasNext()) { - long currentEntryTime = iterator.next().getValue().getTime(); - if (currentEntryTime < timeToPruneBefore) { + RegionInfo regionInfo = iterator.next().getKey(); + long currentEntryTime = regionSizes.get(regionInfo).getTime(); + boolean isInViolationAndPolicyDisable = isInViolationAndPolicyDisable(regionInfo.getTable()); + // do not prune the entries if table is in violation and + // violation policy is disable.prune entries older than time. + if (currentEntryTime < timeToPruneBefore && !isInViolationAndPolicyDisable) { iterator.remove(); numEntriesRemoved++; } @@ -711,6 +716,40 @@ int pruneEntriesOlderThan(long timeToPruneBefore) { return numEntriesRemoved; } + /** + * Method to check if a table is in violation and policy set on table is DISABLE. + * + * @param tableName tableName to check. + * @return returns true if table is in violation and policy is disable else false. + */ + private boolean isInViolationAndPolicyDisable(TableName tableName) { + boolean isInViolationAtTable = false; + boolean isInViolationAndPolicyDisable = false; + SpaceViolationPolicy policy = null; + try { + if (QuotaUtil.isQuotaEnabled(masterServices.getConfiguration())) { + // Get Current Snapshot for the given table + SpaceQuotaSnapshot spaceQuotaSnapshot = + QuotaUtil.getCurrentSnapshotFromQuotaTable(masterServices.getConnection(), tableName); + if (spaceQuotaSnapshot != null) { + // check if table in violation + isInViolationAtTable = spaceQuotaSnapshot.getQuotaStatus().isInViolation(); + Optional policyAtNamespace = + spaceQuotaSnapshot.getQuotaStatus().getPolicy(); + if (policyAtNamespace.isPresent()) { + policy = policyAtNamespace.get(); + } + } + } + isInViolationAndPolicyDisable = + (policy == SpaceViolationPolicy.DISABLE) && isInViolationAtTable; + + } catch (IOException e) { + LOG.info("Problem in getting connection to quota table: ", e); + } + return isInViolationAndPolicyDisable; + } + public void processFileArchivals(FileArchiveNotificationRequest request, Connection conn, Configuration conf, FileSystem fs) throws IOException { final HashMultimap> archivedFilesByTable = HashMultimap.create(); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestMasterQuotaManager.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestMasterQuotaManager.java index 5c41c41b41d3..345b2f920ea1 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestMasterQuotaManager.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestMasterQuotaManager.java @@ -17,12 +17,16 @@ */ package org.apache.hadoop.hbase.quotas; +import static org.apache.hadoop.hbase.quotas.QuotaUtil.QUOTA_CONF_KEY; import static org.apache.hadoop.hbase.util.Bytes.toBytes; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseClassTestRule; +import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.master.MasterServices; @@ -51,6 +55,10 @@ public void testOldEntriesRemoved() { MasterServices masterServices = mock(MasterServices.class); MasterQuotaManager manager = new MasterQuotaManager(masterServices); manager.initializeRegionSizes(); + HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); + Configuration conf = TEST_UTIL.getConfiguration(); + conf.set(QUOTA_CONF_KEY, "false"); + when(masterServices.getConfiguration()).thenReturn(conf); // Mock out some regions TableName tableName = TableName.valueOf("foo"); HRegionInfo region1 = new HRegionInfo(tableName, null, toBytes("a")); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java index 754c96e1d837..eee150d1d141 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java @@ -19,6 +19,7 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.util.Map; import java.util.concurrent.atomic.AtomicLong; import org.apache.hadoop.conf.Configuration; @@ -31,12 +32,15 @@ import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Increment; import org.apache.hadoop.hbase.client.Put; +import org.apache.hadoop.hbase.client.RegionInfo; import org.apache.hadoop.hbase.client.Table; +import org.apache.hadoop.hbase.master.HMaster; import org.apache.hadoop.hbase.security.AccessDeniedException; import org.apache.hadoop.hbase.testclassification.LargeTests; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.util.StringUtils; import org.junit.AfterClass; +import org.junit.Assert; import org.junit.Before; import org.junit.BeforeClass; import org.junit.ClassRule; @@ -221,4 +225,30 @@ public void testTableQuotaOverridesNamespaceQuota() throws Exception { Bytes.toBytes("reject")); helper.verifyViolation(policy, tn, p); } + + @Test + public void testDisablePolicyQuotaAndViolate() throws Exception { + TableName tableName = helper.createTable(); + helper.setQuotaLimit(tableName, SpaceViolationPolicy.DISABLE, 2L); + helper.writeData(tableName, SpaceQuotaHelperForTests.ONE_MEGABYTE * 3L); + + HMaster master = TEST_UTIL.getMiniHBaseCluster().getMaster(); + MasterQuotaManager quotaManager = master.getMasterQuotaManager(); + + // Sufficient time for all the chores to run. + Thread.sleep(5000); + + long timeToPrune = System.currentTimeMillis() + 11 * 60 * 1000; + quotaManager.pruneEntriesOlderThan(timeToPrune); + + // Check if disabled table region report present in the map after retention period expired. + // It should be present after retention period expired. + for (Map.Entry entry : quotaManager.snapshotRegionSizes().entrySet()) { + if (entry.getKey().getTable().equals(tableName)) { + assertTrue(true); + return; + } + } + Assert.fail("Testcase failed, disable entry removed"); + } } From 24e2c2f489bf95d44de03d572ddd4b9b74c8c3a5 Mon Sep 17 00:00:00 2001 From: shardul-cr7 Date: Sat, 21 Sep 2019 17:47:44 +0530 Subject: [PATCH 2/3] review comments handled --- .../hbase/quotas/MasterQuotaManager.java | 64 ++++++++++--------- .../hbase/quotas/QuotaObserverChore.java | 2 +- .../hbase/quotas/TestMasterQuotaManager.java | 17 ++--- .../TestSpaceQuotaBasicFunctioning.java | 33 ++++++---- 4 files changed, 59 insertions(+), 57 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java index abbcc1bdd7c2..5e822cebb593 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java @@ -695,20 +695,22 @@ public Map snapshotRegionSizes() { return copy; } - int pruneEntriesOlderThan(long timeToPruneBefore) { + int pruneEntriesOlderThan(long timeToPruneBefore, QuotaObserverChore quotaObserverChore) { if (regionSizes == null) { return 0; } int numEntriesRemoved = 0; - Iterator> iterator = + Iterator> iterator = regionSizes.entrySet().iterator(); while (iterator.hasNext()) { RegionInfo regionInfo = iterator.next().getKey(); long currentEntryTime = regionSizes.get(regionInfo).getTime(); - boolean isInViolationAndPolicyDisable = isInViolationAndPolicyDisable(regionInfo.getTable()); // do not prune the entries if table is in violation and - // violation policy is disable.prune entries older than time. - if (currentEntryTime < timeToPruneBefore && !isInViolationAndPolicyDisable) { + // violation policy is disable to avoid cycle of enable/disable. + // Please refer HBASE-22012 for more details. + // prune entries older than time. + if (currentEntryTime < timeToPruneBefore && !isInViolationAndPolicyDisable( + regionInfo.getTable(), quotaObserverChore)) { iterator.remove(); numEntriesRemoved++; } @@ -719,35 +721,37 @@ int pruneEntriesOlderThan(long timeToPruneBefore) { /** * Method to check if a table is in violation and policy set on table is DISABLE. * - * @param tableName tableName to check. + * @param tableName tableName to check. + * @param quotaObserverChore QuotaObserverChore instance * @return returns true if table is in violation and policy is disable else false. */ - private boolean isInViolationAndPolicyDisable(TableName tableName) { + private boolean isInViolationAndPolicyDisable(TableName tableName, + QuotaObserverChore quotaObserverChore) { boolean isInViolationAtTable = false; - boolean isInViolationAndPolicyDisable = false; + boolean isInViolationAtNamespace = false; SpaceViolationPolicy policy = null; - try { - if (QuotaUtil.isQuotaEnabled(masterServices.getConfiguration())) { - // Get Current Snapshot for the given table - SpaceQuotaSnapshot spaceQuotaSnapshot = - QuotaUtil.getCurrentSnapshotFromQuotaTable(masterServices.getConnection(), tableName); - if (spaceQuotaSnapshot != null) { - // check if table in violation - isInViolationAtTable = spaceQuotaSnapshot.getQuotaStatus().isInViolation(); - Optional policyAtNamespace = - spaceQuotaSnapshot.getQuotaStatus().getPolicy(); - if (policyAtNamespace.isPresent()) { - policy = policyAtNamespace.get(); - } - } - } - isInViolationAndPolicyDisable = - (policy == SpaceViolationPolicy.DISABLE) && isInViolationAtTable; - - } catch (IOException e) { - LOG.info("Problem in getting connection to quota table: ", e); - } - return isInViolationAndPolicyDisable; + // Get Current Snapshot for the given table + SpaceQuotaSnapshot tableQuotaSnapshot = quotaObserverChore.getTableQuotaSnapshot(tableName); + SpaceQuotaSnapshot namespaceQuotaSnapshot = + quotaObserverChore.getNamespaceQuotaSnapshot(tableName.getNamespaceAsString()); + if (tableQuotaSnapshot != null) { + // check if table in violation + isInViolationAtTable = tableQuotaSnapshot.getQuotaStatus().isInViolation(); + Optional tablePolicy = tableQuotaSnapshot.getQuotaStatus().getPolicy(); + if (tablePolicy.isPresent()) { + policy = tablePolicy.get(); + } + } else if (namespaceQuotaSnapshot != null) { + // check namespace in violation + isInViolationAtNamespace = namespaceQuotaSnapshot.getQuotaStatus().isInViolation(); + Optional namespacePolicy = + tableQuotaSnapshot.getQuotaStatus().getPolicy(); + if (namespacePolicy.isPresent()) { + policy = namespacePolicy.get(); + } + } + return (policy == SpaceViolationPolicy.DISABLE) && (isInViolationAtTable + || isInViolationAtNamespace); } public void processFileArchivals(FileArchiveNotificationRequest request, Connection conn, diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/QuotaObserverChore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/QuotaObserverChore.java index 92a149c070ea..7ecd850d71a8 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/QuotaObserverChore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/QuotaObserverChore.java @@ -471,7 +471,7 @@ void updateNamespaceQuota( void pruneOldRegionReports() { final long now = EnvironmentEdgeManager.currentTime(); final long pruneTime = now - regionReportLifetimeMillis; - final int numRemoved = quotaManager.pruneEntriesOlderThan(pruneTime); + final int numRemoved = quotaManager.pruneEntriesOlderThan(pruneTime,this); if (LOG.isTraceEnabled()) { LOG.trace("Removed " + numRemoved + " old region size reports that were older than " + pruneTime + "."); diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestMasterQuotaManager.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestMasterQuotaManager.java index 345b2f920ea1..a9305a394e5b 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestMasterQuotaManager.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestMasterQuotaManager.java @@ -17,16 +17,12 @@ */ package org.apache.hadoop.hbase.quotas; -import static org.apache.hadoop.hbase.quotas.QuotaUtil.QUOTA_CONF_KEY; import static org.apache.hadoop.hbase.util.Bytes.toBytes; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.when; -import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseClassTestRule; -import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HRegionInfo; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.master.MasterServices; @@ -55,10 +51,6 @@ public void testOldEntriesRemoved() { MasterServices masterServices = mock(MasterServices.class); MasterQuotaManager manager = new MasterQuotaManager(masterServices); manager.initializeRegionSizes(); - HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility(); - Configuration conf = TEST_UTIL.getConfiguration(); - conf.set(QUOTA_CONF_KEY, "false"); - when(masterServices.getConfiguration()).thenReturn(conf); // Mock out some regions TableName tableName = TableName.valueOf("foo"); HRegionInfo region1 = new HRegionInfo(tableName, null, toBytes("a")); @@ -81,18 +73,19 @@ public void testOldEntriesRemoved() { assertEquals(5, manager.snapshotRegionSizes().size()); + QuotaObserverChore chore = mock(QuotaObserverChore.class); // Prune nothing - assertEquals(0, manager.pruneEntriesOlderThan(0)); + assertEquals(0, manager.pruneEntriesOlderThan(0, chore)); assertEquals(5, manager.snapshotRegionSizes().size()); - assertEquals(0, manager.pruneEntriesOlderThan(10)); + assertEquals(0, manager.pruneEntriesOlderThan(10, chore)); assertEquals(5, manager.snapshotRegionSizes().size()); // Prune the elements at time1 - assertEquals(2, manager.pruneEntriesOlderThan(15)); + assertEquals(2, manager.pruneEntriesOlderThan(15, chore)); assertEquals(3, manager.snapshotRegionSizes().size()); // Prune the elements at time2 - assertEquals(2, manager.pruneEntriesOlderThan(30)); + assertEquals(2, manager.pruneEntriesOlderThan(30, chore)); assertEquals(1, manager.snapshotRegionSizes().size()); } } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java index eee150d1d141..cdab55c25cd3 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java @@ -19,6 +19,7 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; +import java.util.List; import java.util.Map; import java.util.concurrent.atomic.AtomicLong; @@ -26,7 +27,9 @@ import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HBaseTestingUtility; +import org.apache.hadoop.hbase.MetaTableAccessor; import org.apache.hadoop.hbase.TableName; +import org.apache.hadoop.hbase.Waiter; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Append; import org.apache.hadoop.hbase.client.Delete; @@ -229,26 +232,28 @@ public void testTableQuotaOverridesNamespaceQuota() throws Exception { @Test public void testDisablePolicyQuotaAndViolate() throws Exception { TableName tableName = helper.createTable(); - helper.setQuotaLimit(tableName, SpaceViolationPolicy.DISABLE, 2L); - helper.writeData(tableName, SpaceQuotaHelperForTests.ONE_MEGABYTE * 3L); + helper.setQuotaLimit(tableName, SpaceViolationPolicy.DISABLE, 1L); + helper.writeData(tableName, SpaceQuotaHelperForTests.ONE_MEGABYTE * 2L); + TEST_UTIL.getConfiguration() + .setLong("hbase.master.quotas.region.report.retention.millis", 100); HMaster master = TEST_UTIL.getMiniHBaseCluster().getMaster(); MasterQuotaManager quotaManager = master.getMasterQuotaManager(); - // Sufficient time for all the chores to run. - Thread.sleep(5000); - - long timeToPrune = System.currentTimeMillis() + 11 * 60 * 1000; - quotaManager.pruneEntriesOlderThan(timeToPrune); + // Make sure the master has report for the table. + Waiter.waitFor(TEST_UTIL.getConfiguration(), 30 * 1000, new Waiter.Predicate() { + @Override + public boolean evaluate() throws Exception { + Map regionSizes = quotaManager.snapshotRegionSizes(); + List tableRegions = + MetaTableAccessor.getTableRegions(TEST_UTIL.getConnection(), tableName); + return regionSizes.containsKey(tableRegions.get(0)); + } + }); // Check if disabled table region report present in the map after retention period expired. // It should be present after retention period expired. - for (Map.Entry entry : quotaManager.snapshotRegionSizes().entrySet()) { - if (entry.getKey().getTable().equals(tableName)) { - assertTrue(true); - return; - } - } - Assert.fail("Testcase failed, disable entry removed"); + Assert.assertTrue(quotaManager.snapshotRegionSizes().keySet().stream() + .filter(k -> k.getTable().equals(tableName)).count() > 0); } } From a635d63972e603b7aa23d3f297969e1cc57a7193 Mon Sep 17 00:00:00 2001 From: shardul-cr7 Date: Mon, 23 Sep 2019 01:59:10 +0530 Subject: [PATCH 3/3] findbugs --- .../hbase/quotas/MasterQuotaManager.java | 23 ++++++++++--------- .../TestSpaceQuotaBasicFunctioning.java | 5 ++-- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java index 5e822cebb593..7fd5358f5a88 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotaManager.java @@ -729,7 +729,8 @@ private boolean isInViolationAndPolicyDisable(TableName tableName, QuotaObserverChore quotaObserverChore) { boolean isInViolationAtTable = false; boolean isInViolationAtNamespace = false; - SpaceViolationPolicy policy = null; + SpaceViolationPolicy tablePolicy = null; + SpaceViolationPolicy namespacePolicy = null; // Get Current Snapshot for the given table SpaceQuotaSnapshot tableQuotaSnapshot = quotaObserverChore.getTableQuotaSnapshot(tableName); SpaceQuotaSnapshot namespaceQuotaSnapshot = @@ -737,21 +738,21 @@ private boolean isInViolationAndPolicyDisable(TableName tableName, if (tableQuotaSnapshot != null) { // check if table in violation isInViolationAtTable = tableQuotaSnapshot.getQuotaStatus().isInViolation(); - Optional tablePolicy = tableQuotaSnapshot.getQuotaStatus().getPolicy(); - if (tablePolicy.isPresent()) { - policy = tablePolicy.get(); + Optional policy = tableQuotaSnapshot.getQuotaStatus().getPolicy(); + if (policy.isPresent()) { + tablePolicy = policy.get(); } - } else if (namespaceQuotaSnapshot != null) { + } + if (namespaceQuotaSnapshot != null) { // check namespace in violation isInViolationAtNamespace = namespaceQuotaSnapshot.getQuotaStatus().isInViolation(); - Optional namespacePolicy = - tableQuotaSnapshot.getQuotaStatus().getPolicy(); - if (namespacePolicy.isPresent()) { - policy = namespacePolicy.get(); + Optional policy = namespaceQuotaSnapshot.getQuotaStatus().getPolicy(); + if (policy.isPresent()) { + namespacePolicy = policy.get(); } } - return (policy == SpaceViolationPolicy.DISABLE) && (isInViolationAtTable - || isInViolationAtNamespace); + return (tablePolicy == SpaceViolationPolicy.DISABLE && isInViolationAtTable) || ( + namespacePolicy == SpaceViolationPolicy.DISABLE && isInViolationAtNamespace); } public void processFileArchivals(FileArchiveNotificationRequest request, Connection conn, diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java index cdab55c25cd3..d5d4159159cb 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/quotas/TestSpaceQuotaBasicFunctioning.java @@ -253,7 +253,8 @@ public boolean evaluate() throws Exception { // Check if disabled table region report present in the map after retention period expired. // It should be present after retention period expired. - Assert.assertTrue(quotaManager.snapshotRegionSizes().keySet().stream() - .filter(k -> k.getTable().equals(tableName)).count() > 0); + final long regionSizes = quotaManager.snapshotRegionSizes().keySet().stream() + .filter(k -> k.getTable().equals(tableName)).count(); + Assert.assertTrue(regionSizes > 0); } }