This is an automated email from the ASF dual-hosted git repository. yiguolei pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/doris.git
The following commit(s) were added to refs/heads/master by this push: new 5dbc7e1c0e [fix](fe) add fe isReady check before getMasterIp (#18417) 5dbc7e1c0e is described below commit 5dbc7e1c0e3cf6011638ce16765bf9955c028cf5 Author: xueweizhang <zxw520bl...@163.com> AuthorDate: Wed Apr 12 14:33:31 2023 +0800 [fix](fe) add fe isReady check before getMasterIp (#18417) when fe node is not ready, will get "" for master ip, and redirect will get error --------- Signed-off-by: nextdreamblue <zxw520bl...@163.com> --- .../doris/httpv2/meta/ColocateMetaService.java | 14 ++++---- .../apache/doris/httpv2/rest/CancelLoadAction.java | 3 +- .../doris/httpv2/rest/GetLoadInfoAction.java | 3 +- .../doris/httpv2/rest/GetStreamLoadState.java | 3 +- .../org/apache/doris/httpv2/rest/LoadAction.java | 2 +- .../org/apache/doris/httpv2/rest/MultiAction.java | 13 ++++--- .../doris/httpv2/rest/RestBaseController.java | 15 +++++++- .../org/apache/doris/httpv2/rest/ShowAction.java | 10 ++++-- .../doris/httpv2/rest/manager/NodeAction.java | 40 +++++++++++----------- .../doris/httpv2/restv2/StatisticAction.java | 9 +++-- .../org/apache/doris/load/loadv2/TokenManager.java | 5 ++- 11 files changed, 69 insertions(+), 48 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/ColocateMetaService.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/ColocateMetaService.java index 9d63a00501..be1b9fb3d2 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/ColocateMetaService.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/meta/ColocateMetaService.java @@ -84,9 +84,9 @@ public class ColocateMetaService extends RestBaseController { } public Object executeWithoutPassword(HttpServletRequest request, HttpServletResponse response) - throws DdlException { + throws Exception { executeCheckPassword(request, response); - RedirectView redirectView = redirectToMaster(request, response); + RedirectView redirectView = redirectToMasterOrException(request, response); if (redirectView != null) { return redirectView; } @@ -95,14 +95,14 @@ public class ColocateMetaService extends RestBaseController { } @RequestMapping(path = "/api/colocate", method = RequestMethod.GET) - public Object colocate(HttpServletRequest request, HttpServletResponse response) throws DdlException { + public Object colocate(HttpServletRequest request, HttpServletResponse response) throws Exception { executeWithoutPassword(request, response); return ResponseEntityBuilder.ok(Env.getCurrentColocateIndex()); } @RequestMapping(path = "/api/colocate/group_stable", method = {RequestMethod.POST, RequestMethod.DELETE}) public Object group_stable(HttpServletRequest request, HttpServletResponse response) - throws DdlException { + throws Exception { if (needRedirect(request.getScheme())) { return redirectToHttps(request); } @@ -121,7 +121,7 @@ public class ColocateMetaService extends RestBaseController { @RequestMapping(path = "/api/colocate/bucketseq", method = RequestMethod.POST) public Object bucketseq(HttpServletRequest request, HttpServletResponse response, @RequestBody String meta) - throws DdlException { + throws Exception { if (needRedirect(request.getScheme())) { return redirectToHttps(request); } @@ -165,7 +165,7 @@ public class ColocateMetaService extends RestBaseController { } private void updateBackendPerBucketSeq(GroupId groupId, List<List<Long>> backendsPerBucketSeq) - throws DdlException { - throw new DdlException("Currently not support"); + throws Exception { + throw new Exception("Currently not support"); } } diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/CancelLoadAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/CancelLoadAction.java index 5468bf812a..6a2a8fed1d 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/CancelLoadAction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/CancelLoadAction.java @@ -31,7 +31,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.view.RedirectView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -50,7 +49,7 @@ public class CancelLoadAction extends RestBaseController { } executeCheckPassword(request, response); - RedirectView redirectView = redirectToMaster(request, response); + Object redirectView = redirectToMaster(request, response); if (redirectView != null) { return redirectView; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetLoadInfoAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetLoadInfoAction.java index 3f29a96b44..40cf8be18e 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetLoadInfoAction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetLoadInfoAction.java @@ -30,7 +30,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.view.RedirectView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -77,7 +76,7 @@ public class GetLoadInfoAction extends RestBaseController { return new RestBaseResult("No cluster selected"); } - RedirectView redirectView = redirectToMaster(request, response); + Object redirectView = redirectToMaster(request, response); if (redirectView != null) { return redirectView; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetStreamLoadState.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetStreamLoadState.java index 4b195a9332..641c46668c 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetStreamLoadState.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/GetStreamLoadState.java @@ -27,7 +27,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.view.RedirectView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @@ -40,7 +39,7 @@ public class GetStreamLoadState extends RestBaseController { HttpServletRequest request, HttpServletResponse response) { executeCheckPassword(request, response); - RedirectView redirectView = redirectToMaster(request, response); + Object redirectView = redirectToMaster(request, response); if (redirectView != null) { return redirectView; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/LoadAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/LoadAction.java index df0f689953..7d2a110061 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/LoadAction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/LoadAction.java @@ -154,7 +154,7 @@ public class LoadAction extends RestBaseController { if (!isStreamLoad && !Strings.isNullOrEmpty(request.getParameter(SUB_LABEL_NAME_PARAM))) { // only multi mini load need to redirect to Master, because only Master has the info of table to // the Backend which the file exists. - RedirectView redirectView = redirectToMaster(request, response); + Object redirectView = redirectToMaster(request, response); if (redirectView != null) { return redirectView; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/MultiAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/MultiAction.java index b04005ae7c..c4a3eb0d99 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/MultiAction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/MultiAction.java @@ -31,7 +31,6 @@ import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; -import org.springframework.web.servlet.view.RedirectView; import java.util.List; import java.util.Map; @@ -69,7 +68,7 @@ public class MultiAction extends RestBaseController { checkDbAuth(ConnectContext.get().getCurrentUserIdentity(), fullDbName, PrivPredicate.LOAD); // only Master has these load info - RedirectView redirectView = redirectToMaster(request, response); + Object redirectView = redirectToMaster(request, response); if (redirectView != null) { return redirectView; } @@ -100,7 +99,7 @@ public class MultiAction extends RestBaseController { checkDbAuth(ConnectContext.get().getCurrentUserIdentity(), fullDbName, PrivPredicate.LOAD); // only Master has these load info - RedirectView redirectView = redirectToMaster(request, response); + Object redirectView = redirectToMaster(request, response); if (redirectView != null) { return redirectView; } @@ -136,7 +135,7 @@ public class MultiAction extends RestBaseController { // Multi start request must redirect to master, because all following sub requests will be handled // on Master - RedirectView redirectView = redirectToMaster(request, response); + Object redirectView = redirectToMaster(request, response); if (redirectView != null) { return redirectView; } @@ -187,7 +186,7 @@ public class MultiAction extends RestBaseController { String fullDbName = getFullDbName(dbName); checkDbAuth(ConnectContext.get().getCurrentUserIdentity(), fullDbName, PrivPredicate.LOAD); - RedirectView redirectView = redirectToMaster(request, response); + Object redirectView = redirectToMaster(request, response); if (redirectView != null) { return redirectView; } @@ -222,7 +221,7 @@ public class MultiAction extends RestBaseController { // only Master has these load info - RedirectView redirectView = redirectToMaster(request, response); + Object redirectView = redirectToMaster(request, response); if (redirectView != null) { return redirectView; } @@ -259,7 +258,7 @@ public class MultiAction extends RestBaseController { checkDbAuth(ConnectContext.get().getCurrentUserIdentity(), fullDbName, PrivPredicate.LOAD); // only Master has these load info - RedirectView redirectView = redirectToMaster(request, response); + Object redirectView = redirectToMaster(request, response); if (redirectView != null) { return redirectView; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/RestBaseController.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/RestBaseController.java index 2bbf914051..f8eccf567a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/RestBaseController.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/RestBaseController.java @@ -22,6 +22,7 @@ import org.apache.doris.catalog.Env; import org.apache.doris.cluster.ClusterNamespace; import org.apache.doris.common.Config; import org.apache.doris.httpv2.controller.BaseController; +import org.apache.doris.httpv2.entity.ResponseEntityBuilder; import org.apache.doris.httpv2.exception.UnauthorizedException; import org.apache.doris.qe.ConnectContext; import org.apache.doris.system.SystemInfoService; @@ -108,14 +109,26 @@ public class RestBaseController extends BaseController { return redirectView; } - public RedirectView redirectToMaster(HttpServletRequest request, HttpServletResponse response) { + public RedirectView redirectToMasterOrException(HttpServletRequest request, HttpServletResponse response) + throws Exception { Env env = Env.getCurrentEnv(); if (env.isMaster()) { return null; } + if (!env.isReady()) { + throw new Exception("Node catalog is not ready, please wait for a while."); + } return redirectTo(request, new TNetworkAddress(env.getMasterIp(), env.getMasterHttpPort())); } + public Object redirectToMaster(HttpServletRequest request, HttpServletResponse response) { + try { + return redirectToMasterOrException(request, response); + } catch (Exception e) { + return ResponseEntityBuilder.okWithCommonError(e.getMessage()); + } + } + public void getFile(HttpServletRequest request, HttpServletResponse response, Object obj, String fileName) throws IOException { response.setHeader("Content-type", "application/octet-stream"); diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java index ac9748c90e..efb3a0fe4a 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/ShowAction.java @@ -115,9 +115,13 @@ public class ShowAction extends RestBaseController { // forward to master if necessary if (!Env.getCurrentEnv().isMaster() && isForward) { - RedirectView redirectView = redirectToMaster(request, response); - Preconditions.checkNotNull(redirectView); - return redirectView; + try { + RedirectView redirectView = redirectToMasterOrException(request, response); + Preconditions.checkNotNull(redirectView); + return redirectView; + } catch (Exception e) { + return ResponseEntityBuilder.okWithCommonError(e.getMessage()); + } } else { ProcNodeInterface procNode = null; ProcService instance = ProcService.getInstance(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/manager/NodeAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/manager/NodeAction.java index dc87292a22..421f63cba9 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/manager/NodeAction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/rest/manager/NodeAction.java @@ -18,13 +18,11 @@ package org.apache.doris.httpv2.rest.manager; import org.apache.doris.catalog.Env; -import org.apache.doris.common.AnalysisException; import org.apache.doris.common.Config; import org.apache.doris.common.ConfigBase; import org.apache.doris.common.MarkedCountDownLatch; import org.apache.doris.common.Pair; import org.apache.doris.common.ThreadPoolManager; -import org.apache.doris.common.UserException; import org.apache.doris.common.proc.ProcResult; import org.apache.doris.common.proc.ProcService; import org.apache.doris.common.util.PropertyAnalyzer; @@ -107,7 +105,7 @@ public class NodeAction extends RestBaseController { // Returns all fe information, similar to 'show frontends'. @RequestMapping(path = "/frontends", method = RequestMethod.GET) - public Object frontends_info(HttpServletRequest request, HttpServletResponse response) throws AnalysisException { + public Object frontends_info(HttpServletRequest request, HttpServletResponse response) throws Exception { executeCheckPassword(request, response); checkGlobalAuth(ConnectContext.get().getCurrentUserIdentity(), PrivPredicate.ADMIN); @@ -116,7 +114,7 @@ public class NodeAction extends RestBaseController { // Returns all be information, similar to 'show backends'. @RequestMapping(path = "/backends", method = RequestMethod.GET) - public Object backends_info(HttpServletRequest request, HttpServletResponse response) throws AnalysisException { + public Object backends_info(HttpServletRequest request, HttpServletResponse response) throws Exception { executeCheckPassword(request, response); checkGlobalAuth(ConnectContext.get().getCurrentUserIdentity(), PrivPredicate.ADMIN); @@ -125,7 +123,7 @@ public class NodeAction extends RestBaseController { // Returns all broker information, similar to 'show broker'. @RequestMapping(path = "/brokers", method = RequestMethod.GET) - public Object brokers_info(HttpServletRequest request, HttpServletResponse response) throws AnalysisException { + public Object brokers_info(HttpServletRequest request, HttpServletResponse response) throws Exception { executeCheckPassword(request, response); checkGlobalAuth(ConnectContext.get().getCurrentUserIdentity(), PrivPredicate.ADMIN); @@ -143,12 +141,12 @@ public class NodeAction extends RestBaseController { // ] // } private Object fetchNodeInfo(HttpServletRequest request, HttpServletResponse response, String procPath) - throws AnalysisException { - if (!Env.getCurrentEnv().isMaster()) { - return redirectToMaster(request, response); - } - + throws Exception { try { + if (!Env.getCurrentEnv().isMaster()) { + return redirectToMasterOrException(request, response); + } + ProcResult procResult = ProcService.getInstance().open(procPath).fetchResult(); List<String> columnNames = Lists.newArrayList(procResult.getColumnNames()); return ResponseEntityBuilder.ok(new NodeInfo(columnNames, procResult.getRows())); @@ -597,10 +595,11 @@ public class NodeAction extends RestBaseController { @PostMapping("/{action}/be") public Object operateBackend(HttpServletRequest request, HttpServletResponse response, @PathVariable String action, @RequestBody BackendReqInfo reqInfo) { - if (!Env.getCurrentEnv().isMaster()) { - return redirectToMaster(request, response); - } try { + if (!Env.getCurrentEnv().isMaster()) { + return redirectToMasterOrException(request, response); + } + List<String> hostPorts = reqInfo.getHostPorts(); List<HostInfo> hostInfos = new ArrayList<>(); for (String hostPort : hostPorts) { @@ -631,8 +630,8 @@ public class NodeAction extends RestBaseController { }); }); } - } catch (UserException userException) { - return ResponseEntityBuilder.okWithCommonError(userException.getMessage()); + } catch (Exception e) { + return ResponseEntityBuilder.okWithCommonError(e.getMessage()); } return ResponseEntityBuilder.ok(); } @@ -640,10 +639,11 @@ public class NodeAction extends RestBaseController { @PostMapping("/{action}/fe") public Object operateFrontends(HttpServletRequest request, HttpServletResponse response, @PathVariable String action, @RequestBody FrontendReqInfo reqInfo) { - if (!Env.getCurrentEnv().isMaster()) { - return redirectToMaster(request, response); - } try { + if (!Env.getCurrentEnv().isMaster()) { + return redirectToMasterOrException(request, response); + } + String role = reqInfo.getRole(); Env currentEnv = Env.getCurrentEnv(); FrontendNodeType frontendNodeType; @@ -658,8 +658,8 @@ public class NodeAction extends RestBaseController { } else if ("DROP".equals(action)) { currentEnv.dropFrontend(frontendNodeType, info.getIp(), info.getHostName(), info.getPort()); } - } catch (UserException userException) { - return ResponseEntityBuilder.okWithCommonError(userException.getMessage()); + } catch (Exception e) { + return ResponseEntityBuilder.okWithCommonError(e.getMessage()); } return ResponseEntityBuilder.ok(); } diff --git a/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/StatisticAction.java b/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/StatisticAction.java index 368c870f31..623b651442 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/StatisticAction.java +++ b/fe/fe-core/src/main/java/org/apache/doris/httpv2/restv2/StatisticAction.java @@ -50,9 +50,14 @@ public class StatisticAction extends RestBaseController { executeCheckPassword(request, response); } - if (!Env.getCurrentEnv().isMaster()) { - return redirectToMaster(request, response); + try { + if (!Env.getCurrentEnv().isMaster()) { + return redirectToMasterOrException(request, response); + } + } catch (Exception e) { + return ResponseEntityBuilder.okWithCommonError(e.getMessage()); } + Map<String, Object> resultMap = Maps.newHashMap(); Env env = Env.getCurrentEnv(); SystemInfoService infoService = Env.getCurrentSystemInfo(); diff --git a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/TokenManager.java b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/TokenManager.java index cc50b5b902..a3ec62a7a1 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/TokenManager.java +++ b/fe/fe-core/src/main/java/org/apache/doris/load/loadv2/TokenManager.java @@ -117,7 +117,10 @@ public class TokenManager { } - private TNetworkAddress getMasterAddress() { + private TNetworkAddress getMasterAddress() throws TException { + if (!Env.getCurrentEnv().isReady()) { + throw new TException("Node catalog is not ready, please wait for a while."); + } String masterHost = Env.getCurrentEnv().getMasterIp(); int masterRpcPort = Env.getCurrentEnv().getMasterRpcPort(); return new TNetworkAddress(masterHost, masterRpcPort); --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org