Return-Path: X-Original-To: apmail-hbase-commits-archive@www.apache.org Delivered-To: apmail-hbase-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 96B5118036 for ; Wed, 2 Mar 2016 03:38:09 +0000 (UTC) Received: (qmail 83659 invoked by uid 500); 2 Mar 2016 03:38:09 -0000 Delivered-To: apmail-hbase-commits-archive@hbase.apache.org Received: (qmail 83616 invoked by uid 500); 2 Mar 2016 03:38:09 -0000 Mailing-List: contact commits-help@hbase.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@hbase.apache.org Delivered-To: mailing list commits@hbase.apache.org Received: (qmail 83607 invoked by uid 99); 2 Mar 2016 03:38:09 -0000 Received: from git1-us-west.apache.org (HELO git1-us-west.apache.org) (140.211.11.23) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 02 Mar 2016 03:38:09 +0000 Received: by git1-us-west.apache.org (ASF Mail Server at git1-us-west.apache.org, from userid 33) id 45D8DE0007; Wed, 2 Mar 2016 03:38:09 +0000 (UTC) Content-Type: text/plain; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit From: syuanjiang@apache.org To: commits@hbase.apache.org Message-Id: X-Mailer: ASF-Git Admin Mailer Subject: hbase git commit: HBASE-15371: Procedure V2 - Completed support parent-child procedure (Stephen Yuan Jiang) Date: Wed, 2 Mar 2016 03:38:09 +0000 (UTC) Repository: hbase Updated Branches: refs/heads/master 69e442efe -> 60b81dc84 HBASE-15371: Procedure V2 - Completed support parent-child procedure (Stephen Yuan Jiang) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/60b81dc8 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/60b81dc8 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/60b81dc8 Branch: refs/heads/master Commit: 60b81dc84859901881918d7dc686bf210e20989b Parents: 69e442e Author: Stephen Yuan Jiang Authored: Tue Mar 1 19:37:56 2016 -0800 Committer: Stephen Yuan Jiang Committed: Tue Mar 1 19:37:56 2016 -0800 ---------------------------------------------------------------------- .../hbase/procedure2/StateMachineProcedure.java | 21 +++++++++++++++ .../hbase/procedure2/TestProcedureRecovery.java | 28 +++++++++++++++++++- 2 files changed, 48 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/60b81dc8/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 286a7bf..c2b4548 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 @@ -21,6 +21,7 @@ package org.apache.hadoop.hbase.procedure2; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.ArrayList; import java.util.Arrays; import org.apache.hadoop.hbase.classification.InterfaceAudience; @@ -45,6 +46,8 @@ public abstract class StateMachineProcedure private int stateCount = 0; private int[] states = null; + private ArrayList subProcList = null; + protected enum Flow { HAS_MORE_STATE, NO_MORE_STATE, @@ -107,6 +110,17 @@ public abstract class StateMachineProcedure return false; } + /** + * Add a child procedure to execute + * @param subProcedure the child procedure + */ + protected void addChildProcedure(Procedure subProcedure) { + if (subProcList == null) { + subProcList = new ArrayList(); + } + subProcList.add(subProcedure); + } + @Override protected Procedure[] execute(final TEnvironment env) throws ProcedureYieldException, InterruptedException { @@ -120,6 +134,13 @@ public abstract class StateMachineProcedure // completed return null; } + + if (subProcList != null && subProcList.size() != 0) { + Procedure[] subProcedures = subProcList.toArray(new Procedure[subProcList.size()]); + subProcList = null; + return subProcedures; + } + return (isWaiting() || isFailed()) ? null : new Procedure[] {this}; } finally { updateTimestamp(); http://git-wip-us.apache.org/repos/asf/hbase/blob/60b81dc8/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 cae10ef..18df398 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 @@ -337,8 +337,13 @@ public class TestProcedureRecovery { public TestStateMachineProcedure() {} + public TestStateMachineProcedure(final boolean testSubmitChildProc) { + this.submitChildProc = testSubmitChildProc; + } + private AtomicBoolean aborted = new AtomicBoolean(false); private int iResult = 0; + private boolean submitChildProc = false; @Override protected StateMachineProcedure.Flow executeFromState(TestProcEnv env, State state) { @@ -350,7 +355,13 @@ public class TestProcedureRecovery { break; case STATE_2: LOG.info("execute step 2 " + this); - setNextState(State.STATE_3); + if (submitChildProc) { + addChildProcedure(new TestStateMachineProcedure()); + addChildProcedure(new TestStateMachineProcedure()); + setNextState(State.DONE); + } else { + setNextState(State.STATE_3); + } iResult += 5; break; case STATE_3: @@ -363,6 +374,8 @@ public class TestProcedureRecovery { } setNextState(State.DONE); iResult += 7; + break; + case DONE: setResult(Bytes.toBytes(iResult)); return Flow.NO_MORE_STATE; default: @@ -425,6 +438,14 @@ public class TestProcedureRecovery { } @Test(timeout=30000) + public void testStateMachineMultipleLevel() throws Exception { + long procId = procExecutor.submitProcedure(new TestStateMachineProcedure(true)); + // Wait the completion + ProcedureTestingUtility.waitProcedure(procExecutor, procId); + ProcedureTestingUtility.assertProcNotFailed(procExecutor, procId); + } + + @Test(timeout=30000) public void testStateMachineRecovery() throws Exception { ProcedureTestingUtility.setToggleKillBeforeStoreUpdate(procExecutor, true); ProcedureTestingUtility.setKillBeforeStoreUpdate(procExecutor, true); @@ -449,6 +470,11 @@ public class TestProcedureRecovery { // Step 3 exec restart(); waitProcedure(procId); + ProcedureTestingUtility.assertProcNotYetCompleted(procExecutor, procId); + assertFalse(procExecutor.isRunning()); + + restart(); + waitProcedure(procId); assertTrue(procExecutor.isRunning()); // The procedure is completed