[hbase] 02/02: HBASE-22142 Drop table RegionSizes with namespace quota

2019-09-20 Thread elserj
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

2019-09-20 Thread elserj
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

2019-09-20 Thread elserj
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

2019-09-20 Thread elserj
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);