From ff7a04093e50eda8c031a65ff610683fff7401d2 Mon Sep 17 00:00:00 2001 From: Mingyu Chen Date: Mon, 15 Jul 2024 15:56:01 +0800 Subject: [PATCH] [fix](fe) fix several blocking bugs #37756 (#37757) bp #37756 --- .../org/apache/doris/analysis/FunctionCallExpr.java | 1 - .../apache/doris/datasource/ExternalCatalog.java | 5 +++++ .../org/apache/doris/qe/MasterCatalogExecutor.java | 13 +++++++++++-- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java index a3ad5ef7e9b1ac..b61c49c0104584 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java +++ b/fe/fe-core/src/main/java/org/apache/doris/analysis/FunctionCallExpr.java @@ -2444,7 +2444,6 @@ public int hashCode() { int result = super.hashCode(); result = 31 * result + Objects.hashCode(opcode); result = 31 * result + Objects.hashCode(fnName); - result = 31 * result + Objects.hashCode(fnParams); return result; } diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java index f9253aa03f6cc3..35434a43cb3ef8 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/ExternalCatalog.java @@ -598,6 +598,11 @@ public void replayInitCatalog(InitCatalogLog log) { // Should not return null. // Because replyInitCatalog can only be called when `use_meta_cache` is false. // And if `use_meta_cache` is false, getDbForReplay() will not return null + if (!db.isPresent()) { + LOG.warn("met invalid db id {} in replayInitCatalog, catalog: {}, ignore it to skip bug.", + log.getRefreshDbIds().get(i), name); + continue; + } Preconditions.checkNotNull(db.get()); tmpDbNameToId.put(db.get().getFullName(), db.get().getId()); tmpIdToDb.put(db.get().getId(), db.get()); diff --git a/fe/fe-core/src/main/java/org/apache/doris/qe/MasterCatalogExecutor.java b/fe/fe-core/src/main/java/org/apache/doris/qe/MasterCatalogExecutor.java index bb0f5a88e14fdc..0fd074451087e3 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/qe/MasterCatalogExecutor.java +++ b/fe/fe-core/src/main/java/org/apache/doris/qe/MasterCatalogExecutor.java @@ -64,11 +64,20 @@ public void forward(long catalogId, long dbId) throws Exception { boolean isReturnToPool = false; try { TInitExternalCtlMetaResult result = client.initExternalCtlMeta(request); - Env.getCurrentEnv().getJournalObservable().waitOn(result.maxJournalId, waitTimeoutMs); if (!result.getStatus().equalsIgnoreCase(STATUS_OK)) { throw new UserException(result.getStatus()); + } else { + // DO NOT wait on journal replayed, this may cause deadlock. + // 1. hold table read lock + // 2. wait on journal replayed + // 3. previous journal (eg, txn journal) replayed need to hold table write lock + // 4. deadlock + // But no waiting on journal replayed may cause some request on non-master FE failed for some time. + // There is no good solution for this. + // In feature version, this whole process is refactored, so we temporarily remove this waiting. + // Env.getCurrentEnv().getJournalObservable().waitOn(result.maxJournalId, timeoutMs); + isReturnToPool = true; } - isReturnToPool = true; } catch (Exception e) { LOG.warn("Failed to finish forward init operation, please try again. ", e); throw e;