From de8fa2cff596256dee21bc0755e7155b74ab91c9 Mon Sep 17 00:00:00 2001 From: Jack Drogon Date: Sat, 2 Sep 2023 14:05:31 +0800 Subject: [PATCH] [Fix](thrift) Add fe master check in some thrift calls (#23757) Signed-off-by: Jack Drogon --- .../doris/service/FrontendServiceImpl.java | 45 +++++++++++++++++++ gensrc/thrift/Status.thrift | 2 + 2 files changed, 47 insertions(+) diff --git a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java index 6e6e3df5be..af7a04b45f 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java +++ b/fe/fe-core/src/main/java/org/apache/doris/service/FrontendServiceImpl.java @@ -232,6 +232,9 @@ import java.util.stream.Collectors; // thrift protocol public class FrontendServiceImpl implements FrontendService.Iface { private static final Logger LOG = LogManager.getLogger(FrontendServiceImpl.class); + + private static final String NOT_MASTER_ERR_MSG = "FE is not master"; + private MasterImpl masterImpl; private ExecuteEnv exeEnv; // key is txn id,value is index of plan fragment instance, it's used by multi table request plan @@ -1185,6 +1188,14 @@ public class FrontendServiceImpl implements FrontendService.Iface { TBeginTxnResult result = new TBeginTxnResult(); TStatus status = new TStatus(TStatusCode.OK); result.setStatus(status); + + if (!Env.getCurrentEnv().isMaster()) { + status.setStatusCode(TStatusCode.NOT_MASTER); + status.addToErrorMsgs(NOT_MASTER_ERR_MSG); + LOG.error("failed to get binlog: {}", NOT_MASTER_ERR_MSG); + return result; + } + try { TBeginTxnResult tmpRes = beginTxnImpl(request, clientAddr); result.setTxnId(tmpRes.getTxnId()).setDbId(tmpRes.getDbId()); @@ -1532,6 +1543,14 @@ public class FrontendServiceImpl implements FrontendService.Iface { TCommitTxnResult result = new TCommitTxnResult(); TStatus status = new TStatus(TStatusCode.OK); result.setStatus(status); + + if (!Env.getCurrentEnv().isMaster()) { + status.setStatusCode(TStatusCode.NOT_MASTER); + status.addToErrorMsgs(NOT_MASTER_ERR_MSG); + LOG.error("failed to get binlog: {}", NOT_MASTER_ERR_MSG); + return result; + } + try { if (!commitTxnImpl(request)) { // committed success but not visible @@ -1705,6 +1724,14 @@ public class FrontendServiceImpl implements FrontendService.Iface { TRollbackTxnResult result = new TRollbackTxnResult(); TStatus status = new TStatus(TStatusCode.OK); result.setStatus(status); + + if (!Env.getCurrentEnv().isMaster()) { + status.setStatusCode(TStatusCode.NOT_MASTER); + status.addToErrorMsgs(NOT_MASTER_ERR_MSG); + LOG.error("failed to get binlog: {}", NOT_MASTER_ERR_MSG); + return result; + } + try { rollbackTxnImpl(request); } catch (UserException e) { @@ -2680,6 +2707,14 @@ public class FrontendServiceImpl implements FrontendService.Iface { TGetSnapshotResult result = new TGetSnapshotResult(); TStatus status = new TStatus(TStatusCode.OK); result.setStatus(status); + + if (!Env.getCurrentEnv().isMaster()) { + status.setStatusCode(TStatusCode.NOT_MASTER); + status.addToErrorMsgs(NOT_MASTER_ERR_MSG); + LOG.error("failed to get binlog: {}", NOT_MASTER_ERR_MSG); + return result; + } + try { result = getSnapshotImpl(request, clientAddr); } catch (UserException e) { @@ -2758,6 +2793,14 @@ public class FrontendServiceImpl implements FrontendService.Iface { TRestoreSnapshotResult result = new TRestoreSnapshotResult(); TStatus status = new TStatus(TStatusCode.OK); result.setStatus(status); + + if (!Env.getCurrentEnv().isMaster()) { + status.setStatusCode(TStatusCode.NOT_MASTER); + status.addToErrorMsgs(NOT_MASTER_ERR_MSG); + LOG.error("failed to get binlog: {}", NOT_MASTER_ERR_MSG); + return result; + } + try { result = restoreSnapshotImpl(request, clientAddr); } catch (UserException e) { @@ -2858,6 +2901,7 @@ public class FrontendServiceImpl implements FrontendService.Iface { TGetMasterTokenResult result = new TGetMasterTokenResult(); TStatus status = new TStatus(TStatusCode.OK); result.setStatus(status); + try { checkPassword(request.getCluster(), request.getUser(), request.getPassword(), clientAddr); result.setToken(Env.getCurrentEnv().getToken()); @@ -2882,6 +2926,7 @@ public class FrontendServiceImpl implements FrontendService.Iface { TGetBinlogLagResult result = new TGetBinlogLagResult(); TStatus status = new TStatus(TStatusCode.OK); result.setStatus(status); + try { result = getBinlogLagImpl(request, clientAddr); } catch (UserException e) { diff --git a/gensrc/thrift/Status.thrift b/gensrc/thrift/Status.thrift index 16dfd6d662..7b12d3b060 100644 --- a/gensrc/thrift/Status.thrift +++ b/gensrc/thrift/Status.thrift @@ -99,6 +99,8 @@ enum TStatusCode { HTTP_ERROR = 71, TABLET_MISSING = 72, + + NOT_MASTER = 73, } struct TStatus {