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