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/09/16 02:16:19 UTC

[3/3] hbase git commit: HBASE-16639 TestProcedureInMemoryChore#testChoreAddAndRemove occasionally fails

HBASE-16639 TestProcedureInMemoryChore#testChoreAddAndRemove occasionally fails


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

Branch: refs/heads/branch-1
Commit: 08e44919cc2994760cea26f76ad9ecbcba9fb804
Parents: 76a0760
Author: Matteo Bertozzi <ma...@cloudera.com>
Authored: Thu Sep 15 18:25:11 2016 -0700
Committer: Matteo Bertozzi <ma...@cloudera.com>
Committed: Thu Sep 15 18:32:53 2016 -0700

----------------------------------------------------------------------
 .../apache/hadoop/hbase/procedure2/Procedure.java |  7 +++++++
 .../hbase/procedure2/ProcedureExecutor.java       | 18 +++++++++++-------
 .../procedure2/TestProcedureInMemoryChore.java    |  5 ++++-
 3 files changed, 22 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/08e44919/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/Procedure.java
----------------------------------------------------------------------
diff --git a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/Procedure.java b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/Procedure.java
index 1a1ea2f..51bf9e2 100644
--- a/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/Procedure.java
+++ b/hbase-procedure/src/main/java/org/apache/hadoop/hbase/procedure2/Procedure.java
@@ -326,6 +326,13 @@ public abstract class Procedure<TEnvironment> implements Comparable<Procedure> {
   }
 
   /**
+   * @return true if the procedure is in a RUNNABLE state.
+   */
+  protected synchronized boolean isRunnable() {
+    return state == ProcedureState.RUNNABLE;
+  }
+
+  /**
    * @return true if the procedure has failed.
    *         true may mean failed but not yet rolledback or failed and rolledback.
    */

http://git-wip-us.apache.org/repos/asf/hbase/blob/08e44919/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 4eb2796..d6ed207 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
@@ -595,15 +595,17 @@ public class ProcedureExecutor<TEnvironment> {
    * @param chore the chore to add
    */
   public void addChore(final ProcedureInMemoryChore chore) {
+    chore.setState(ProcedureState.RUNNABLE);
     waitingTimeout.add(chore);
   }
 
   /**
    * Remove a chore procedure from the executor
    * @param chore the chore to remove
-   * @return whether the chore is removed
+   * @return whether the chore is removed, or it will be removed later
    */
   public boolean removeChore(final ProcedureInMemoryChore chore) {
+    chore.setState(ProcedureState.FINISHED);
     return waitingTimeout.remove(chore);
   }
 
@@ -901,13 +903,15 @@ public class ProcedureExecutor<TEnvironment> {
       // instead of bringing the Chore class in, we reuse this timeout thread for
       // this special case.
       if (proc instanceof ProcedureInMemoryChore) {
-        try {
-          ((ProcedureInMemoryChore)proc).periodicExecute(getEnvironment());
-        } catch (Throwable e) {
-          LOG.error("Ignoring CompletedProcedureCleaner exception: " + e.getMessage(), e);
+        if (proc.isRunnable()) {
+          try {
+            ((ProcedureInMemoryChore)proc).periodicExecute(getEnvironment());
+          } catch (Throwable e) {
+            LOG.error("Ignoring CompletedProcedureCleaner exception: " + e.getMessage(), e);
+          }
+          proc.setStartTime(EnvironmentEdgeManager.currentTime());
+          if (proc.isRunnable()) waitingTimeout.add(proc);
         }
-        proc.setStartTime(EnvironmentEdgeManager.currentTime());
-        waitingTimeout.add(proc);
         continue;
       }
 

http://git-wip-us.apache.org/repos/asf/hbase/blob/08e44919/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/TestProcedureInMemoryChore.java
----------------------------------------------------------------------
diff --git a/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/TestProcedureInMemoryChore.java b/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/TestProcedureInMemoryChore.java
index 32e3e8c..8bc8fa8 100644
--- a/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/TestProcedureInMemoryChore.java
+++ b/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/TestProcedureInMemoryChore.java
@@ -76,15 +76,18 @@ public class TestProcedureInMemoryChore {
     CountDownLatch latch = new CountDownLatch(nCountDown);
     TestLatchChore chore = new TestLatchChore(timeoutMSec, latch);
     procExecutor.addChore(chore);
+    assertTrue(chore.isRunnable());
     latch.await();
 
     // remove the chore and verify it is no longer executed
+    assertTrue(chore.isRunnable());
     procExecutor.removeChore(chore);
     latch = new CountDownLatch(nCountDown);
     chore.setLatch(latch);
     latch.await(timeoutMSec * nCountDown, TimeUnit.MILLISECONDS);
     LOG.info("chore latch count=" + latch.getCount());
-    assertTrue(latch.getCount() > 0);
+    assertFalse(chore.isRunnable());
+    assertTrue("latchCount=" + latch.getCount(), latch.getCount() > 0);
   }
 
   public static class TestLatchChore extends ProcedureInMemoryChore<TestProcEnv> {