(hbase) 02/02: HBASE-28150 CreateTableProcedure and DeleteTableProcedure should sleep a while before retrying (#5502)

2024-04-21 Thread zhangduo
This is an automated email from the ASF dual-hosted git repository.

zhangduo pushed a commit to branch branch-3
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit 300608cfcec47001199cf7b7aefc3ba3ea3a6ed9
Author: chaijunjie0101 <64140218+chaijunjie0...@users.noreply.github.com>
AuthorDate: Sun Apr 21 19:39:32 2024 +0800

HBASE-28150 CreateTableProcedure and DeleteTableProcedure should sleep a 
while before retrying (#5502)

Signed-off-by: Duo Zhang 
(cherry picked from commit 5a404c49504edfef250b248228093823942c5e1b)
---
 .../master/procedure/CreateTableProcedure.java | 24 +-
 .../master/procedure/DeleteTableProcedure.java | 24 +-
 .../BadMasterObserverForCreateDeleteTable.java | 55 ++
 .../TestCreateDeleteTableProcedureWithRetry.java   | 88 ++
 .../master/procedure/TestCreateTableProcedure.java |  4 +-
 5 files changed, 190 insertions(+), 5 deletions(-)

diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
index 17998fec7bd..23ad3b42aef 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
@@ -35,12 +35,15 @@ import org.apache.hadoop.hbase.fs.ErasureCodingUtils;
 import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.master.MasterFileSystem;
 import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;
+import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;
+import org.apache.hadoop.hbase.procedure2.ProcedureUtil;
 import 
org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTrackerFactory;
 import 
org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTrackerValidationUtils;
 import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
 import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.FSTableDescriptors;
 import org.apache.hadoop.hbase.util.ModifyRegionUtils;
+import org.apache.hadoop.hbase.util.RetryCounter;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,6 +54,7 @@ import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;
 import 
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.CreateTableState;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;
 
 @InterfaceAudience.Private
 public class CreateTableProcedure extends 
AbstractStateMachineTableProcedure {
@@ -60,6 +64,7 @@ public class CreateTableProcedure extends 
AbstractStateMachineTableProcedure newRegions;
+  private RetryCounter retryCounter;
 
   public CreateTableProcedure() {
 // Required by the Procedure framework to create the procedure on replay
@@ -80,7 +85,7 @@ public class CreateTableProcedure extends 
AbstractStateMachineTableProcedure {
@@ -61,6 +65,7 @@ public class DeleteTableProcedure extends 
AbstractStateMachineTableProcedure regions;
   private TableName tableName;
+  private RetryCounter retryCounter;
 
   public DeleteTableProcedure() {
 // Required by the Procedure framework to create the procedure on replay
@@ -79,7 +84,7 @@ public class DeleteTableProcedure extends 
AbstractStateMachineTableProcedurehttp://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.coprocessor;
+
+import java.io.IOException;
+import java.util.Optional;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.client.TableDescriptor;
+
+/**
+ * A bad Master Observer to prevent user to create/delete table once.
+ */
+public class BadMasterObserverForCreateDeleteTable implements MasterObserver, 
MasterCoprocessor {
+  private boolean createFailedOnce = false;
+  private boolean deleteFailedOnce = false;
+
+  @Override
+  public void 
postCompletedCreateTableAction(ObserverContext 
ctx,
+TableDescriptor desc, RegionInfo[] regions) throws IOException {
+if (!createFailedOnce && !desc.getTableName().isSystemTable()) {
+  createFailedOnce = true;
+  throw new IOException("execute postCompletedCreateTableAction failed 
once.");
+}
+  }
+
+  @Override
+  public void 
postCompletedDeleteTableAction(ObserverContext 
ctx,
+TableName tableName) throws 

(hbase) 02/02: HBASE-28150 CreateTableProcedure and DeleteTableProcedure should sleep a while before retrying (#5502)

2024-04-21 Thread zhangduo
This is an automated email from the ASF dual-hosted git repository.

zhangduo pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit 5a404c49504edfef250b248228093823942c5e1b
Author: chaijunjie0101 <64140218+chaijunjie0...@users.noreply.github.com>
AuthorDate: Sun Apr 21 19:39:32 2024 +0800

HBASE-28150 CreateTableProcedure and DeleteTableProcedure should sleep a 
while before retrying (#5502)

Signed-off-by: Duo Zhang 
---
 .../master/procedure/CreateTableProcedure.java | 24 +-
 .../master/procedure/DeleteTableProcedure.java | 24 +-
 .../BadMasterObserverForCreateDeleteTable.java | 55 ++
 .../TestCreateDeleteTableProcedureWithRetry.java   | 88 ++
 .../master/procedure/TestCreateTableProcedure.java |  4 +-
 5 files changed, 190 insertions(+), 5 deletions(-)

diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
index 17998fec7bd..23ad3b42aef 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java
@@ -35,12 +35,15 @@ import org.apache.hadoop.hbase.fs.ErasureCodingUtils;
 import org.apache.hadoop.hbase.master.MasterCoprocessorHost;
 import org.apache.hadoop.hbase.master.MasterFileSystem;
 import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;
+import org.apache.hadoop.hbase.procedure2.ProcedureSuspendedException;
+import org.apache.hadoop.hbase.procedure2.ProcedureUtil;
 import 
org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTrackerFactory;
 import 
org.apache.hadoop.hbase.regionserver.storefiletracker.StoreFileTrackerValidationUtils;
 import org.apache.hadoop.hbase.rsgroup.RSGroupInfo;
 import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.FSTableDescriptors;
 import org.apache.hadoop.hbase.util.ModifyRegionUtils;
+import org.apache.hadoop.hbase.util.RetryCounter;
 import org.apache.yetus.audience.InterfaceAudience;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,6 +54,7 @@ import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.HBaseProtos;
 import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos;
 import 
org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.CreateTableState;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.ProcedureProtos;
 
 @InterfaceAudience.Private
 public class CreateTableProcedure extends 
AbstractStateMachineTableProcedure {
@@ -60,6 +64,7 @@ public class CreateTableProcedure extends 
AbstractStateMachineTableProcedure newRegions;
+  private RetryCounter retryCounter;
 
   public CreateTableProcedure() {
 // Required by the Procedure framework to create the procedure on replay
@@ -80,7 +85,7 @@ public class CreateTableProcedure extends 
AbstractStateMachineTableProcedure {
@@ -61,6 +65,7 @@ public class DeleteTableProcedure extends 
AbstractStateMachineTableProcedure regions;
   private TableName tableName;
+  private RetryCounter retryCounter;
 
   public DeleteTableProcedure() {
 // Required by the Procedure framework to create the procedure on replay
@@ -79,7 +84,7 @@ public class DeleteTableProcedure extends 
AbstractStateMachineTableProcedurehttp://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.hadoop.hbase.coprocessor;
+
+import java.io.IOException;
+import java.util.Optional;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.client.RegionInfo;
+import org.apache.hadoop.hbase.client.TableDescriptor;
+
+/**
+ * A bad Master Observer to prevent user to create/delete table once.
+ */
+public class BadMasterObserverForCreateDeleteTable implements MasterObserver, 
MasterCoprocessor {
+  private boolean createFailedOnce = false;
+  private boolean deleteFailedOnce = false;
+
+  @Override
+  public void 
postCompletedCreateTableAction(ObserverContext 
ctx,
+TableDescriptor desc, RegionInfo[] regions) throws IOException {
+if (!createFailedOnce && !desc.getTableName().isSystemTable()) {
+  createFailedOnce = true;
+  throw new IOException("execute postCompletedCreateTableAction failed 
once.");
+}
+  }
+
+  @Override
+  public void 
postCompletedDeleteTableAction(ObserverContext 
ctx,
+TableName tableName) throws IOException {
+if (!deleteFailedOnce && !tableName.isSystemTable()) {
+