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 2017/12/25 04:03:50 UTC
hbase git commit: HBASE-19608 Race in
MasterRpcServices.getProcedureResult
Repository: hbase
Updated Branches:
refs/heads/master c24cf2d55 -> 27c56860d
HBASE-19608 Race in MasterRpcServices.getProcedureResult
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/27c56860
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/27c56860
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/27c56860
Branch: refs/heads/master
Commit: 27c56860da637fec0954c0fc4456f42e577da6af
Parents: c24cf2d
Author: zhangduo <zh...@apache.org>
Authored: Mon Dec 25 10:45:35 2017 +0800
Committer: zhangduo <zh...@apache.org>
Committed: Mon Dec 25 11:52:34 2017 +0800
----------------------------------------------------------------------
.../hadoop/hbase/master/MasterRpcServices.java | 44 +++++++++-----------
1 file changed, 19 insertions(+), 25 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/hbase/blob/27c56860/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
----------------------------------------------------------------------
diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
index f0f2e10..2e4b5e1 100644
--- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
+++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/MasterRpcServices.java
@@ -70,6 +70,7 @@ import org.apache.hadoop.hbase.procedure.MasterProcedureManager;
import org.apache.hadoop.hbase.procedure2.LockType;
import org.apache.hadoop.hbase.procedure2.LockedResource;
import org.apache.hadoop.hbase.procedure2.Procedure;
+import org.apache.hadoop.hbase.procedure2.ProcedureExecutor;
import org.apache.hadoop.hbase.procedure2.ProcedureUtil;
import org.apache.hadoop.hbase.protobuf.generated.AccessControlProtos.AccessControlService;
import org.apache.hadoop.hbase.protobuf.generated.VisibilityLabelsProtos.VisibilityLabelsService;
@@ -1153,35 +1154,28 @@ public class MasterRpcServices extends RSRpcServices
try {
master.checkInitialized();
GetProcedureResultResponse.Builder builder = GetProcedureResultResponse.newBuilder();
-
- Procedure<?> result = master.getMasterProcedureExecutor()
- .getResultOrProcedure(request.getProcId());
- if (result == null) {
- builder.setState(GetProcedureResultResponse.State.NOT_FOUND);
- } else {
- boolean remove = false;
-
- if (result.isFinished() || result.isFailed()) {
- builder.setState(GetProcedureResultResponse.State.FINISHED);
- remove = true;
- } else {
- builder.setState(GetProcedureResultResponse.State.RUNNING);
- }
-
+ long procId = request.getProcId();
+ ProcedureExecutor<?> executor = master.getMasterProcedureExecutor();
+ Procedure<?> result = executor.getResultOrProcedure(procId);
+ if (result != null) {
builder.setSubmittedTime(result.getSubmittedTime());
builder.setLastUpdate(result.getLastUpdate());
- if (result.isFailed()) {
- IOException exception = result.getException().unwrapRemoteIOException();
- builder.setException(ForeignExceptionUtil.toProtoForeignException(exception));
- }
- byte[] resultData = result.getResult();
- if (resultData != null) {
- builder.setResult(UnsafeByteOperations.unsafeWrap(resultData));
- }
-
- if (remove) {
+ if (executor.isFinished(procId)) {
+ builder.setState(GetProcedureResultResponse.State.FINISHED);
+ if (result.isFailed()) {
+ IOException exception = result.getException().unwrapRemoteIOException();
+ builder.setException(ForeignExceptionUtil.toProtoForeignException(exception));
+ }
+ byte[] resultData = result.getResult();
+ if (resultData != null) {
+ builder.setResult(UnsafeByteOperations.unsafeWrap(resultData));
+ }
master.getMasterProcedureExecutor().removeResult(request.getProcId());
+ } else {
+ builder.setState(GetProcedureResultResponse.State.RUNNING);
}
+ } else {
+ builder.setState(GetProcedureResultResponse.State.NOT_FOUND);
}
return builder.build();
} catch (IOException e) {