[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 <zxw520blue1@163.com>
This commit is contained in:
xueweizhang
2023-04-12 14:33:31 +08:00
committed by GitHub
parent 34c946bb99
commit 5dbc7e1c0e
11 changed files with 69 additions and 48 deletions

View File

@ -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");
}
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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");

View File

@ -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();

View File

@ -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();
}

View File

@ -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();

View File

@ -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);