This is an automated email from the ASF dual-hosted git repository.
zhaojinchao 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 4b36746eb80 Move refresh database metadata to MetaDataContextManager
(#32121)
4b36746eb80 is described below
commit 4b36746eb8078702c0aa41de28d17c1da90c4bfb
Author: Haoran Meng <[email protected]>
AuthorDate: Tue Jul 16 13:08:38 2024 +0800
Move refresh database metadata to MetaDataContextManager (#32121)
---
.../scenario/migration/api/MigrationJobAPI.java | 2 +-
.../mode/manager/ContextManager.java | 80 ----------------------
.../mode/metadata/MetaDataContextManager.java | 68 ++++++++++++++++++
.../updatable/RefreshDatabaseMetaDataExecutor.java | 2 +-
.../updatable/RefreshTableMetaDataExecutor.java | 2 +-
5 files changed, 71 insertions(+), 83 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 ba4e11f69de..580f74ad5f0 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
@@ -288,7 +288,7 @@ public final class MigrationJobAPI implements
TransmissionJobAPI {
// TODO use origin database name now, wait reloadDatabaseMetaData fix
case-sensitive problem
ContextManager contextManager =
PipelineContextManager.getContext(PipelineJobIdUtils.parseContextKey(jobId)).getContextManager();
ShardingSphereDatabase database =
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
- contextManager.refreshTableMetaData(database);
+
contextManager.getMetaDataContextManager().refreshTableMetaData(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 1231a898d22..d2ffe36e458 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,10 +19,7 @@ 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;
@@ -32,26 +29,19 @@ 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.rule.builder.global.GlobalRulesBuilder;
import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
import org.apache.shardingsphere.infra.state.cluster.ClusterState;
-import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
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.MetaDataContextsFactory;
-import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource;
import org.apache.shardingsphere.mode.persist.PersistServiceFacade;
import org.apache.shardingsphere.mode.spi.PersistRepository;
import org.apache.shardingsphere.mode.state.StateContext;
import java.sql.SQLException;
-import java.util.Collection;
import java.util.Collections;
import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
@@ -128,76 +118,6 @@ public final class ContextManager implements AutoCloseable
{
return
getDatabase(databaseName).getResourceMetaData().getStorageUnits();
}
- /**
- * Reload database meta data.
- *
- * @param database to be reloaded database
- * @param force whether to force refresh table metadata
- */
- public void refreshDatabaseMetaData(final ShardingSphereDatabase database,
final boolean force) {
- try {
- MetaDataContexts reloadedMetaDataContexts =
createMetaDataContexts(database);
- MetaDataPersistService persistService =
persistServiceFacade.getMetaDataPersistService();
- if (force) {
- metaDataContexts.set(reloadedMetaDataContexts);
-
metaDataContexts.get().getMetaData().getDatabase(database.getName()).getSchemas()
- .forEach((schemaName, schema) ->
persistService.getDatabaseMetaDataService().persistByAlterConfiguration(database.getName(),
schemaName, schema));
- } else {
- deletedSchemaNames(database.getName(),
reloadedMetaDataContexts.getMetaData().getDatabase(database.getName()),
database);
- metaDataContexts.set(reloadedMetaDataContexts);
-
metaDataContexts.get().getMetaData().getDatabase(database.getName()).getSchemas()
- .forEach((schemaName, schema) ->
persistService.getDatabaseMetaDataService().compareAndPersist(database.getName(),
schemaName, schema));
- }
- } catch (final SQLException ex) {
- log.error("Refresh database meta data: {} failed",
database.getName(), ex);
- }
- }
-
- /**
- * Reload table meta data.
- *
- * @param database to be reloaded database
- */
- public void refreshTableMetaData(final ShardingSphereDatabase database) {
- try {
- MetaDataContexts reloadedMetaDataContexts =
createMetaDataContexts(database);
- deletedSchemaNames(database.getName(),
reloadedMetaDataContexts.getMetaData().getDatabase(database.getName()),
database);
- metaDataContexts.set(reloadedMetaDataContexts);
-
metaDataContexts.get().getMetaData().getDatabase(database.getName()).getSchemas()
- .forEach((schemaName, schema) ->
persistServiceFacade.getMetaDataPersistService().getDatabaseMetaDataService().compareAndPersist(database.getName(),
schemaName, schema));
- } catch (final SQLException ex) {
- log.error("Refresh table meta data: {} failed",
database.getName(), ex);
- }
- }
-
- private MetaDataContexts createMetaDataContexts(final
ShardingSphereDatabase database) throws SQLException {
- MetaDataPersistService metaDataPersistService =
persistServiceFacade.getMetaDataPersistService();
- Map<String, DataSourcePoolProperties> dataSourcePoolPropsFromRegCenter
= metaDataPersistService.getDataSourceUnitService().load(database.getName());
- SwitchingResource switchingResource =
metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(database.getResourceMetaData(),
dataSourcePoolPropsFromRegCenter);
- Collection<RuleConfiguration> ruleConfigs =
metaDataPersistService.getDatabaseRulePersistService().load(database.getName());
- Map<String, ShardingSphereDatabase> changedDatabases =
MetaDataContextsFactory
- .createChangedDatabases(database.getName(), false,
switchingResource, ruleConfigs, metaDataContexts.get(), metaDataPersistService,
computeNodeInstanceContext);
- ConfigurationProperties props = new
ConfigurationProperties(metaDataPersistService.getPropsService().load());
- Collection<RuleConfiguration> globalRuleConfigs =
metaDataPersistService.getGlobalRuleService().load();
- RuleMetaData changedGlobalMetaData = new
RuleMetaData(GlobalRulesBuilder.buildRules(globalRuleConfigs, changedDatabases,
props));
- MetaDataContexts result =
MetaDataContextsFactory.create(metaDataPersistService,
- new ShardingSphereMetaData(changedDatabases,
metaDataContexts.get().getMetaData().getGlobalResourceMetaData(),
changedGlobalMetaData, props));
- switchingResource.closeStaleDataSources();
- return result;
- }
-
- /**
- * Delete schema names.
- *
- * @param databaseName database name
- * @param reloadDatabase reload database
- * @param currentDatabase current database
- */
- public void deletedSchemaNames(final String databaseName, final
ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase
currentDatabase) {
-
GenericSchemaManager.getToBeDeletedSchemaNames(reloadDatabase.getSchemas(),
currentDatabase.getSchemas()).keySet()
- .forEach(each ->
persistServiceFacade.getMetaDataPersistService().getDatabaseMetaDataService().dropSchema(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 4eb0b16957b..82200909264 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
@@ -18,9 +18,16 @@
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.rule.builder.global.GlobalRulesBuilder;
import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
import
org.apache.shardingsphere.mode.metadata.manager.DatabaseRuleConfigurationManager;
import
org.apache.shardingsphere.mode.metadata.manager.GlobalConfigurationManager;
@@ -29,14 +36,19 @@ import
org.apache.shardingsphere.mode.metadata.manager.RuleItemManager;
import org.apache.shardingsphere.mode.metadata.manager.SchemaMetaDataManager;
import
org.apache.shardingsphere.mode.metadata.manager.ShardingSphereDatabaseDataManager;
import org.apache.shardingsphere.mode.metadata.manager.StorageUnitManager;
+import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource;
import org.apache.shardingsphere.mode.spi.PersistRepository;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Map;
import java.util.concurrent.atomic.AtomicReference;
/**
* Meta data context manager..
*/
@Getter
+@Slf4j
public class MetaDataContextManager {
private final AtomicReference<MetaDataContexts> metaDataContexts;
@@ -93,4 +105,60 @@ public class MetaDataContextManager {
public void renewMetaDataContexts(final MetaDataContexts metaDataContexts)
{
this.metaDataContexts.set(metaDataContexts);
}
+
+ /**
+ * Reload database meta data.
+ *
+ * @param database to be reloaded database
+ * @param force whether to force refresh table metadata
+ */
+ public void refreshDatabaseMetaData(final ShardingSphereDatabase database,
final boolean force) {
+ try {
+ MetaDataContexts reloadedMetaDataContexts =
createMetaDataContexts(database);
+ if (force) {
+ metaDataContexts.set(reloadedMetaDataContexts);
+
metaDataContexts.get().getMetaData().getDatabase(database.getName()).getSchemas()
+ .forEach((schemaName, schema) ->
metaDataPersistService.getDatabaseMetaDataService().persistByAlterConfiguration(database.getName(),
schemaName, schema));
+ } else {
+ deletedSchemaNames(database.getName(),
reloadedMetaDataContexts.getMetaData().getDatabase(database.getName()),
database);
+ metaDataContexts.set(reloadedMetaDataContexts);
+
metaDataContexts.get().getMetaData().getDatabase(database.getName()).getSchemas()
+ .forEach((schemaName, schema) ->
metaDataPersistService.getDatabaseMetaDataService().compareAndPersist(database.getName(),
schemaName, schema));
+ }
+ } catch (final SQLException ex) {
+ log.error("Refresh database meta data: {} failed",
database.getName(), ex);
+ }
+ }
+
+ /**
+ * Reload table meta data.
+ *
+ * @param database to be reloaded database
+ */
+ public void refreshTableMetaData(final ShardingSphereDatabase database) {
+ try {
+ MetaDataContexts reloadedMetaDataContexts =
createMetaDataContexts(database);
+ deletedSchemaNames(database.getName(),
reloadedMetaDataContexts.getMetaData().getDatabase(database.getName()),
database);
+ metaDataContexts.set(reloadedMetaDataContexts);
+
metaDataContexts.get().getMetaData().getDatabase(database.getName()).getSchemas()
+ .forEach((schemaName, schema) ->
metaDataPersistService.getDatabaseMetaDataService().compareAndPersist(database.getName(),
schemaName, schema));
+ } catch (final SQLException ex) {
+ log.error("Refresh table meta data: {} failed",
database.getName(), ex);
+ }
+ }
+
+ private MetaDataContexts createMetaDataContexts(final
ShardingSphereDatabase database) throws SQLException {
+ Map<String, DataSourcePoolProperties> dataSourcePoolPropsFromRegCenter
= metaDataPersistService.getDataSourceUnitService().load(database.getName());
+ SwitchingResource switchingResource =
resourceSwitchManager.switchByAlterStorageUnit(database.getResourceMetaData(),
dataSourcePoolPropsFromRegCenter);
+ Collection<RuleConfiguration> ruleConfigs =
metaDataPersistService.getDatabaseRulePersistService().load(database.getName());
+ Map<String, ShardingSphereDatabase> changedDatabases =
MetaDataContextsFactory
+ .createChangedDatabases(database.getName(), false,
switchingResource, ruleConfigs, metaDataContexts.get(), metaDataPersistService,
computeNodeInstanceContext);
+ ConfigurationProperties props = new
ConfigurationProperties(metaDataPersistService.getPropsService().load());
+ Collection<RuleConfiguration> globalRuleConfigs =
metaDataPersistService.getGlobalRuleService().load();
+ RuleMetaData changedGlobalMetaData = new
RuleMetaData(GlobalRulesBuilder.buildRules(globalRuleConfigs, changedDatabases,
props));
+ MetaDataContexts result =
MetaDataContextsFactory.create(metaDataPersistService,
+ new ShardingSphereMetaData(changedDatabases,
metaDataContexts.get().getMetaData().getGlobalResourceMetaData(),
changedGlobalMetaData, props));
+ switchingResource.closeStaleDataSources();
+ return result;
+ }
}
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 57453deaf62..6265364c13c 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().getDatabases());
for (ShardingSphereDatabase each : databases.values()) {
if (!SystemSchemaUtils.isSystemSchema(each)) {
- contextManager.refreshDatabaseMetaData(each,
sqlStatement.isForce());
+
contextManager.getMetaDataContextManager().refreshDatabaseMetaData(each,
sqlStatement.isForce());
}
}
}
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 ca4ef5f0a20..2d0ecfd4159 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
@@ -56,7 +56,7 @@ public final class RefreshTableMetaDataExecutor implements
DistSQLUpdateExecutor
if (sqlStatement.getTableName().isPresent()) {
contextManager.reloadTable(database, schemaName,
sqlStatement.getTableName().get());
} else {
- contextManager.refreshTableMetaData(database);
+
contextManager.getMetaDataContextManager().refreshTableMetaData(database);
}
}