From 79dd031a704ac9625a360d9f5becc2cee0a68dbc Mon Sep 17 00:00:00 2001 From: zhangduo Date: Sun, 24 Dec 2017 20:17:26 +0800 Subject: [PATCH] HBASE-19608 Race in MasterRpcServices.getProcedureResult --- .../hadoop/hbase/master/MasterRpcServices.java | 43 ++++++++++------------ 1 file changed, 20 insertions(+), 23 deletions(-) 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..b689c2a 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; @@ -1154,34 +1155,30 @@ public class MasterRpcServices extends RSRpcServices 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 = master.getMasterProcedureExecutor() + .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.RUNNING); } return builder.build(); } catch (IOException e) { -- 2.7.4