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); } }