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

Reply via email to