[improvement](catalog) return the root cause of error when forwarding init request to master FE (#22001)
This commit is contained in:
@ -41,6 +41,8 @@ import java.io.File;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.PrintWriter;
|
||||
import java.io.StringWriter;
|
||||
import java.net.URL;
|
||||
import java.net.URLConnection;
|
||||
import java.util.ArrayList;
|
||||
@ -616,4 +618,20 @@ public class Util {
|
||||
}
|
||||
return rootCause;
|
||||
}
|
||||
|
||||
// Return the stack of the root cause
|
||||
public static String getRootCauseStack(Throwable t) {
|
||||
String rootStack = "unknown";
|
||||
if (t == null) {
|
||||
return rootStack;
|
||||
}
|
||||
Throwable p = t;
|
||||
while (p.getCause() != null) {
|
||||
p = p.getCause();
|
||||
}
|
||||
StringWriter sw = new StringWriter();
|
||||
PrintWriter pw = new PrintWriter(sw);
|
||||
p.printStackTrace(pw);
|
||||
return sw.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@ -19,6 +19,7 @@ package org.apache.doris.qe;
|
||||
|
||||
import org.apache.doris.catalog.Env;
|
||||
import org.apache.doris.common.ClientPool;
|
||||
import org.apache.doris.common.UserException;
|
||||
import org.apache.doris.thrift.FrontendService;
|
||||
import org.apache.doris.thrift.TInitExternalCtlMetaRequest;
|
||||
import org.apache.doris.thrift.TInitExternalCtlMetaResult;
|
||||
@ -35,6 +36,8 @@ import org.apache.logging.log4j.Logger;
|
||||
public class MasterCatalogExecutor {
|
||||
private static final Logger LOG = LogManager.getLogger(MasterCatalogExecutor.class);
|
||||
|
||||
public static final String STATUS_OK = "OK";
|
||||
|
||||
private int waitTimeoutMs;
|
||||
|
||||
public MasterCatalogExecutor(int waitTimeoutMs) {
|
||||
@ -64,6 +67,9 @@ public class MasterCatalogExecutor {
|
||||
try {
|
||||
TInitExternalCtlMetaResult result = client.initExternalCtlMeta(request);
|
||||
ConnectContext.get().getEnv().getJournalObservable().waitOn(result.maxJournalId, waitTimeoutMs);
|
||||
if (!result.getStatus().equalsIgnoreCase(STATUS_OK)) {
|
||||
throw new UserException(result.getStatus());
|
||||
}
|
||||
isReturnToPool = true;
|
||||
} catch (Exception e) {
|
||||
LOG.warn("Failed to finish forward init operation, please try again. ", e);
|
||||
|
||||
@ -57,6 +57,7 @@ import org.apache.doris.common.ThriftServerEventProcessor;
|
||||
import org.apache.doris.common.UserException;
|
||||
import org.apache.doris.common.Version;
|
||||
import org.apache.doris.common.annotation.LogException;
|
||||
import org.apache.doris.common.util.Util;
|
||||
import org.apache.doris.cooldown.CooldownDelete;
|
||||
import org.apache.doris.datasource.CatalogIf;
|
||||
import org.apache.doris.datasource.ExternalCatalog;
|
||||
@ -69,6 +70,7 @@ import org.apache.doris.planner.StreamLoadPlanner;
|
||||
import org.apache.doris.qe.ConnectContext;
|
||||
import org.apache.doris.qe.ConnectProcessor;
|
||||
import org.apache.doris.qe.DdlExecutor;
|
||||
import org.apache.doris.qe.MasterCatalogExecutor;
|
||||
import org.apache.doris.qe.QeProcessorImpl;
|
||||
import org.apache.doris.qe.QueryState;
|
||||
import org.apache.doris.qe.VariableMgr;
|
||||
@ -1987,10 +1989,15 @@ public class FrontendServiceImpl implements FrontendService.Iface {
|
||||
if (!(catalog instanceof ExternalCatalog)) {
|
||||
throw new TException("Only support forward ExternalCatalog init operation.");
|
||||
}
|
||||
((ExternalCatalog) catalog).makeSureInitialized();
|
||||
TInitExternalCtlMetaResult result = new TInitExternalCtlMetaResult();
|
||||
result.setMaxJournalId(Env.getCurrentEnv().getMaxJournalId());
|
||||
result.setStatus("OK");
|
||||
try {
|
||||
((ExternalCatalog) catalog).makeSureInitialized();
|
||||
result.setMaxJournalId(Env.getCurrentEnv().getMaxJournalId());
|
||||
result.setStatus(MasterCatalogExecutor.STATUS_OK);
|
||||
} catch (Throwable t) {
|
||||
LOG.warn("init catalog failed. catalog: {}", catalog.getName(), t);
|
||||
result.setStatus(Util.getRootCauseStack(t));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
@ -2006,10 +2013,16 @@ public class FrontendServiceImpl implements FrontendService.Iface {
|
||||
if (!(db instanceof ExternalDatabase)) {
|
||||
throw new TException("Only support forward ExternalDatabase init operation.");
|
||||
}
|
||||
((ExternalDatabase) db).makeSureInitialized();
|
||||
|
||||
TInitExternalCtlMetaResult result = new TInitExternalCtlMetaResult();
|
||||
result.setMaxJournalId(Env.getCurrentEnv().getMaxJournalId());
|
||||
result.setStatus("OK");
|
||||
try {
|
||||
((ExternalDatabase) db).makeSureInitialized();
|
||||
result.setMaxJournalId(Env.getCurrentEnv().getMaxJournalId());
|
||||
result.setStatus(MasterCatalogExecutor.STATUS_OK);
|
||||
} catch (Throwable t) {
|
||||
LOG.warn("init database failed. catalog.database: {}", catalog.getName(), db.getFullName(), t);
|
||||
result.setStatus(Util.getRootCauseStack(t));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
@ -17,6 +17,7 @@
|
||||
|
||||
package org.apache.doris.common.util;
|
||||
|
||||
import org.apache.doris.common.DdlException;
|
||||
import org.apache.doris.common.Pair;
|
||||
|
||||
import org.junit.Assert;
|
||||
@ -81,4 +82,19 @@ public class DebugUtilTest {
|
||||
Assert.assertEquals(result.first, Double.valueOf(1.1497809458523989));
|
||||
Assert.assertEquals(result.second, "GB");
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testUtilGetStackTrace() {
|
||||
Exception e1 = new Exception("exception1");
|
||||
DdlException e2 = new DdlException("exception2", e1);
|
||||
e2.printStackTrace();
|
||||
System.out.println(Util.getRootCauseStack(e2));
|
||||
Assert.assertTrue(Util.getRootCauseStack(e2).contains("java.lang.Exception: exception1"));
|
||||
|
||||
DdlException e3 = new DdlException("only one exception");
|
||||
System.out.println(Util.getRootCauseStack(e3));
|
||||
Assert.assertTrue(Util.getRootCauseStack(e3)
|
||||
.contains("org.apache.doris.common.DdlException: errCode = 2, detailMessage = only one exception"));
|
||||
Assert.assertEquals("unknown", Util.getRootCauseStack(null));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user