You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by st...@apache.org on 2019/01/16 00:38:43 UTC

[hbase] branch master updated: HBASE-21647 Add status track for splitting WAL tasks

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

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


The following commit(s) were added to refs/heads/master by this push:
     new c2c1af4  HBASE-21647 Add status track for splitting WAL tasks
c2c1af4 is described below

commit c2c1af4927b1e1c4443998a92946b05ffafd5937
Author: tianjingyun <ti...@gmail.com>
AuthorDate: Tue Jan 15 20:19:13 2019 +0800

    HBASE-21647 Add status track for splitting WAL tasks
---
 .../assignment/TransitRegionStateProcedure.java    |  3 ++
 .../master/procedure/ServerCrashProcedure.java     | 39 ++++++++++++++++++++++
 .../hbase/master/procedure/SplitWALProcedure.java  |  1 +
 3 files changed, 43 insertions(+)

diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java
index 0885a6a..2d022b7 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/assignment/TransitRegionStateProcedure.java
@@ -32,6 +32,7 @@ import org.apache.hadoop.hbase.exceptions.UnexpectedStateException;
 import org.apache.hadoop.hbase.master.RegionState.State;
 import org.apache.hadoop.hbase.master.procedure.AbstractStateMachineRegionProcedure;
 import org.apache.hadoop.hbase.master.procedure.MasterProcedureEnv;
+import org.apache.hadoop.hbase.master.procedure.ServerCrashProcedure;
 import org.apache.hadoop.hbase.procedure2.Procedure;
 import org.apache.hadoop.hbase.procedure2.ProcedureMetrics;
 import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;
@@ -398,6 +399,8 @@ public class TransitRegionStateProcedure
     regionNode.setOpenSeqNum(openSeqNum);
     env.getAssignmentManager().regionOpened(regionNode);
     if (lastState == RegionStateTransitionState.REGION_STATE_TRANSITION_CONFIRM_OPENED) {
+      // if parent procedure is ServerCrashProcedure, update progress
+      ServerCrashProcedure.updateProgress(env, getParentProcId());
       // we are done
       regionNode.unsetProcedure(this);
     }
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java
index bee90cda..292fa45 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/ServerCrashProcedure.java
@@ -35,6 +35,8 @@ import org.apache.hadoop.hbase.master.SplitWALManager;
 import org.apache.hadoop.hbase.master.assignment.AssignmentManager;
 import org.apache.hadoop.hbase.master.assignment.RegionStateNode;
 import org.apache.hadoop.hbase.master.assignment.TransitRegionStateProcedure;
+import org.apache.hadoop.hbase.monitoring.MonitoredTask;
+import org.apache.hadoop.hbase.monitoring.TaskMonitor;
 import org.apache.hadoop.hbase.procedure2.Procedure;
 import org.apache.hadoop.hbase.procedure2.ProcedureMetrics;
 import org.apache.hadoop.hbase.procedure2.ProcedureStateSerializer;
@@ -82,6 +84,10 @@ public class ServerCrashProcedure
 
   private boolean carryingMeta = false;
   private boolean shouldSplitWal;
+  private MonitoredTask status;
+  // currentRunningState is updated when ServerCrashProcedure get scheduled, child procedures update
+  // progress will not update the state because the actual state is overwritten by its next state
+  private ServerCrashState currentRunningState = getInitialState();
 
   /**
    * Call this constructor queuing up a Procedure.
@@ -113,6 +119,7 @@ public class ServerCrashProcedure
       throws ProcedureSuspendedException, ProcedureYieldException {
     final MasterServices services = env.getMasterServices();
     final AssignmentManager am = env.getAssignmentManager();
+    updateProgress(true);
     // HBASE-14802
     // If we have not yet notified that we are processing a dead server, we should do now.
     if (!notifiedDeadServer) {
@@ -224,6 +231,7 @@ public class ServerCrashProcedure
           LOG.info("removed crashed server {} after splitting done", serverName);
           services.getAssignmentManager().getRegionStates().removeServer(serverName);
           services.getServerManager().getDeadServers().finish(serverName);
+          updateProgress(true);
           return Flow.NO_MORE_STATE;
         default:
           throw new UnsupportedOperationException("unhandled state=" + state);
@@ -299,6 +307,25 @@ public class ServerCrashProcedure
     LOG.debug("Done splitting WALs {}", this);
   }
 
+  void updateProgress(boolean updateState) {
+    String msg = "Processing ServerCrashProcedure of " + serverName;
+    if (status == null) {
+      status = TaskMonitor.get().createStatus(msg);
+      return;
+    }
+    if (currentRunningState == ServerCrashState.SERVER_CRASH_FINISH) {
+      status.markComplete(msg + " done");
+      return;
+    }
+    if (updateState) {
+      currentRunningState = getCurrentState();
+    }
+    int childrenLatch = getChildrenLatch();
+    status.setStatus(msg + " current State " + currentRunningState
+        + (childrenLatch > 0 ? "; remaining num of running child procedures = " + childrenLatch
+            : ""));
+  }
+
   @Override
   protected void rollbackState(MasterProcedureEnv env, ServerCrashState state)
   throws IOException {
@@ -387,6 +414,7 @@ public class ServerCrashProcedure
         this.regionsOnCrashedServer.add(ProtobufUtil.toRegionInfo(ri));
       }
     }
+    updateProgress(false);
   }
 
   @Override
@@ -455,4 +483,15 @@ public class ServerCrashProcedure
   protected boolean holdLock(MasterProcedureEnv env) {
     return true;
   }
+
+  public static void updateProgress(MasterProcedureEnv env, long parentId) {
+    if (parentId == NO_PROC_ID) {
+      return;
+    }
+    Procedure parentProcedure =
+        env.getMasterServices().getMasterProcedureExecutor().getProcedure(parentId);
+    if (parentProcedure != null && parentProcedure instanceof ServerCrashProcedure) {
+      ((ServerCrashProcedure) parentProcedure).updateProgress(false);
+    }
+  }
 }
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.java
index 3b2d0d5..7e70ded 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/procedure/SplitWALProcedure.java
@@ -94,6 +94,7 @@ public class SplitWALProcedure
           setNextState(MasterProcedureProtos.SplitWALState.ACQUIRE_SPLIT_WAL_WORKER);
           return Flow.HAS_MORE_STATE;
         }
+        ServerCrashProcedure.updateProgress(env, getParentProcId());
         return Flow.NO_MORE_STATE;
       default:
         throw new UnsupportedOperationException("unhandled state=" + state);