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

zhangliang 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 ba0d5f78282 Refactor ContextManager.reloadDatabase() (#34541)
ba0d5f78282 is described below

commit ba0d5f782820a94bc78bc528bdd77f3f57e92fd0
Author: Liang Zhang <zhangli...@apache.org>
AuthorDate: Fri Jan 31 14:06:41 2025 +0800

    Refactor ContextManager.reloadDatabase() (#34541)
    
    * Refactor MetaDataContextManager.dropSchemas()
    
    * Rename MetaDataContextManager.reloadDatabase()
    
    * Refactor ContextManager.reloadDatabase()
    
    * Refactor ContextManager.reloadDatabase()
    
    * Refactor ContextManager.reloadDatabase()
---
 .../scenario/migration/api/MigrationJobAPI.java    |  2 +-
 .../mode/manager/ContextManager.java               | 50 ++++++++++++++++++++
 .../mode/metadata/MetaDataContextManager.java      | 55 +---------------------
 .../updatable/RefreshDatabaseMetaDataExecutor.java |  2 +-
 .../updatable/RefreshTableMetaDataExecutor.java    |  2 +-
 5 files changed, 54 insertions(+), 57 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 1ee0188010d..1e7f64c5909 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
@@ -305,7 +305,7 @@ public final class MigrationJobAPI implements 
TransmissionJobAPI {
         // TODO use origin database name for now. It can be reduce metadata 
refresh scope after reloadDatabaseMetaData case-sensitive problem fixed.
         ContextManager contextManager = 
PipelineContextManager.getContext(PipelineJobIdUtils.parseContextKey(jobId)).getContextManager();
         ShardingSphereDatabase database = 
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
-        
contextManager.getMetaDataContextManager().refreshDatabaseMetaData(database);
+        contextManager.reloadDatabase(database);
     }
     
     @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 636ea12d7d1..d39619303da 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
@@ -19,7 +19,10 @@ package org.apache.shardingsphere.mode.manager;
 
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import 
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.NoDatabaseSelectedException;
 import 
org.apache.shardingsphere.infra.exception.dialect.exception.syntax.database.UnknownDatabaseException;
@@ -29,18 +32,25 @@ import 
org.apache.shardingsphere.infra.instance.metadata.InstanceType;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import 
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
+import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilder;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.builder.GenericSchemaBuilderMaterial;
+import 
org.apache.shardingsphere.infra.metadata.database.schema.manager.GenericSchemaManager;
 import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
+import 
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsFactory;
+import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
 import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import 
org.apache.shardingsphere.mode.manager.listener.ContextManagerLifecycleListener;
 import org.apache.shardingsphere.mode.metadata.MetaDataContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource;
 import org.apache.shardingsphere.mode.persist.PersistServiceFacade;
 import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
 import org.apache.shardingsphere.mode.state.cluster.ClusterStateContext;
 
 import java.sql.SQLException;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Map;
 
@@ -98,6 +108,46 @@ public final class ContextManager implements AutoCloseable {
         return 
getDatabase(databaseName).getResourceMetaData().getStorageUnits();
     }
     
+    /**
+     * Reload database.
+     *
+     * @param database to be reloaded database
+     */
+    public void reloadDatabase(final ShardingSphereDatabase database) {
+        try {
+            MetaDataContexts reloadedMetaDataContexts = 
createMetaDataContexts(database);
+            dropSchemas(database.getName(), 
reloadedMetaDataContexts.getMetaData().getDatabase(database.getName()), 
database);
+            metaDataContexts.update(reloadedMetaDataContexts);
+            
metaDataContexts.getMetaData().getDatabase(database.getName()).getAllSchemas()
+                    .forEach(each -> 
persistServiceFacade.getMetaDataPersistFacade().getDatabaseMetaDataFacade().getSchema().alterByRefresh(database.getName(),
 each));
+        } catch (final SQLException ex) {
+            log.error("Refresh database meta data: {} failed", 
database.getName(), ex);
+        }
+    }
+    
+    private MetaDataContexts createMetaDataContexts(final 
ShardingSphereDatabase database) throws SQLException {
+        Map<String, DataSourcePoolProperties> dataSourcePoolProps = 
persistServiceFacade.getMetaDataPersistFacade().getDataSourceUnitService().load(database.getName());
+        SwitchingResource switchingResource = 
metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(database.getResourceMetaData(),
 dataSourcePoolProps);
+        Collection<RuleConfiguration> ruleConfigs = 
persistServiceFacade.getMetaDataPersistFacade().getDatabaseRuleService().load(database.getName());
+        ShardingSphereDatabase changedDatabase = new 
MetaDataContextsFactory(persistServiceFacade.getMetaDataPersistFacade(), 
computeNodeInstanceContext)
+                .createChangedDatabase(database.getName(), false, 
switchingResource, ruleConfigs, metaDataContexts);
+        metaDataContexts.getMetaData().putDatabase(changedDatabase);
+        ConfigurationProperties props = new 
ConfigurationProperties(persistServiceFacade.getMetaDataPersistFacade().getPropsService().load());
+        Collection<RuleConfiguration> globalRuleConfigs = 
persistServiceFacade.getMetaDataPersistFacade().getGlobalRuleService().load();
+        RuleMetaData changedGlobalMetaData = new 
RuleMetaData(GlobalRulesBuilder.buildRules(globalRuleConfigs, 
metaDataContexts.getMetaData().getAllDatabases(), props));
+        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
+                metaDataContexts.getMetaData().getAllDatabases(), 
metaDataContexts.getMetaData().getGlobalResourceMetaData(), 
changedGlobalMetaData, props);
+        MetaDataContexts result =
+                new MetaDataContexts(metaData, 
ShardingSphereStatisticsFactory.create(metaData, 
persistServiceFacade.getMetaDataPersistFacade().getStatisticsService().load(metaData)));
+        switchingResource.closeStaleDataSources();
+        return result;
+    }
+    
+    private void dropSchemas(final String databaseName, final 
ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase 
currentDatabase) {
+        GenericSchemaManager.getToBeDroppedSchemaNames(reloadDatabase, 
currentDatabase)
+                .forEach(each -> 
persistServiceFacade.getMetaDataPersistFacade().getDatabaseMetaDataFacade().getSchema().drop(databaseName,
 each));
+    }
+    
     /**
      * Reload schema.
      *
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
index 990735a5903..c2d5a3e7153 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
@@ -19,32 +19,17 @@ package org.apache.shardingsphere.mode.metadata;
 
 import lombok.Getter;
 import lombok.extern.slf4j.Slf4j;
-import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
-import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import 
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
 import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
-import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
-import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
-import 
org.apache.shardingsphere.infra.metadata.database.schema.manager.GenericSchemaManager;
-import 
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsFactory;
-import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
-import org.apache.shardingsphere.mode.metadata.factory.MetaDataContextsFactory;
+import org.apache.shardingsphere.mode.metadata.manager.DatabaseMetaDataManager;
 import 
org.apache.shardingsphere.mode.metadata.manager.DatabaseRuleConfigurationManager;
 import 
org.apache.shardingsphere.mode.metadata.manager.GlobalConfigurationManager;
 import org.apache.shardingsphere.mode.metadata.manager.ResourceSwitchManager;
 import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager;
-import org.apache.shardingsphere.mode.metadata.manager.DatabaseMetaDataManager;
 import org.apache.shardingsphere.mode.metadata.manager.StatisticsManager;
 import org.apache.shardingsphere.mode.metadata.manager.StorageUnitManager;
-import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource;
 import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistFacade;
 import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
 
-import java.sql.SQLException;
-import java.util.Collection;
-import java.util.Map;
-
 /**
  * Meta data context manager.
  */
@@ -84,42 +69,4 @@ public class MetaDataContextManager {
         ruleItemManager = new RuleItemManager(metaDataContexts, 
databaseRuleConfigurationManager, metaDataPersistFacade);
         globalConfigurationManager = new 
GlobalConfigurationManager(metaDataContexts, metaDataPersistFacade);
     }
-    
-    /**
-     * Refresh database meta data.
-     *
-     * @param database to be reloaded database
-     */
-    public void refreshDatabaseMetaData(final ShardingSphereDatabase database) 
{
-        try {
-            MetaDataContexts reloadedMetaDataContexts = 
createMetaDataContexts(database);
-            dropSchemas(database.getName(), 
reloadedMetaDataContexts.getMetaData().getDatabase(database.getName()), 
database);
-            metaDataContexts.update(reloadedMetaDataContexts);
-            
metaDataContexts.getMetaData().getDatabase(database.getName()).getAllSchemas()
-                    .forEach(each -> 
metaDataPersistFacade.getDatabaseMetaDataFacade().getSchema().alterByRefresh(database.getName(),
 each));
-        } catch (final SQLException ex) {
-            log.error("Refresh database meta data: {} failed", 
database.getName(), ex);
-        }
-    }
-    
-    private MetaDataContexts createMetaDataContexts(final 
ShardingSphereDatabase database) throws SQLException {
-        Map<String, DataSourcePoolProperties> dataSourcePoolProps = 
metaDataPersistFacade.getDataSourceUnitService().load(database.getName());
-        SwitchingResource switchingResource = 
resourceSwitchManager.switchByAlterStorageUnit(database.getResourceMetaData(), 
dataSourcePoolProps);
-        Collection<RuleConfiguration> ruleConfigs = 
metaDataPersistFacade.getDatabaseRuleService().load(database.getName());
-        ShardingSphereDatabase changedDatabase = new 
MetaDataContextsFactory(metaDataPersistFacade, computeNodeInstanceContext)
-                .createChangedDatabase(database.getName(), false, 
switchingResource, ruleConfigs, metaDataContexts);
-        metaDataContexts.getMetaData().putDatabase(changedDatabase);
-        ConfigurationProperties props = new 
ConfigurationProperties(metaDataPersistFacade.getPropsService().load());
-        Collection<RuleConfiguration> globalRuleConfigs = 
metaDataPersistFacade.getGlobalRuleService().load();
-        RuleMetaData changedGlobalMetaData = new 
RuleMetaData(GlobalRulesBuilder.buildRules(globalRuleConfigs, 
metaDataContexts.getMetaData().getAllDatabases(), props));
-        ShardingSphereMetaData metaData = new ShardingSphereMetaData(
-                metaDataContexts.getMetaData().getAllDatabases(), 
metaDataContexts.getMetaData().getGlobalResourceMetaData(), 
changedGlobalMetaData, props);
-        MetaDataContexts result = new MetaDataContexts(metaData, 
ShardingSphereStatisticsFactory.create(metaData, 
metaDataPersistFacade.getStatisticsService().load(metaData)));
-        switchingResource.closeStaleDataSources();
-        return result;
-    }
-    
-    private void dropSchemas(final String databaseName, final 
ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase 
currentDatabase) {
-        GenericSchemaManager.getToBeDroppedSchemaNames(reloadDatabase, 
currentDatabase).forEach(each -> 
metaDataPersistFacade.getDatabaseMetaDataFacade().getSchema().drop(databaseName,
 each));
-    }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataExecutor.java
index abd83ee0356..6454af64d09 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataExecutor.java
@@ -38,7 +38,7 @@ public final class RefreshDatabaseMetaDataExecutor implements 
DistSQLUpdateExecu
                 .orElseGet(() -> 
contextManager.getMetaDataContexts().getMetaData().getAllDatabases());
         for (ShardingSphereDatabase each : databases) {
             if (!SystemSchemaUtils.isSystemSchema(each)) {
-                
contextManager.getMetaDataContextManager().refreshDatabaseMetaData(each);
+                contextManager.reloadDatabase(each);
             }
         }
     }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
index 40035447dc5..d6fdc47344c 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataExecutor.java
@@ -58,7 +58,7 @@ public final class RefreshTableMetaDataExecutor implements 
DistSQLUpdateExecutor
         if (sqlStatement.getTableName().isPresent()) {
             contextManager.reloadTable(database, schemaName, 
sqlStatement.getTableName().get());
         } else {
-            
contextManager.getMetaDataContextManager().refreshDatabaseMetaData(database);
+            contextManager.reloadDatabase(database);
         }
     }
     

Reply via email to