You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by zh...@apache.org on 2018/10/18 06:42:51 UTC
hbase git commit: HBASE-21323 Should not skip force updating for a
sub procedure even if it has been finished
Repository: hbase
Updated Branches:
refs/heads/master 92fdc8dd5 -> 132bea9a1
HBASE-21323 Should not skip force updating for a sub procedure even if it has been finished
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/132bea9a
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/132bea9a
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/132bea9a
Branch: refs/heads/master
Commit: 132bea9a1c189f9ac6bb02c99902d5473a9a49bf
Parents: 92fdc8d
Author: zhangduo <zh...@apache.org>
Authored: Wed Oct 17 20:51:19 2018 +0800
Committer: Duo Zhang <zh...@apache.org>
Committed: Thu Oct 18 14:24:34 2018 +0800
----------------------------------------------------------------------
.../hbase/procedure2/ProcedureExecutor.java | 9 +++++-
.../store/wal/TestForceUpdateProcedure.java | 33 ++++++++++++++++++--
2 files changed, 39 insertions(+), 3 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/132bea9a/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 8a295f3..b5656b4 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
@@ -376,6 +376,11 @@ public class ProcedureExecutor<TEnvironment> {
this(conf, environment, store, new SimpleProcedureScheduler());
}
+ private boolean isRootFinished(Procedure<?> proc) {
+ Procedure<?> rootProc = procedures.get(proc.getRootProcId());
+ return rootProc == null || rootProc.isFinished();
+ }
+
private void forceUpdateProcedure(long procId) throws IOException {
IdLock.Entry lockEntry = procExecutionLock.getLockEntry(procId);
try {
@@ -384,7 +389,9 @@ public class ProcedureExecutor<TEnvironment> {
LOG.debug("No pending procedure with id = {}, skip force updating.", procId);
return;
}
- if (proc.isFinished()) {
+ // For a sub procedure which root parent has not been finished, we still need to retain the
+ // wal even if the procedure itself is finished.
+ if (proc.isFinished() && (!proc.hasParent() || isRootFinished(proc))) {
LOG.debug("Procedure {} has already been finished, skip force updating.", proc);
return;
}
http://git-wip-us.apache.org/repos/asf/hbase/blob/132bea9a/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.java
----------------------------------------------------------------------
diff --git a/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.java b/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.java
index 0d37b77..df6ee51 100644
--- a/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.java
+++ b/hbase-procedure/src/test/java/org/apache/hadoop/hbase/procedure2/store/wal/TestForceUpdateProcedure.java
@@ -123,7 +123,34 @@ public class TestForceUpdateProcedure {
@Override
protected Procedure<Void>[] execute(Void env)
throws ProcedureYieldException, ProcedureSuspendedException, InterruptedException {
- return new Procedure[] { new WaitingProcedure() };
+ return new Procedure[] { new DummyProcedure(), new WaitingProcedure() };
+ }
+
+ @Override
+ protected void rollback(Void env) throws IOException, InterruptedException {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ protected boolean abort(Void env) {
+ return false;
+ }
+
+ @Override
+ protected void serializeStateData(ProcedureStateSerializer serializer) throws IOException {
+ }
+
+ @Override
+ protected void deserializeStateData(ProcedureStateSerializer serializer) throws IOException {
+ }
+ }
+
+ public static final class DummyProcedure extends Procedure<Void> {
+
+ @Override
+ protected Procedure<Void>[] execute(Void env)
+ throws ProcedureYieldException, ProcedureSuspendedException, InterruptedException {
+ return null;
}
@Override
@@ -208,10 +235,12 @@ public class TestForceUpdateProcedure {
createStoreAndExecutor();
Map<Class<?>, Procedure<Void>> procMap = new HashMap<>();
EXEC.getActiveProceduresNoCopy().forEach(p -> procMap.put(p.getClass(), p));
- assertEquals(2, procMap.size());
+ assertEquals(3, procMap.size());
ParentProcedure parentProc = (ParentProcedure) procMap.get(ParentProcedure.class);
assertEquals(ProcedureState.WAITING, parentProc.getState());
WaitingProcedure waitingProc = (WaitingProcedure) procMap.get(WaitingProcedure.class);
assertEquals(ProcedureState.WAITING_TIMEOUT, waitingProc.getState());
+ DummyProcedure dummyProc = (DummyProcedure) procMap.get(DummyProcedure.class);
+ assertEquals(ProcedureState.SUCCESS, dummyProc.getState());
}
}