You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2023/12/21 04:41:36 UTC
(shardingsphere) branch master updated: Splitting refresh table metadata and database metadata (#29482)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 b1148650941 Splitting refresh table metadata and database metadata (#29482)
b1148650941 is described below
commit b11486509419e3c5fdfb8ac2fe65bb2c15e9bc48
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Thu Dec 21 12:41:30 2023 +0800
Splitting refresh table metadata and database metadata (#29482)
---
.../scenario/migration/api/MigrationJobAPI.java | 2 +-
.../mode/manager/ContextManager.java | 47 +++++++++++++++++-----
.../context/ConfigurationContextManager.java | 1 -
.../updatable/RefreshDatabaseMetaDataUpdater.java | 2 +-
.../ral/updatable/RefreshTableMetaDataUpdater.java | 2 +-
5 files changed, 40 insertions(+), 14 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 bc451127cd8..49b68258bf9 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
@@ -289,7 +289,7 @@ public final class MigrationJobAPI implements TransmissionJobAPI {
// TODO use origin database name now, wait reloadDatabaseMetaData fix case-sensitive probelm
ContextManager contextManager = PipelineContextManager.getContext(PipelineJobIdUtils.parseContextKey(jobId)).getContextManager();
ShardingSphereDatabase database = contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName);
- contextManager.reloadDatabaseMetaData(database.getName());
+ contextManager.refreshTableMetaData(database.getName());
}
@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 dc19089292b..d706bfe2da6 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
@@ -108,36 +108,63 @@ public final class ContextManager implements AutoCloseable {
}
/**
- * Reload database meta data from governance center.
+ * Reload database meta data.
+ *
+ * @param databaseName to be reloaded database name
+ * @param force whether to force refresh table metadata
+ */
+ public void refreshDatabaseMetaData(final String databaseName, final boolean force) {
+ try {
+ ShardingSphereDatabase database = metaDataContexts.get().getMetaData().getDatabase(databaseName);
+ MetaDataContexts reloadedMetaDataContexts = createMetaDataContexts(databaseName);
+ if (force) {
+ metaDataContexts.set(reloadedMetaDataContexts);
+ metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas()
+ .forEach((schemaName, schema) -> metaDataContexts.get().getPersistService().getDatabaseMetaDataService().persist(database.getName(), schemaName, schema));
+ } else {
+ deletedSchemaNames(databaseName, reloadedMetaDataContexts.getMetaData().getDatabase(databaseName), database);
+ metaDataContexts.set(reloadedMetaDataContexts);
+ metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas()
+ .forEach((schemaName, schema) -> metaDataContexts.get().getPersistService().getDatabaseMetaDataService().compareAndPersist(database.getName(), schemaName, schema));
+ }
+ } catch (final SQLException ex) {
+ log.error("Refresh database meta data: {} failed", databaseName, ex);
+ }
+ }
+
+ /**
+ * Reload table meta data.
*
* @param databaseName to be reloaded database name
*/
- public void reloadDatabaseMetaData(final String databaseName) {
+ public void refreshTableMetaData(final String databaseName) {
try {
ShardingSphereDatabase database = metaDataContexts.get().getMetaData().getDatabase(databaseName);
- Map<String, DataSourcePoolProperties> dataSourcePoolPropsFromRegCenter = metaDataContexts.get().getPersistService().getDataSourceUnitService().load(databaseName);
- SwitchingResource switchingResource = new ResourceSwitchManager().createByAlterDataSourcePoolProperties(database.getResourceMetaData(), dataSourcePoolPropsFromRegCenter);
- metaDataContexts.get().getMetaData().getDatabases().putAll(configurationContextManager.renewDatabase(database, switchingResource));
- MetaDataContexts reloadedMetaDataContexts = createMetaDataContexts(databaseName, switchingResource);
+ MetaDataContexts reloadedMetaDataContexts = createMetaDataContexts(databaseName);
deletedSchemaNames(databaseName, reloadedMetaDataContexts.getMetaData().getDatabase(databaseName), database);
metaDataContexts.set(reloadedMetaDataContexts);
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas()
.forEach((schemaName, schema) -> metaDataContexts.get().getPersistService().getDatabaseMetaDataService().compareAndPersist(database.getName(), schemaName, schema));
- switchingResource.closeStaleDataSources();
} catch (final SQLException ex) {
- log.error("Reload database meta data: {} failed", databaseName, ex);
+ log.error("Refresh table meta data: {} failed", databaseName, ex);
}
}
- private MetaDataContexts createMetaDataContexts(final String databaseName, final SwitchingResource switchingResource) throws SQLException {
+ private MetaDataContexts createMetaDataContexts(final String databaseName) throws SQLException {
+ ShardingSphereDatabase database = metaDataContexts.get().getMetaData().getDatabase(databaseName);
+ Map<String, DataSourcePoolProperties> dataSourcePoolPropsFromRegCenter = metaDataContexts.get().getPersistService().getDataSourceUnitService().load(databaseName);
+ SwitchingResource switchingResource = new ResourceSwitchManager().createByAlterDataSourcePoolProperties(database.getResourceMetaData(), dataSourcePoolPropsFromRegCenter);
+ metaDataContexts.get().getMetaData().getDatabases().putAll(configurationContextManager.renewDatabase(database, switchingResource));
MetaDataBasedPersistService metaDataPersistService = metaDataContexts.get().getPersistService();
Map<String, ShardingSphereDatabase> changedDatabases = configurationContextManager.createChangedDatabases(databaseName, false,
switchingResource, metaDataPersistService.getDatabaseRulePersistService().load(databaseName));
ConfigurationProperties props = new ConfigurationProperties(metaDataPersistService.getPropsService().load());
RuleMetaData changedGlobalMetaData = new RuleMetaData(
GlobalRulesBuilder.buildRules(metaDataPersistService.getGlobalRuleService().load(), changedDatabases, props));
- return new MetaDataContexts(metaDataContexts.get().getPersistService(),
+ MetaDataContexts result = new MetaDataContexts(metaDataContexts.get().getPersistService(),
new ShardingSphereMetaData(changedDatabases, metaDataContexts.get().getMetaData().getGlobalResourceMetaData(), changedGlobalMetaData, props));
+ switchingResource.closeStaleDataSources();
+ return result;
}
/**
diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
index 7a625e1dede..80eb87750bf 100644
--- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
+++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
@@ -349,7 +349,6 @@ public final class ConfigurationContextManager {
ShardingSphereDatabase changedDatabase = createChangedDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(), internalLoadMetaData,
metaDataContexts.get().getPersistService(), toBeCreatedDatabaseConfig, metaDataContexts.get().getMetaData().getProps(), instanceContext);
Map<String, ShardingSphereDatabase> result = new LinkedHashMap<>(metaDataContexts.get().getMetaData().getDatabases());
- changedDatabase.getSchemas().putAll(newShardingSphereSchemas(changedDatabase));
result.put(databaseName.toLowerCase(), changedDatabase);
return result;
}
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java
index d73f2bc6c4c..7a2bb8e7969 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshDatabaseMetaDataUpdater.java
@@ -34,7 +34,7 @@ public final class RefreshDatabaseMetaDataUpdater implements RALUpdater<RefreshD
@Override
public void executeUpdate(final String databaseName, final RefreshDatabaseMetaDataStatement sqlStatement) {
- ProxyContext.getInstance().getContextManager().reloadDatabaseMetaData(getDatabaseName(databaseName, sqlStatement));
+ ProxyContext.getInstance().getContextManager().refreshDatabaseMetaData(getDatabaseName(databaseName, sqlStatement), true);
}
private String getDatabaseName(final String databaseName, final RefreshDatabaseMetaDataStatement sqlStatement) {
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdater.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdater.java
index 82c55c41fea..2277f245767 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdater.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/RefreshTableMetaDataUpdater.java
@@ -56,7 +56,7 @@ public final class RefreshTableMetaDataUpdater implements ConnectionSessionRequi
if (sqlStatement.getTableName().isPresent()) {
contextManager.reloadTable(databaseName, schemaName, sqlStatement.getTableName().get());
} else {
- contextManager.reloadDatabaseMetaData(databaseName);
+ contextManager.refreshTableMetaData(databaseName);
}
}