This is an automated email from the ASF dual-hosted git repository.

wangzheng pushed a commit to branch HBASE-28016
in repository https://gitbox.apache.org/repos/asf/hbase-operator-tools.git

commit 3fa2d0301c12d815fb7ec3c09e495fb947d657ca
Author: jediwang <jediw...@tencent.com>
AuthorDate: Thu Aug 10 17:09:55 2023 +0800

    HBASE-28016 hbck2 should support change region state of meta
---
 .../src/main/java/org/apache/hbase/HBCK2.java      | 51 +++++++++++++++++++++-
 .../src/test/java/org/apache/hbase/TestHBCK2.java  | 32 ++++++++++++++
 2 files changed, 82 insertions(+), 1 deletion(-)

diff --git a/hbase-hbck2/src/main/java/org/apache/hbase/HBCK2.java 
b/hbase-hbck2/src/main/java/org/apache/hbase/HBCK2.java
index 1e63d1d..e5d8842 100644
--- a/hbase-hbck2/src/main/java/org/apache/hbase/HBCK2.java
+++ b/hbase-hbck2/src/main/java/org/apache/hbase/HBCK2.java
@@ -41,6 +41,9 @@ import java.util.stream.Collectors;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.io.LineIterator;
 
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.retry.RetryOneTime;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.conf.Configured;
 import org.apache.hadoop.fs.Path;
@@ -64,7 +67,12 @@ import org.apache.hadoop.hbase.filter.RowFilter;
 import org.apache.hadoop.hbase.filter.SubstringComparator;
 import org.apache.hadoop.hbase.master.RegionState;
 
+import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
+import org.apache.hadoop.hbase.shaded.protobuf.generated.ZooKeeperProtos;
 import org.apache.hadoop.hbase.util.Pair;
+import org.apache.hadoop.hbase.zookeeper.ZKConfig;
+import org.apache.hadoop.hbase.zookeeper.ZKMetadata;
+import org.apache.hadoop.hbase.zookeeper.ZNodePaths;
 import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.core.config.Configurator;
 import org.slf4j.Logger;
@@ -109,6 +117,7 @@ public class HBCK2 extends Configured implements 
org.apache.hadoop.util.Tool {
   private static final String GENERATE_TABLE_INFO = 
"generateMissingTableDescriptorFile";
   private static final String FIX_META = "fixMeta";
   private static final String REGIONINFO_MISMATCH = "regionInfoMismatch";
+
   // TODO update this map in case of the name of a method changes in Hbck 
interface
   //  in org.apache.hadoop.hbase.client package. Or a new command is added and 
the hbck command
   //  does not equals to the method name in Hbck interface.
@@ -135,6 +144,8 @@ public class HBCK2 extends Configured implements 
org.apache.hadoop.util.Tool {
    */
   private static final long DEFAULT_LOCK_WAIT = 1;
 
+  private static final String META_ENCODED_REGIONNAME = "1588230740";
+
   /**
    * Check for HBCK support.
    * Expects created connection.
@@ -262,7 +273,45 @@ public class HBCK2 extends Configured implements 
org.apache.hadoop.util.Tool {
     }
     RegionState.State state = RegionState.State.valueOf(args[2]);
     int replicaId = Integer.parseInt(args[1]);
-    return setRegionState(connection, args[0], replicaId, state);
+    if (META_ENCODED_REGIONNAME.equals(args[0])) {
+      return setRegionStateForMeta(replicaId, state);
+    } else {
+      return setRegionState(connection, args[0], replicaId, state);
+    }
+  }
+
+  int setRegionStateForMeta(int replicaId, RegionState.State newState)
+      throws IOException {
+    String mrsPath = new ZNodePaths(conf).getZNodeForReplica(replicaId);
+    try (CuratorFramework client = CuratorFrameworkFactory
+            .newClient(ZKConfig.getZKQuorumServersString(conf), new 
RetryOneTime(3000))) {
+      client.start();
+      // read and print current MetaRegionServer info
+      byte[] mrsData = 
ZKMetadata.removeMetaData(client.getData().forPath(mrsPath));
+      int prefixLen = ProtobufUtil.lengthOfPBMagic();
+      ZooKeeperProtos.MetaRegionServer mrs = 
ZooKeeperProtos.MetaRegionServer.parser()
+              .parseFrom(mrsData, prefixLen, mrsData.length - prefixLen);
+      System.out.println(mrs.getServer());
+      String currentState = mrs.getState().toString();
+
+      // update MetaRegionServer with new state
+      mrs = mrs.toBuilder().setState(newState.convert()).build();
+      mrsData = ProtobufUtil.prependPBMagic(mrs.toByteArray());
+      client.setData().forPath(mrsPath, mrsData);
+
+      if (replicaId == 0) {
+        System.out.println("Changed region " + META_ENCODED_REGIONNAME + " 
STATE from "
+                + currentState + " to " + newState);
+      } else {
+        System.out.println("Changed STATE for replica region " + replicaId +
+                " of primary region " + META_ENCODED_REGIONNAME +
+                "from " + currentState + " to " + newState);
+      }
+    } catch (Exception e) {
+      LOG.error("Error changing state for region of meta: ", e);
+      throw new IOException(e);
+    }
+    return EXIT_SUCCESS;
   }
 
   int setRegionState(ClusterConnection connection, String region, int 
replicaId,
diff --git a/hbase-hbck2/src/test/java/org/apache/hbase/TestHBCK2.java 
b/hbase-hbck2/src/test/java/org/apache/hbase/TestHBCK2.java
index e795650..f89dcd0 100644
--- a/hbase-hbck2/src/test/java/org/apache/hbase/TestHBCK2.java
+++ b/hbase-hbck2/src/test/java/org/apache/hbase/TestHBCK2.java
@@ -37,6 +37,10 @@ import java.util.concurrent.ExecutionException;
 import java.util.concurrent.Future;
 import java.util.stream.Collectors;
 
+import org.apache.curator.framework.CuratorFramework;
+import org.apache.curator.framework.CuratorFrameworkFactory;
+import org.apache.curator.retry.RetryOneTime;
+import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.fs.Path;
 import org.apache.hadoop.hbase.HBaseTestingUtility;
 import org.apache.hadoop.hbase.HConstants;
@@ -51,10 +55,14 @@ import org.apache.hadoop.hbase.client.Result;
 import org.apache.hadoop.hbase.client.Table;
 import org.apache.hadoop.hbase.client.TableState;
 import org.apache.hadoop.hbase.master.RegionState;
+import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil;
 import org.apache.hadoop.hbase.util.Bytes;
 import org.apache.hadoop.hbase.util.CommonFSUtils;
 import org.apache.hadoop.hbase.util.Threads;
 
+import org.apache.hadoop.hbase.zookeeper.ZKConfig;
+import org.apache.hadoop.hbase.zookeeper.ZKMetadata;
+import org.apache.hadoop.hbase.zookeeper.ZNodePaths;
 import org.junit.After;
 import org.junit.AfterClass;
 import org.junit.Before;
@@ -229,6 +237,30 @@ public class TestHBCK2 {
     }
   }
 
+  @Test
+  public void testSetRegionStateForMeta() throws Exception {
+    Configuration conf = TEST_UTIL.getConfiguration();
+    String mrsPath = new ZNodePaths(conf).getZNodeForReplica(0);
+    try (CuratorFramework client = CuratorFrameworkFactory
+            .newClient(ZKConfig.getZKQuorumServersString(conf), new 
RetryOneTime(3000))) {
+      client.start();
+      // current state should be OPEN
+      byte[] mrsData = 
ZKMetadata.removeMetaData(client.getData().forPath(mrsPath));
+      RegionState regionState= 
ProtobufUtil.parseMetaRegionStateFrom(mrsData,0);
+      assertEquals(RegionState.State.OPEN, regionState.getState());
+
+      // change state to OFFLINE and then to OPEN
+      RegionState.State[] targetStates = new 
RegionState.State[]{RegionState.State.OFFLINE,
+              RegionState.State.OPEN};
+      for (RegionState.State targetState : targetStates) {
+        this.hbck2.setRegionStateForMeta(0, targetState);
+        mrsData = ZKMetadata.removeMetaData(client.getData().forPath(mrsPath));
+        regionState = ProtobufUtil.parseMetaRegionStateFrom(mrsData, 0);
+        assertEquals(targetState, regionState.getState());
+      }
+    }
+  }
+
   @Test
   public void testSetRegionStateWithArgsList() throws IOException {
     TEST_UTIL.createTable(REGION_STATES_TABLE_NAME, Bytes.toBytes("family1"));

Reply via email to