[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:
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
@ -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");
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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();
|
||||
}
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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);
|
||||
|
||||
Reference in New Issue
Block a user