This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git


The following commit(s) were added to refs/heads/master by this push:
     new b1148650941 Splitting refresh table metadata and database metadata 
(#29482)
b1148650941 is described below

commit b11486509419e3c5fdfb8ac2fe65bb2c15e9bc48
Author: zhaojinchao <[email protected]>
AuthorDate: Thu Dec 21 12:41:30 2023 +0800

    Splitting refresh table metadata and database metadata (#29482)
---
 .../scenario/migration/api/MigrationJobAPI.java    |  2 +-
 .../mode/manager/ContextManager.java               | 47 +++++++++++++++++-----
 .../context/ConfigurationContextManager.java       |  1 -
 .../updatable/RefreshDatabaseMetaDataUpdater.java  |  2 +-
 .../ral/updatable/RefreshTableMetaDataUpdater.java |  2 +-
 5 files changed, 40 insertions(+), 14 deletions(-)

diff --git 
a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
 
b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
index bc451127cd8..49b68258bf9 100644
--- 
a/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
+++ 
b/kernel/data-pipeline/scenario/migration/src/main/java/org/apache/shardingsphere/data/pipeline/scenario/migration/api/MigrationJobAPI.java
@@ -289,7 +289,7 @@ public final class MigrationJobAPI implements 
TransmissionJobAPI {
         // TODO use origin database name now, wait reloadDatabaseMetaData fix 
case-sensitive probelm
         ContextManager contextManager = 
PipelineContextManager.getContext(PipelineJobIdUtils.parseContextKey(jobId)).getContextManager();
         ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
-        contextManager.reloadDatabaseMetaData(database.getName());
+        contextManager.refreshTableMetaData(database.getName());
     }
     
     @Override
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index dc19089292b..d706bfe2da6 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -108,36 +108,63 @@ public final class ContextManager implements 
AutoCloseable {
     }
     
     /**
-     * Reload database meta data from governance center.
+     * Reload database meta data.
+     *
+     * @param databaseName to be reloaded database name
+     * @param force whether to force refresh table metadata
+     */
+    public void refreshDatabaseMetaData(final String databaseName, final 
boolean force) {
+        try {
+            ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+            MetaDataContexts reloadedMetaDataContexts = 
createMetaDataContexts(databaseName);
+            if (force) {
+                metaDataContexts.set(reloadedMetaDataContexts);
+                
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas()
+                        .forEach((schemaName, schema) -> 
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().persist(database.getName(),
 schemaName, schema));
+            } else {
+                deletedSchemaNames(databaseName, 
reloadedMetaDataContexts.getMetaData().getDatabase(databaseName), database);
+                metaDataContexts.set(reloadedMetaDataContexts);
+                
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas()
+                        .forEach((schemaName, schema) -> 
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().compareAndPersist(database.getName(),
 schemaName, schema));
+            }
+        } catch (final SQLException ex) {
+            log.error("Refresh database meta data: {} failed", databaseName, 
ex);
+        }
+    }
+    
+    /**
+     * Reload table meta data.
      * 
      * @param databaseName to be reloaded database name
      */
-    public void reloadDatabaseMetaData(final String databaseName) {
+    public void refreshTableMetaData(final String databaseName) {
         try {
             ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
-            Map<String, DataSourcePoolProperties> 
dataSourcePoolPropsFromRegCenter = 
metaDataContexts.get().getPersistService().getDataSourceUnitService().load(databaseName);
-            SwitchingResource switchingResource = new 
ResourceSwitchManager().createByAlterDataSourcePoolProperties(database.getResourceMetaData(),
 dataSourcePoolPropsFromRegCenter);
-            
metaDataContexts.get().getMetaData().getDatabases().putAll(configurationContextManager.renewDatabase(database,
 switchingResource));
-            MetaDataContexts reloadedMetaDataContexts = 
createMetaDataContexts(databaseName, switchingResource);
+            MetaDataContexts reloadedMetaDataContexts = 
createMetaDataContexts(databaseName);
             deletedSchemaNames(databaseName, 
reloadedMetaDataContexts.getMetaData().getDatabase(databaseName), database);
             metaDataContexts.set(reloadedMetaDataContexts);
             
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas()
                     .forEach((schemaName, schema) -> 
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().compareAndPersist(database.getName(),
 schemaName, schema));
-            switchingResource.closeStaleDataSources();
         } catch (final SQLException ex) {
-            log.error("Reload database meta data: {} failed", databaseName, 
ex);
+            log.error("Refresh table meta data: {} failed", databaseName, ex);
         }
     }
     
-    private MetaDataContexts createMetaDataContexts(final String databaseName, 
final SwitchingResource switchingResource) throws SQLException {
+    private MetaDataContexts createMetaDataContexts(final String databaseName) 
throws SQLException {
+        ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+        Map<String, DataSourcePoolProperties> dataSourcePoolPropsFromRegCenter 
= 
metaDataContexts.get().getPersistService().getDataSourceUnitService().load(databaseName);
+        SwitchingResource switchingResource = new 
ResourceSwitchManager().createByAlterDataSourcePoolProperties(database.getResourceMetaData(),
 dataSourcePoolPropsFromRegCenter);
+        
metaDataContexts.get().getMetaData().getDatabases().putAll(configurationContextManager.renewDatabase(database,
 switchingResource));
         MetaDataBasedPersistService metaDataPersistService = 
metaDataContexts.get().getPersistService();
         Map<String, ShardingSphereDatabase> changedDatabases = 
configurationContextManager.createChangedDatabases(databaseName, false,
                 switchingResource, 
metaDataPersistService.getDatabaseRulePersistService().load(databaseName));
         ConfigurationProperties props = new 
ConfigurationProperties(metaDataPersistService.getPropsService().load());
         RuleMetaData changedGlobalMetaData = new RuleMetaData(
                 
GlobalRulesBuilder.buildRules(metaDataPersistService.getGlobalRuleService().load(),
 changedDatabases, props));
-        return new MetaDataContexts(metaDataContexts.get().getPersistService(),
+        MetaDataContexts result = new 
MetaDataContexts(metaDataContexts.get().getPersistService(),
                 new ShardingSphereMetaData(changedDatabases, 
metaDataContexts.get().getMetaData().getGlobalResourceMetaData(), 
changedGlobalMetaData, props));
+        switchingResource.closeStaleDataSources();
+        return result;
     }
     
     /**
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
index 7a625e1dede..80eb87750bf 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
@@ -349,7 +349,6 @@ public final class ConfigurationContextManager {
         ShardingSphereDatabase changedDatabase = 
createChangedDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(),
 internalLoadMetaData,
                 metaDataContexts.get().getPersistService(), 
toBeCreatedDatabaseConfig, metaDataContexts.get().getMetaData().getProps(), 
instanceContext);
         Map<String, ShardingSphereDatabase> result = new 
LinkedHashMap<>(metaDataContexts.get().getMetaData().getDatabases());
-        
changedDatabase.getSchemas().putAll(newShardingSphereSchemas(changedDatabase));
         result.put(databaseName.toLowerCase(), changedDatabase);
         return result;
     }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java
index d73f2bc6c4c..7a2bb8e7969 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java
@@ -34,7 +34,7 @@ public final class RefreshDatabaseMetaDataUpdater implements 
RALUpdater<RefreshD
     
     @Override
     public void executeUpdate(final String databaseName, final 
RefreshDatabaseMetaDataStatement sqlStatement) {
-        
ProxyContext.getInstance().getContextManager().reloadDatabaseMetaData(getDatabaseName(databaseName,
 sqlStatement));
+        
ProxyContext.getInstance().getContextManager().refreshDatabaseMetaData(getDatabaseName(databaseName,
 sqlStatement), true);
     }
     
     private String getDatabaseName(final String databaseName, final 
RefreshDatabaseMetaDataStatement sqlStatement) {
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdater.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdater.java
index 82c55c41fea..2277f245767 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdater.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdater.java
@@ -56,7 +56,7 @@ public final class RefreshTableMetaDataUpdater implements 
ConnectionSessionRequi
         if (sqlStatement.getTableName().isPresent()) {
             contextManager.reloadTable(databaseName, schemaName, 
sqlStatement.getTableName().get());
         } else {
-            contextManager.reloadDatabaseMetaData(databaseName);
+            contextManager.refreshTableMetaData(databaseName);
         }
     }
     

Reply via email to