From 00bb099fdd8f5fec193aedf8f8ae8ad45453c518 Mon Sep 17 00:00:00 2001 From: zy-kkk Date: Tue, 26 Dec 2023 14:11:14 +0800 Subject: [PATCH] [hotfix](jdbc catalog) fix load table and column names npe (#28865) This fix is for the npe situation that occurs when FE of non-Master nodes initializes Jdbc Catalog metadata. --- .../doris/datasource/jdbc/client/JdbcClient.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcClient.java b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcClient.java index 29f361df1c..8d91791c33 100644 --- a/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcClient.java +++ b/fe/fe-core/src/main/java/org/apache/doris/datasource/jdbc/client/JdbcClient.java @@ -74,8 +74,9 @@ public abstract class JdbcClient { lowerColumnToRealColumn = new ConcurrentHashMap<>(); private final AtomicBoolean dbNamesLoaded = new AtomicBoolean(false); - private final AtomicBoolean tableNamesLoaded = new AtomicBoolean(false); - private final AtomicBoolean columnNamesLoaded = new AtomicBoolean(false); + private final ConcurrentHashMap tableNamesLoadedMap = new ConcurrentHashMap<>(); + private final ConcurrentHashMap> columnNamesLoadedMap + = new ConcurrentHashMap<>(); public static JdbcClient createJdbcClient(JdbcClientConfig jdbcClientConfig) { String dbType = parseDbType(jdbcClientConfig.getJdbcUrl()); @@ -404,13 +405,18 @@ public abstract class JdbcClient { } private void loadTableNamesIfNeeded(String dbName) { - if (tableNamesLoaded.compareAndSet(false, true)) { + AtomicBoolean isLoaded = tableNamesLoadedMap.computeIfAbsent(dbName, k -> new AtomicBoolean(false)); + if (isLoaded.compareAndSet(false, true)) { getTablesNameList(dbName); } } private void loadColumnNamesIfNeeded(String dbName, String tableName) { - if (columnNamesLoaded.compareAndSet(false, true)) { + ConcurrentHashMap tableMap = columnNamesLoadedMap.computeIfAbsent(dbName, + k -> new ConcurrentHashMap<>()); + AtomicBoolean isLoaded = tableMap.computeIfAbsent(tableName, k -> new AtomicBoolean(false)); + + if (isLoaded.compareAndSet(false, true)) { getJdbcColumnsInfo(dbName, tableName); } } @@ -469,6 +475,7 @@ public abstract class JdbcClient { /** * Execute stmt direct via jdbc + * * @param origStmt, the raw stmt string */ public void executeStmt(String origStmt) {