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"));