morningman commented on code in PR #33971: URL: https://github.com/apache/doris/pull/33971#discussion_r1576022820
########## fe/fe-core/src/main/java/org/apache/doris/datasource/mapping/IdentifierMapping.java: ########## @@ -179,51 +182,58 @@ public List<Column> setColumnNameMapping(String remoteDbName, String remoteTable } public String getRemoteDatabaseName(String localDbName) { - if (localDBToRemoteDB.isEmpty() || !localDBToRemoteDB.containsKey(localDbName)) { - loadDatabaseNamesIfNeeded(); - } - return localDBToRemoteDB.get(localDbName); + return getRequiredMapping(localDBToRemoteDB, localDbName, "database", this::loadDatabaseNamesIfNeeded, + localDbName); } public String getRemoteTableName(String localDbName, String localTableName) { String remoteDbName = getRemoteDatabaseName(localDbName); - if (localTableToRemoteTable.isEmpty() - || !localTableToRemoteTable.containsKey(remoteDbName) - || localTableToRemoteTable.get(remoteDbName) == null - || localTableToRemoteTable.get(remoteDbName).isEmpty() - || !localTableToRemoteTable.get(remoteDbName).containsKey(localTableName) - || localTableToRemoteTable.get(remoteDbName).get(localTableName) == null) { - loadTableNamesIfNeeded(localDbName); - } - - return localTableToRemoteTable.get(remoteDbName).get(localTableName); + Map<String, String> tableMap = localTableToRemoteTable.computeIfAbsent(remoteDbName, + k -> new ConcurrentHashMap<>()); + return getRequiredMapping(tableMap, localTableName, "table", () -> loadTableNamesIfNeeded(localDbName), + localTableName); } public Map<String, String> getRemoteColumnNames(String localDbName, String localTableName) { String remoteDbName = getRemoteDatabaseName(localDbName); String remoteTableName = getRemoteTableName(localDbName, localTableName); - if (localColumnToRemoteColumn.isEmpty() - || !localColumnToRemoteColumn.containsKey(remoteDbName) - || localColumnToRemoteColumn.get(remoteDbName) == null - || localColumnToRemoteColumn.get(remoteDbName).isEmpty() - || !localColumnToRemoteColumn.get(remoteDbName).containsKey(remoteTableName) - || localColumnToRemoteColumn.get(remoteDbName).get(remoteTableName) == null - || localColumnToRemoteColumn.get(remoteDbName).get(remoteTableName).isEmpty()) { + ConcurrentHashMap<String, ConcurrentHashMap<String, String>> tableColumnMap + = localColumnToRemoteColumn.computeIfAbsent(remoteDbName, k -> new ConcurrentHashMap<>()); + Map<String, String> columnMap = tableColumnMap.computeIfAbsent(remoteTableName, k -> new ConcurrentHashMap<>()); + if (columnMap.isEmpty()) { + LOG.info("Column name mapping missing, loading column names for localDbName: {}, localTableName: {}", + localDbName, localTableName); loadColumnNamesIfNeeded(localDbName, localTableName); } - return localColumnToRemoteColumn.get(remoteDbName).get(remoteTableName); + if (columnMap.isEmpty()) { + LOG.error("No remote column found for localTableName: {}. Please refresh this catalog.", localTableName); Review Comment: ```suggestion LOG.warn("No remote column found for localTableName: {}. Please refresh this catalog.", localTableName); ``` ########## fe/fe-core/src/main/java/org/apache/doris/datasource/mapping/IdentifierMapping.java: ########## @@ -179,51 +182,58 @@ public List<Column> setColumnNameMapping(String remoteDbName, String remoteTable } public String getRemoteDatabaseName(String localDbName) { - if (localDBToRemoteDB.isEmpty() || !localDBToRemoteDB.containsKey(localDbName)) { - loadDatabaseNamesIfNeeded(); - } - return localDBToRemoteDB.get(localDbName); + return getRequiredMapping(localDBToRemoteDB, localDbName, "database", this::loadDatabaseNamesIfNeeded, + localDbName); } public String getRemoteTableName(String localDbName, String localTableName) { String remoteDbName = getRemoteDatabaseName(localDbName); - if (localTableToRemoteTable.isEmpty() - || !localTableToRemoteTable.containsKey(remoteDbName) - || localTableToRemoteTable.get(remoteDbName) == null - || localTableToRemoteTable.get(remoteDbName).isEmpty() - || !localTableToRemoteTable.get(remoteDbName).containsKey(localTableName) - || localTableToRemoteTable.get(remoteDbName).get(localTableName) == null) { - loadTableNamesIfNeeded(localDbName); - } - - return localTableToRemoteTable.get(remoteDbName).get(localTableName); + Map<String, String> tableMap = localTableToRemoteTable.computeIfAbsent(remoteDbName, + k -> new ConcurrentHashMap<>()); + return getRequiredMapping(tableMap, localTableName, "table", () -> loadTableNamesIfNeeded(localDbName), + localTableName); } public Map<String, String> getRemoteColumnNames(String localDbName, String localTableName) { String remoteDbName = getRemoteDatabaseName(localDbName); String remoteTableName = getRemoteTableName(localDbName, localTableName); - if (localColumnToRemoteColumn.isEmpty() - || !localColumnToRemoteColumn.containsKey(remoteDbName) - || localColumnToRemoteColumn.get(remoteDbName) == null - || localColumnToRemoteColumn.get(remoteDbName).isEmpty() - || !localColumnToRemoteColumn.get(remoteDbName).containsKey(remoteTableName) - || localColumnToRemoteColumn.get(remoteDbName).get(remoteTableName) == null - || localColumnToRemoteColumn.get(remoteDbName).get(remoteTableName).isEmpty()) { + ConcurrentHashMap<String, ConcurrentHashMap<String, String>> tableColumnMap + = localColumnToRemoteColumn.computeIfAbsent(remoteDbName, k -> new ConcurrentHashMap<>()); + Map<String, String> columnMap = tableColumnMap.computeIfAbsent(remoteTableName, k -> new ConcurrentHashMap<>()); + if (columnMap.isEmpty()) { + LOG.info("Column name mapping missing, loading column names for localDbName: {}, localTableName: {}", + localDbName, localTableName); loadColumnNamesIfNeeded(localDbName, localTableName); } - return localColumnToRemoteColumn.get(remoteDbName).get(remoteTableName); + if (columnMap.isEmpty()) { Review Comment: Even if you run `loadColumnNamesIfNeeded()`, the `columnMap` is still empty ########## fe/fe-core/src/main/java/org/apache/doris/datasource/mapping/IdentifierMapping.java: ########## @@ -179,51 +182,58 @@ public List<Column> setColumnNameMapping(String remoteDbName, String remoteTable } public String getRemoteDatabaseName(String localDbName) { - if (localDBToRemoteDB.isEmpty() || !localDBToRemoteDB.containsKey(localDbName)) { - loadDatabaseNamesIfNeeded(); - } - return localDBToRemoteDB.get(localDbName); + return getRequiredMapping(localDBToRemoteDB, localDbName, "database", this::loadDatabaseNamesIfNeeded, + localDbName); } public String getRemoteTableName(String localDbName, String localTableName) { String remoteDbName = getRemoteDatabaseName(localDbName); - if (localTableToRemoteTable.isEmpty() - || !localTableToRemoteTable.containsKey(remoteDbName) - || localTableToRemoteTable.get(remoteDbName) == null - || localTableToRemoteTable.get(remoteDbName).isEmpty() - || !localTableToRemoteTable.get(remoteDbName).containsKey(localTableName) - || localTableToRemoteTable.get(remoteDbName).get(localTableName) == null) { - loadTableNamesIfNeeded(localDbName); - } - - return localTableToRemoteTable.get(remoteDbName).get(localTableName); + Map<String, String> tableMap = localTableToRemoteTable.computeIfAbsent(remoteDbName, + k -> new ConcurrentHashMap<>()); + return getRequiredMapping(tableMap, localTableName, "table", () -> loadTableNamesIfNeeded(localDbName), + localTableName); } public Map<String, String> getRemoteColumnNames(String localDbName, String localTableName) { String remoteDbName = getRemoteDatabaseName(localDbName); String remoteTableName = getRemoteTableName(localDbName, localTableName); - if (localColumnToRemoteColumn.isEmpty() - || !localColumnToRemoteColumn.containsKey(remoteDbName) - || localColumnToRemoteColumn.get(remoteDbName) == null - || localColumnToRemoteColumn.get(remoteDbName).isEmpty() - || !localColumnToRemoteColumn.get(remoteDbName).containsKey(remoteTableName) - || localColumnToRemoteColumn.get(remoteDbName).get(remoteTableName) == null - || localColumnToRemoteColumn.get(remoteDbName).get(remoteTableName).isEmpty()) { + ConcurrentHashMap<String, ConcurrentHashMap<String, String>> tableColumnMap + = localColumnToRemoteColumn.computeIfAbsent(remoteDbName, k -> new ConcurrentHashMap<>()); + Map<String, String> columnMap = tableColumnMap.computeIfAbsent(remoteTableName, k -> new ConcurrentHashMap<>()); + if (columnMap.isEmpty()) { + LOG.info("Column name mapping missing, loading column names for localDbName: {}, localTableName: {}", + localDbName, localTableName); loadColumnNamesIfNeeded(localDbName, localTableName); } - return localColumnToRemoteColumn.get(remoteDbName).get(remoteTableName); + if (columnMap.isEmpty()) { + LOG.error("No remote column found for localTableName: {}. Please refresh this catalog.", localTableName); + throw new RuntimeException( + "No remote column found for localTableName: " + localTableName + ". Please refresh this catalog."); + } + return columnMap; } + private void loadDatabaseNamesIfNeeded() { if (dbNamesLoaded.compareAndSet(false, true)) { - loadDatabaseNames(); + try { + loadDatabaseNames(); + } catch (Exception e) { + dbNamesLoaded.set(false); // Reset on failure + LOG.error("Error loading database names", e); Review Comment: ```suggestion LOG.warn("Error loading database names", e); ``` -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For queries about this service, please contact Infrastructure at: us...@infra.apache.org --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@doris.apache.org For additional commands, e-mail: commits-h...@doris.apache.org