You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/12/21 04:41:36 UTC

(shardingsphere) branch master updated: Splitting refresh table metadata and database metadata (#29482)

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 <zh...@apache.org>
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);
         }
     }