You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by mb...@apache.org on 2016/08/24 00:02:26 UTC

[3/3] hbase git commit: HBASE-16485 Procedure v2 - Add support to addChildProcedure() as last "step" in StateMachineProcedure

HBASE-16485 Procedure v2 - Add support to addChildProcedure() as last "step" in StateMachineProcedure


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/1e15fa57
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/1e15fa57
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/1e15fa57

Branch: refs/heads/branch-1
Commit: 1e15fa57df5ee11ffce3f1e4052ce75f61e2c774
Parents: a1e57d9
Author: Matteo Bertozzi <ma...@cloudera.com>
Authored: Tue Aug 23 16:42:57 2016 -0700
Committer: Matteo Bertozzi <ma...@cloudera.com>
Committed: Tue Aug 23 16:54:22 2016 -0700

----------------------------------------------------------------------
 .../hbase/procedure2/ProcedureExecutor.java     |  6 +++++
 .../hbase/procedure2/StateMachineProcedure.java | 25 +++++++++++++-------
 .../hbase/procedure2/TestProcedureRecovery.java | 14 +++++++----
 3 files changed, 32 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/1e15fa57/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java
----------------------------------------------------------------------
diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java
index c4f06f1..c195f65 100644
--- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java
+++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/ProcedureExecutor.java
@@ -18,6 +18,7 @@
 
 package org.apache.hadoop.hbase.procedure2;
 
+import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
 
 import java.io.IOException;
@@ -1288,6 +1289,11 @@ public class ProcedureExecutor<TEnvironment> {
     return procId;
   }
 
+  @VisibleForTesting
+  protected long getLastProcId() {
+    return lastProcId.get();
+  }
+
   private Long getRootProcedureId(Procedure proc) {
     return Procedure.getRootProcedureId(procedures, proc);
   }

http://git-wip-us.apache.org/repos/asf/hbase/blob/1e15fa57/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java
----------------------------------------------------------------------
diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java
index c2b4548..47eb09e 100644
--- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java
+++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/StateMachineProcedure.java
@@ -43,6 +43,7 @@ import org.apache.hadoop.hbase.protobuf.generated.ProcedureProtos.StateMachinePr
 @InterfaceStability.Evolving
 public abstract class StateMachineProcedure<TEnvironment, TState>
     extends Procedure<TEnvironment> {
+  private Flow stateFlow = Flow.HAS_MORE_STATE;
   private int stateCount = 0;
   private int[] states = null;
 
@@ -114,11 +115,13 @@ public abstract class StateMachineProcedure<TEnvironment, TState>
    * Add a child procedure to execute
    * @param subProcedure the child procedure
    */
-  protected void addChildProcedure(Procedure subProcedure) {
+  protected void addChildProcedure(Procedure... subProcedure) {
     if (subProcList == null) {
-      subProcList = new ArrayList<Procedure>();
+      subProcList = new ArrayList<Procedure>(subProcedure.length);
+    }
+    for (int i = 0; i < subProcedure.length; ++i) {
+      subProcList.add(subProcedure[i]);
     }
-    subProcList.add(subProcedure);
   }
 
   @Override
@@ -126,14 +129,14 @@ public abstract class StateMachineProcedure<TEnvironment, TState>
       throws ProcedureYieldException, InterruptedException {
     updateTimestamp();
     try {
+      if (!hasMoreState()) return null;
+
       TState state = getCurrentState();
       if (stateCount == 0) {
         setNextState(getStateId(state));
       }
-      if (executeFromState(env, state) == Flow.NO_MORE_STATE) {
-        // completed
-        return null;
-      }
+
+      stateFlow = executeFromState(env, state);
 
       if (subProcList != null && subProcList.size() != 0) {
         Procedure[] subProcedures = subProcList.toArray(new Procedure[subProcList.size()]);
@@ -141,7 +144,7 @@ public abstract class StateMachineProcedure<TEnvironment, TState>
         return subProcedures;
       }
 
-      return (isWaiting() || isFailed()) ? null : new Procedure[] {this};
+      return (isWaiting() || isFailed() || !hasMoreState()) ? null : new Procedure[] {this};
     } finally {
       updateTimestamp();
     }
@@ -164,6 +167,10 @@ public abstract class StateMachineProcedure<TEnvironment, TState>
     return isYieldBeforeExecuteFromState(env, getCurrentState());
   }
 
+  private boolean hasMoreState() {
+    return stateFlow != Flow.NO_MORE_STATE;
+  }
+
   private TState getCurrentState() {
     return stateCount > 0 ? getState(states[stateCount-1]) : getInitialState();
   }
@@ -214,4 +221,4 @@ public abstract class StateMachineProcedure<TEnvironment, TState>
       states = null;
     }
   }
-}
\ No newline at end of file
+}

http://git-wip-us.apache.org/repos/asf/hbase/blob/1e15fa57/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.java
----------------------------------------------------------------------
diff --git a/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.java b/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.java
index e0f2b87..98aedce 100644
--- a/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.java
+++ b/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/TestProcedureRecovery.java
@@ -355,8 +355,7 @@ public class TestProcedureRecovery {
         case STATE_2:
           LOG.info("execute step 2 " + this);
           if (submitChildProc) {
-            addChildProcedure(new TestStateMachineProcedure());
-            addChildProcedure(new TestStateMachineProcedure());
+            addChildProcedure(new TestStateMachineProcedure(), new TestStateMachineProcedure());
             setNextState(State.DONE);
           } else {
             setNextState(State.STATE_3);
@@ -375,6 +374,10 @@ public class TestProcedureRecovery {
           iResult += 7;
           break;
         case DONE:
+          if (submitChildProc) {
+            addChildProcedure(new TestStateMachineProcedure());
+          }
+          iResult += 11;
           setResult(Bytes.toBytes(iResult));
           return Flow.NO_MORE_STATE;
         default:
@@ -441,7 +444,10 @@ public class TestProcedureRecovery {
     long procId = procExecutor.submitProcedure(new TestStateMachineProcedure(true));
     // Wait the completion
     ProcedureTestingUtility.waitProcedure(procExecutor, procId);
-    ProcedureTestingUtility.assertProcNotFailed(procExecutor, procId);
+    ProcedureInfo result = procExecutor.getResult(procId);
+    ProcedureTestingUtility.assertProcNotFailed(result);
+    assertEquals(19, Bytes.toInt(result.getResult()));
+    assertEquals(4, procExecutor.getLastProcId());
   }
 
   @Test(timeout=30000)
@@ -479,7 +485,7 @@ public class TestProcedureRecovery {
     // The procedure is completed
     ProcedureInfo result = procExecutor.getResult(procId);
     ProcedureTestingUtility.assertProcNotFailed(result);
-    assertEquals(15, Bytes.toInt(result.getResult()));
+    assertEquals(26, Bytes.toInt(result.getResult()));
   }
 
   @Test(timeout=30000)