From f5a5a001a6484eeee850ebefb7969c8a1cec1654 Mon Sep 17 00:00:00 2001 From: Bahram Chehrazy Date: Wed, 13 Feb 2019 15:05:42 -0800 Subject: [PATCH] Master to update the meta state on ZK as soon as the meta server dies --- .../assignment/OpenRegionProcedure.java | 10 +++++--- .../master/assignment/RegionStateStore.java | 7 ++++-- .../hadoop/hbase/TestMetaTableLocator.java | 16 ++++++++++++ .../hbase/zookeeper/MetaTableLocator.java | 25 +++++++++++++++++-- 4 files changed, 51 insertions(+), 7 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.java index 4b3a976f28..17384105ef 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/OpenRegionProcedure.java @@ -26,15 +26,17 @@ import org.apache.hadoop.hbase.master.procedure.RSProcedureDispatcher.RegionOpen import org.apache.hadoop.hbase.procedure2.ProcedureMetrics; import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer; import org.apache.hadoop.hbase.procedure2.RemoteProcedureDispatcher.RemoteOperation; -import org.apache.yetus.audience.InterfaceAudience; - import org.apache.hadoop.hbase.shaded.protobuf.generated.MasterProcedureProtos.OpenRegionProcedureStateData; +import org.apache.yetus.audience.InterfaceAudience; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; /** * The remote procedure used to open a region. */ @InterfaceAudience.Private public class OpenRegionProcedure extends RegionRemoteProcedureBase { + private static final Logger LOG = LoggerFactory.getLogger(OpenRegionProcedure.class); public OpenRegionProcedure() { super(); @@ -74,6 +76,8 @@ public class OpenRegionProcedure extends RegionRemoteProcedureBase { @Override protected boolean shouldDispatch(RegionStateNode regionNode) { - return regionNode.isInState(RegionState.State.OPENING); + boolean shouldDispatch = regionNode.isInState(RegionState.State.OPENING); + LOG.info("OpenRegionProcedure will {}be dispatched for [{}] ", (shouldDispatch ? "" : "not "), regionNode); + return shouldDispatch; } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java index ce4bc38cd3..343f607644 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/RegionStateStore.java @@ -147,8 +147,11 @@ public class RegionStateStore { private void updateMetaLocation(RegionInfo regionInfo, ServerName serverName, State state) throws IOException { try { - MetaTableLocator.setMetaLocation(master.getZooKeeper(), serverName, regionInfo.getReplicaId(), - state); + if (serverName != null) { + MetaTableLocator.setMetaLocation(master.getZooKeeper(), serverName, regionInfo.getReplicaId(), state); + } else { + MetaTableLocator.updateMetaRegionState(master.getZooKeeper(), regionInfo.getReplicaId(), state); + } } catch (KeeperException e) { throw new IOException(e); } diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableLocator.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableLocator.java index 9274fa0a49..73ea9ff0df 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableLocator.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/TestMetaTableLocator.java @@ -164,6 +164,22 @@ public class TestMetaTableLocator { assertTrue(MetaTableLocator.getMetaRegionLocation(watcher).equals(hsa)); } + /** + * Test update meta region without changing the server name. + */ + @Test + public void testUpdateMetaRegionState() throws KeeperException { + MetaTableLocator.setMetaLocation(this.watcher, SN, RegionState.State.OPEN); + + for (RegionState.State state : RegionState.State.values()) { + MetaTableLocator.updateMetaRegionState(this.watcher, state); + assertEquals(state, MetaTableLocator.getMetaRegionState(this.watcher).getState()); + assertEquals( + state.equals(RegionState.State.OPEN) ? SN : null, + MetaTableLocator.getMetaRegionLocation(this.watcher)); + } + } + private void startWaitAliveThenWaitItLives(final Thread t, final int ms) { t.start(); UTIL.waitFor(2000, t::isAlive); diff --git a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MetaTableLocator.java b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MetaTableLocator.java index 0cebc762fd..07be628637 100644 --- a/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MetaTableLocator.java +++ b/hbase-zookeeper/src/main/java/org/apache/hadoop/hbase/zookeeper/MetaTableLocator.java @@ -234,8 +234,8 @@ public final class MetaTableLocator { LOG.warn("Tried to set null ServerName in hbase:meta; skipping -- ServerName required"); return; } - LOG.info("Setting hbase:meta (replicaId=" + replicaId + ") location in ZooKeeper as " + - serverName); + LOG.info("Setting hbase:meta (replicaId={}) location in ZooKeeper as {}, state={}", + replicaId, serverName, state); // Make the MetaRegionServer pb and then get its bytes and save this as // the znode content. MetaRegionServer pbrsr = MetaRegionServer.newBuilder() @@ -312,6 +312,27 @@ public final class MetaTableLocator { state, serverName); } + // Updates the state of the default hbase:meta replica in ZooKeeper. + public static void updateMetaRegionState(ZKWatcher zookeeper, RegionState.State state) + throws KeeperException { + updateMetaRegionState(zookeeper, RegionInfo.DEFAULT_REPLICA_ID, state); + } + + /** + * Updates the state of hbase:meta in ZooKeeper. + * @param zookeeper reference to the {@link ZKWatcher} which also contains configuration and + * operation + * @param replicaId the ID of the replica + * @param state the new state of the meta region + * @throws KeeperException if a ZooKeeper operation fails + */ + public static void updateMetaRegionState(ZKWatcher zookeeper, int replicaId, RegionState.State state) + throws KeeperException { + LOG.info("Updating hbase:meta (replicaId={}) state in ZooKeeper as {}.", replicaId, state); + RegionState metaRegion = getMetaRegionState(zookeeper, replicaId); + setMetaLocation(zookeeper, metaRegion.getServerName(), replicaId, state); + } + /** * Deletes the location of hbase:meta in ZooKeeper. * @param zookeeper zookeeper reference -- 2.20.1.windows.1