[hbase] 02/02: HBASE-22142 Drop table RegionSizes with namespace quota
This is an automated email from the ASF dual-hosted git repository. elserj pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/hbase.git commit 96a94ac3d04f08c8aad1024463b9ef67286d5f95 Author: shardul-cr7 AuthorDate: Fri Sep 20 10:57:15 2019 -0400 HBASE-22142 Drop table RegionSizes with namespace quota There was a bug in which we would not drop the RegionSizes for a table in a namespace, where the namespace had a quota on it. This allowed a scenario in which recreation of a table inside of a namespace would unintentionally move into violation despite the table being empty. Need to make sure the RegionSizes are dropped on table deletion if there is _any_ quota applying to that table. Closes #598 Signed-off-by: Josh Elser --- .../hadoop/hbase/quotas/MasterQuotaManager.java| 9 .../hadoop/hbase/quotas/MasterQuotasObserver.java | 47 +-- .../hbase/quotas/TestSpaceQuotaDropTable.java | 52 ++ 3 files changed, 95 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 01fe427..f13a415 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 @@ -740,5 +740,14 @@ public class MasterQuotaManager implements RegionStateListener { notifier.addArchivedFiles(filesWithSize); } } + + /** + * Removes each region size entry where the RegionInfo references the provided TableName. + * + * @param tableName tableName. + */ + public void removeRegionSizesForTable(TableName tableName) { +regionSizes.keySet().removeIf(regionInfo -> regionInfo.getTable().equals(tableName)); + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java index cad3129..1ddc9e3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java @@ -24,10 +24,14 @@ import org.apache.hadoop.hbase.CoprocessorEnvironment; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; +import org.apache.hadoop.hbase.coprocessor.CoprocessorException; +import org.apache.hadoop.hbase.coprocessor.CoreCoprocessor; +import org.apache.hadoop.hbase.coprocessor.HasMasterServices; import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor; import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment; import org.apache.hadoop.hbase.coprocessor.MasterObserver; import org.apache.hadoop.hbase.coprocessor.ObserverContext; +import org.apache.hadoop.hbase.master.MasterServices; import org.apache.yetus.audience.InterfaceAudience; import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas; @@ -35,6 +39,7 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas; * An observer to automatically delete quotas when a table/namespace * is deleted. */ +@CoreCoprocessor @InterfaceAudience.Private public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { public static final String REMOVE_QUOTA_ON_TABLE_DELETE = "hbase.quota.remove.on.table.delete"; @@ -43,6 +48,7 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { private CoprocessorEnvironment cpEnv; private Configuration conf; private boolean quotasEnabled = false; + private MasterServices masterServices; @Override public Optional getMasterObserver() { @@ -51,9 +57,19 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { @Override public void start(CoprocessorEnvironment ctx) throws IOException { -this.cpEnv = ctx; -this.conf = cpEnv.getConfiguration(); +this.conf = ctx.getConfiguration(); this.quotasEnabled = QuotaUtil.isQuotaEnabled(conf); + +if (!(ctx instanceof MasterCoprocessorEnvironment)) { + throw new CoprocessorException("Must be loaded on master."); +} +// if running on master +MasterCoprocessorEnvironment mEnv = (MasterCoprocessorEnvironment) ctx; +if (mEnv instanceof HasMasterServices) { + this.masterServices = ((HasMasterServices) mEnv).getMasterServices(); +} else { + throw new CoprocessorException("Must be loaded on a master having master services."); +} } @Override @@ -64,18 +80,23 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { return; } final Connection conn = ctx.getEnvironment().getConnection(); -Quotas quotas =
[hbase] 02/02: HBASE-22142 Drop table RegionSizes with namespace quota
This is an automated email from the ASF dual-hosted git repository. elserj pushed a commit to branch branch-2 in repository https://gitbox.apache.org/repos/asf/hbase.git commit f1d3b5442292a02faacf955feec00936d6731fc8 Author: shardul-cr7 AuthorDate: Fri Sep 20 10:57:15 2019 -0400 HBASE-22142 Drop table RegionSizes with namespace quota There was a bug in which we would not drop the RegionSizes for a table in a namespace, where the namespace had a quota on it. This allowed a scenario in which recreation of a table inside of a namespace would unintentionally move into violation despite the table being empty. Need to make sure the RegionSizes are dropped on table deletion if there is _any_ quota applying to that table. Signed-off-by: Josh Elser --- .../hadoop/hbase/quotas/MasterQuotaManager.java| 9 .../hadoop/hbase/quotas/MasterQuotasObserver.java | 47 +-- .../hbase/quotas/TestSpaceQuotaDropTable.java | 52 ++ 3 files changed, 95 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 d17f1d5..c103c68 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 @@ -709,5 +709,14 @@ public class MasterQuotaManager implements RegionStateListener { } return numEntriesRemoved; } + + /** + * Removes each region size entry where the RegionInfo references the provided TableName. + * + * @param tableName tableName. + */ + public void removeRegionSizesForTable(TableName tableName) { +regionSizes.keySet().removeIf(regionInfo -> regionInfo.getTable().equals(tableName)); + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java index cad3129..1ddc9e3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java @@ -24,10 +24,14 @@ import org.apache.hadoop.hbase.CoprocessorEnvironment; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; +import org.apache.hadoop.hbase.coprocessor.CoprocessorException; +import org.apache.hadoop.hbase.coprocessor.CoreCoprocessor; +import org.apache.hadoop.hbase.coprocessor.HasMasterServices; import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor; import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment; import org.apache.hadoop.hbase.coprocessor.MasterObserver; import org.apache.hadoop.hbase.coprocessor.ObserverContext; +import org.apache.hadoop.hbase.master.MasterServices; import org.apache.yetus.audience.InterfaceAudience; import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas; @@ -35,6 +39,7 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas; * An observer to automatically delete quotas when a table/namespace * is deleted. */ +@CoreCoprocessor @InterfaceAudience.Private public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { public static final String REMOVE_QUOTA_ON_TABLE_DELETE = "hbase.quota.remove.on.table.delete"; @@ -43,6 +48,7 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { private CoprocessorEnvironment cpEnv; private Configuration conf; private boolean quotasEnabled = false; + private MasterServices masterServices; @Override public Optional getMasterObserver() { @@ -51,9 +57,19 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { @Override public void start(CoprocessorEnvironment ctx) throws IOException { -this.cpEnv = ctx; -this.conf = cpEnv.getConfiguration(); +this.conf = ctx.getConfiguration(); this.quotasEnabled = QuotaUtil.isQuotaEnabled(conf); + +if (!(ctx instanceof MasterCoprocessorEnvironment)) { + throw new CoprocessorException("Must be loaded on master."); +} +// if running on master +MasterCoprocessorEnvironment mEnv = (MasterCoprocessorEnvironment) ctx; +if (mEnv instanceof HasMasterServices) { + this.masterServices = ((HasMasterServices) mEnv).getMasterServices(); +} else { + throw new CoprocessorException("Must be loaded on a master having master services."); +} } @Override @@ -64,18 +80,23 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { return; } final Connection conn = ctx.getEnvironment().getConnection(); -Quotas quotas = QuotaUtil.getTableQuota(conn, tableName); -
[hbase] 02/02: HBASE-22142 Drop table RegionSizes with namespace quota
This is an automated email from the ASF dual-hosted git repository. elserj pushed a commit to branch branch-2.2 in repository https://gitbox.apache.org/repos/asf/hbase.git commit d5d1cfd9bc3262f8c6237de875e3ec927374d95a Author: shardul-cr7 AuthorDate: Fri Sep 20 10:57:15 2019 -0400 HBASE-22142 Drop table RegionSizes with namespace quota There was a bug in which we would not drop the RegionSizes for a table in a namespace, where the namespace had a quota on it. This allowed a scenario in which recreation of a table inside of a namespace would unintentionally move into violation despite the table being empty. Need to make sure the RegionSizes are dropped on table deletion if there is _any_ quota applying to that table. Signed-off-by: Josh Elser --- .../hadoop/hbase/quotas/MasterQuotaManager.java| 9 .../hadoop/hbase/quotas/MasterQuotasObserver.java | 47 +-- .../hbase/quotas/TestSpaceQuotaDropTable.java | 52 ++ 3 files changed, 95 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 d17f1d5..c103c68 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 @@ -709,5 +709,14 @@ public class MasterQuotaManager implements RegionStateListener { } return numEntriesRemoved; } + + /** + * Removes each region size entry where the RegionInfo references the provided TableName. + * + * @param tableName tableName. + */ + public void removeRegionSizesForTable(TableName tableName) { +regionSizes.keySet().removeIf(regionInfo -> regionInfo.getTable().equals(tableName)); + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java index cad3129..1ddc9e3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java @@ -24,10 +24,14 @@ import org.apache.hadoop.hbase.CoprocessorEnvironment; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; +import org.apache.hadoop.hbase.coprocessor.CoprocessorException; +import org.apache.hadoop.hbase.coprocessor.CoreCoprocessor; +import org.apache.hadoop.hbase.coprocessor.HasMasterServices; import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor; import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment; import org.apache.hadoop.hbase.coprocessor.MasterObserver; import org.apache.hadoop.hbase.coprocessor.ObserverContext; +import org.apache.hadoop.hbase.master.MasterServices; import org.apache.yetus.audience.InterfaceAudience; import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas; @@ -35,6 +39,7 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas; * An observer to automatically delete quotas when a table/namespace * is deleted. */ +@CoreCoprocessor @InterfaceAudience.Private public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { public static final String REMOVE_QUOTA_ON_TABLE_DELETE = "hbase.quota.remove.on.table.delete"; @@ -43,6 +48,7 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { private CoprocessorEnvironment cpEnv; private Configuration conf; private boolean quotasEnabled = false; + private MasterServices masterServices; @Override public Optional getMasterObserver() { @@ -51,9 +57,19 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { @Override public void start(CoprocessorEnvironment ctx) throws IOException { -this.cpEnv = ctx; -this.conf = cpEnv.getConfiguration(); +this.conf = ctx.getConfiguration(); this.quotasEnabled = QuotaUtil.isQuotaEnabled(conf); + +if (!(ctx instanceof MasterCoprocessorEnvironment)) { + throw new CoprocessorException("Must be loaded on master."); +} +// if running on master +MasterCoprocessorEnvironment mEnv = (MasterCoprocessorEnvironment) ctx; +if (mEnv instanceof HasMasterServices) { + this.masterServices = ((HasMasterServices) mEnv).getMasterServices(); +} else { + throw new CoprocessorException("Must be loaded on a master having master services."); +} } @Override @@ -64,18 +80,23 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { return; } final Connection conn = ctx.getEnvironment().getConnection(); -Quotas quotas = QuotaUtil.getTableQuota(conn, tableName);
[hbase] 02/02: HBASE-22142 Drop table RegionSizes with namespace quota
This is an automated email from the ASF dual-hosted git repository. elserj pushed a commit to branch branch-2.1 in repository https://gitbox.apache.org/repos/asf/hbase.git commit 5cc8d7f690bb5071cd2838877199462fcb120c62 Author: shardul-cr7 AuthorDate: Fri Sep 20 10:57:15 2019 -0400 HBASE-22142 Drop table RegionSizes with namespace quota There was a bug in which we would not drop the RegionSizes for a table in a namespace, where the namespace had a quota on it. This allowed a scenario in which recreation of a table inside of a namespace would unintentionally move into violation despite the table being empty. Need to make sure the RegionSizes are dropped on table deletion if there is _any_ quota applying to that table. Signed-off-by: Josh Elser --- .../hadoop/hbase/quotas/MasterQuotaManager.java| 9 .../hadoop/hbase/quotas/MasterQuotasObserver.java | 47 +-- .../hbase/quotas/TestSpaceQuotaDropTable.java | 52 ++ 3 files changed, 95 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 7084707..169c6c1 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 @@ -576,5 +576,14 @@ public class MasterQuotaManager implements RegionStateListener { } return numEntriesRemoved; } + + /** + * Removes each region size entry where the RegionInfo references the provided TableName. + * + * @param tableName tableName. + */ + public void removeRegionSizesForTable(TableName tableName) { +regionSizes.keySet().removeIf(regionInfo -> regionInfo.getTable().equals(tableName)); + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java index cad3129..1ddc9e3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/quotas/MasterQuotasObserver.java @@ -24,10 +24,14 @@ import org.apache.hadoop.hbase.CoprocessorEnvironment; import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Admin; import org.apache.hadoop.hbase.client.Connection; +import org.apache.hadoop.hbase.coprocessor.CoprocessorException; +import org.apache.hadoop.hbase.coprocessor.CoreCoprocessor; +import org.apache.hadoop.hbase.coprocessor.HasMasterServices; import org.apache.hadoop.hbase.coprocessor.MasterCoprocessor; import org.apache.hadoop.hbase.coprocessor.MasterCoprocessorEnvironment; import org.apache.hadoop.hbase.coprocessor.MasterObserver; import org.apache.hadoop.hbase.coprocessor.ObserverContext; +import org.apache.hadoop.hbase.master.MasterServices; import org.apache.yetus.audience.InterfaceAudience; import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas; @@ -35,6 +39,7 @@ import org.apache.hadoop.hbase.shaded.protobuf.generated.QuotaProtos.Quotas; * An observer to automatically delete quotas when a table/namespace * is deleted. */ +@CoreCoprocessor @InterfaceAudience.Private public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { public static final String REMOVE_QUOTA_ON_TABLE_DELETE = "hbase.quota.remove.on.table.delete"; @@ -43,6 +48,7 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { private CoprocessorEnvironment cpEnv; private Configuration conf; private boolean quotasEnabled = false; + private MasterServices masterServices; @Override public Optional getMasterObserver() { @@ -51,9 +57,19 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { @Override public void start(CoprocessorEnvironment ctx) throws IOException { -this.cpEnv = ctx; -this.conf = cpEnv.getConfiguration(); +this.conf = ctx.getConfiguration(); this.quotasEnabled = QuotaUtil.isQuotaEnabled(conf); + +if (!(ctx instanceof MasterCoprocessorEnvironment)) { + throw new CoprocessorException("Must be loaded on master."); +} +// if running on master +MasterCoprocessorEnvironment mEnv = (MasterCoprocessorEnvironment) ctx; +if (mEnv instanceof HasMasterServices) { + this.masterServices = ((HasMasterServices) mEnv).getMasterServices(); +} else { + throw new CoprocessorException("Must be loaded on a master having master services."); +} } @Override @@ -64,18 +80,23 @@ public class MasterQuotasObserver implements MasterCoprocessor, MasterObserver { return; } final Connection conn = ctx.getEnvironment().getConnection(); -Quotas quotas = QuotaUtil.getTableQuota(conn, tableName);