Skip to content

Commit

Permalink
Refactor ContextManager.reloadDatabase() (#34541)
Browse files Browse the repository at this point in the history
* Refactor MetaDataContextManager.dropSchemas()

* Rename MetaDataContextManager.reloadDatabase()

* Refactor ContextManager.reloadDatabase()

* Refactor ContextManager.reloadDatabase()

* Refactor ContextManager.reloadDatabase()
  • Loading branch information
terrymanu authored Jan 31, 2025
1 parent 85eeafe commit ba0d5f7
Show file tree
Hide file tree
Showing 5 changed files with 54 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -305,7 +305,7 @@ private void refreshTableMetadata(final String jobId, final String databaseName)
// 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
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@

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;
Expand All @@ -29,18 +32,25 @@
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;

Expand Down Expand Up @@ -98,6 +108,46 @@ public Map<String, StorageUnit> getStorageUnits(final String databaseName) {
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.
*
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,32 +19,17 @@

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.
*/
Expand Down Expand Up @@ -84,42 +69,4 @@ public MetaDataContextManager(final MetaDataContexts metaDataContexts, final Com
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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ public void executeUpdate(final RefreshDatabaseMetaDataStatement sqlStatement, f
.orElseGet(() -> contextManager.getMetaDataContexts().getMetaData().getAllDatabases());
for (ShardingSphereDatabase each : databases) {
if (!SystemSchemaUtils.isSystemSchema(each)) {
contextManager.getMetaDataContextManager().refreshDatabaseMetaData(each);
contextManager.reloadDatabase(each);
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ public void executeUpdate(final RefreshTableMetaDataStatement sqlStatement, fina
if (sqlStatement.getTableName().isPresent()) {
contextManager.reloadTable(database, schemaName, sqlStatement.getTableName().get());
} else {
contextManager.getMetaDataContextManager().refreshDatabaseMetaData(database);
contextManager.reloadDatabase(database);
}
}

Expand Down

0 comments on commit ba0d5f7

Please sign in to comment.