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 <[email protected]>
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);
}
}