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 6548959e7e0 Refactor ConfigurationContextManager (#30802)
6548959e7e0 is described below
commit 6548959e7e08c7dd4d9edf2f38800e030bf5cc56
Author: zhaojinchao <[email protected]>
AuthorDate: Mon Apr 8 15:22:54 2024 +0800
Refactor ConfigurationContextManager (#30802)
---
.../schema/TableMetaDataPersistService.java | 8 -----
.../service/schema/ViewMetaDataPersistService.java | 8 -----
.../context/ConfigurationContextManager.java | 38 +++++++++++++++-------
.../standalone/StandaloneModeContextManager.java | 2 +-
4 files changed, 27 insertions(+), 29 deletions(-)
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
index 8d51718b4a5..caa12fd28a0 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
@@ -47,7 +47,6 @@ public final class TableMetaDataPersistService implements
SchemaMetaDataPersistS
@Override
public void persist(final String databaseName, final String schemaName,
final Map<String, ShardingSphereTable> tables) {
- persistSchemaName(databaseName, schemaName);
for (Entry<String, ShardingSphereTable> entry : tables.entrySet()) {
String tableName = entry.getKey().toLowerCase();
List<String> versions =
repository.getChildrenKeys(TableMetaDataNode.getTableVersionsNode(databaseName,
schemaName, tableName));
@@ -62,7 +61,6 @@ public final class TableMetaDataPersistService implements
SchemaMetaDataPersistS
@Override
public Collection<MetaDataVersion> persistSchemaMetaData(final String
databaseName, final String schemaName, final Map<String, ShardingSphereTable>
tables) {
- persistSchemaName(databaseName, schemaName);
Collection<MetaDataVersion> result = new LinkedList<>();
for (Entry<String, ShardingSphereTable> entry : tables.entrySet()) {
String tableName = entry.getKey().toLowerCase();
@@ -78,12 +76,6 @@ public final class TableMetaDataPersistService implements
SchemaMetaDataPersistS
return result;
}
- private void persistSchemaName(final String databaseName, final String
schemaName) {
- if
(!repository.isExisted(TableMetaDataNode.getMetaDataTablesNode(databaseName,
schemaName))) {
-
repository.persist(TableMetaDataNode.getMetaDataTablesNode(databaseName,
schemaName), "");
- }
- }
-
private String getActiveVersion(final String databaseName, final String
schemaName, final String tableName) {
return
repository.getDirectly(TableMetaDataNode.getTableActiveVersionNode(databaseName,
schemaName, tableName));
}
diff --git
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
index 4414d6afa1d..65eb5fb9717 100644
---
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
+++
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
@@ -47,7 +47,6 @@ public final class ViewMetaDataPersistService implements
SchemaMetaDataPersistSe
@Override
public void persist(final String databaseName, final String schemaName,
final Map<String, ShardingSphereView> views) {
- persistSchemaName(databaseName, schemaName);
for (Entry<String, ShardingSphereView> entry : views.entrySet()) {
String viewName = entry.getKey().toLowerCase();
List<String> versions =
repository.getChildrenKeys(ViewMetaDataNode.getViewVersionsNode(databaseName,
schemaName, viewName));
@@ -62,7 +61,6 @@ public final class ViewMetaDataPersistService implements
SchemaMetaDataPersistSe
@Override
public Collection<MetaDataVersion> persistSchemaMetaData(final String
databaseName, final String schemaName, final Map<String, ShardingSphereView>
views) {
- persistSchemaName(databaseName, schemaName);
Collection<MetaDataVersion> result = new LinkedList<>();
for (Entry<String, ShardingSphereView> entry : views.entrySet()) {
String viewName = entry.getKey().toLowerCase();
@@ -78,12 +76,6 @@ public final class ViewMetaDataPersistService implements
SchemaMetaDataPersistSe
return result;
}
- private void persistSchemaName(final String databaseName, final String
schemaName) {
- if
(!repository.isExisted(ViewMetaDataNode.getMetaDataViewsNode(databaseName,
schemaName))) {
-
repository.persist(ViewMetaDataNode.getMetaDataViewsNode(databaseName,
schemaName), "");
- }
- }
-
private String getActiveVersion(final String databaseName, final String
schemaName, final String viewName) {
return
repository.getDirectly(ViewMetaDataNode.getViewActiveVersionNode(databaseName,
schemaName, viewName));
}
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 4d308dd881e..4ce36aed639 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
@@ -80,7 +80,7 @@ public final class ConfigurationContextManager {
closeStaleRules(databaseName);
SwitchingResource switchingResource =
new
ResourceSwitchManager().registerStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
propsMap);
- buildNewMetaDataContext(databaseName, switchingResource);
+ buildNewMetaDataContext(databaseName, switchingResource, false);
} catch (final SQLException ex) {
log.error("Alter database: {} register storage unit failed",
databaseName, ex);
}
@@ -97,7 +97,7 @@ public final class ConfigurationContextManager {
closeStaleRules(databaseName);
SwitchingResource switchingResource =
new
ResourceSwitchManager().alterStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
propsMap);
- buildNewMetaDataContext(databaseName, switchingResource);
+ buildNewMetaDataContext(databaseName, switchingResource, false);
} catch (final SQLException ex) {
log.error("Alter database: {} register storage unit failed",
databaseName, ex);
}
@@ -114,13 +114,13 @@ public final class ConfigurationContextManager {
closeStaleRules(databaseName);
SwitchingResource switchingResource = new
ResourceSwitchManager().unregisterStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
Collections.singletonList(storageUnitName));
- buildNewMetaDataContext(databaseName, switchingResource);
+ buildNewMetaDataContext(databaseName, switchingResource, true);
} catch (final SQLException ex) {
log.error("Alter database: {} register storage unit failed",
databaseName, ex);
}
}
- private void buildNewMetaDataContext(final String databaseName, final
SwitchingResource switchingResource) throws SQLException {
+ private void buildNewMetaDataContext(final String databaseName, final
SwitchingResource switchingResource, final boolean isDropConfig) throws
SQLException {
metaDataContexts.get().getMetaData().getDatabases().putAll(renewDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName),
switchingResource));
MetaDataContexts reloadMetaDataContexts =
createMetaDataContexts(databaseName, false, switchingResource, null);
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
schema) ->
reloadMetaDataContexts.getPersistService().getDatabaseMetaDataService()
@@ -128,7 +128,7 @@ public final class ConfigurationContextManager {
Optional.ofNullable(reloadMetaDataContexts.getStatistics().getDatabaseData().get(databaseName))
.ifPresent(optional ->
optional.getSchemaData().forEach((schemaName, schemaData) ->
reloadMetaDataContexts.getPersistService().getShardingSphereDataPersistService()
.persist(databaseName, schemaName, schemaData,
metaDataContexts.get().getMetaData().getDatabases())));
- alterSchemaMetaData(databaseName,
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
metaDataContexts.get().getMetaData().getDatabase(databaseName));
+ alterSchemaMetaData(databaseName,
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
metaDataContexts.get().getMetaData().getDatabase(databaseName), isDropConfig);
metaDataContexts.set(reloadMetaDataContexts);
metaDataContexts.get().getMetaData().getDatabases().putAll(newShardingSphereDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
switchingResource.closeStaleDataSources();
@@ -145,7 +145,7 @@ public final class ConfigurationContextManager {
// TODO consider rename this method to
alterDatabaseRuleConfiguration
closeStaleRules(databaseName);
MetaDataContexts reloadMetaDataContexts =
createMetaDataContextsWhenRuleChanged(databaseName, false, null, ruleConfigs);
- alterSchemaMetaData(databaseName,
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
metaDataContexts.get().getMetaData().getDatabase(databaseName));
+ alterSchemaMetaData(databaseName,
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
metaDataContexts.get().getMetaData().getDatabase(databaseName), false);
metaDataContexts.set(reloadMetaDataContexts);
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas().putAll(newShardingSphereSchemas(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
} catch (final SQLException ex) {
@@ -168,7 +168,7 @@ public final class ConfigurationContextManager {
database.getResourceMetaData().getStorageUnits().entrySet().stream()
.collect(Collectors.toMap(Entry::getKey, entry ->
entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue,
LinkedHashMap::new)),
database.getRuleMetaData().getRules(), ruleConfig,
instanceContext));
- refreshMetadata(databaseName, database, rules);
+ refreshMetadata(databaseName, database, rules, false);
} catch (final SQLException ex) {
log.error("Alter database: {} rule configurations failed",
databaseName, ex);
}
@@ -191,7 +191,7 @@ public final class ConfigurationContextManager {
.collect(Collectors.toMap(Entry::getKey, entry
-> entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue,
LinkedHashMap::new)),
database.getRuleMetaData().getRules(), ruleConfig,
instanceContext));
}
- refreshMetadata(databaseName, database, rules);
+ refreshMetadata(databaseName, database, rules, true);
} catch (final SQLException ex) {
log.error("Drop database: {} rule configurations failed",
databaseName, ex);
}
@@ -201,11 +201,11 @@ public final class ConfigurationContextManager {
return !((DatabaseRuleConfiguration) ruleConfig).isEmpty();
}
- private void refreshMetadata(final String databaseName, final
ShardingSphereDatabase database, final Collection<ShardingSphereRule> rules)
throws SQLException {
+ private void refreshMetadata(final String databaseName, final
ShardingSphereDatabase database, final Collection<ShardingSphereRule> rules,
final boolean isDropConfig) throws SQLException {
database.getRuleMetaData().getRules().clear();
database.getRuleMetaData().getRules().addAll(rules);
MetaDataContexts reloadMetaDataContexts =
createMetaDataContextsByAlterRule(databaseName,
database.getRuleMetaData().getConfigurations());
- alterSchemaMetaData(databaseName,
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
metaDataContexts.get().getMetaData().getDatabase(databaseName));
+ alterSchemaMetaData(databaseName,
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
metaDataContexts.get().getMetaData().getDatabase(databaseName), isDropConfig);
metaDataContexts.set(reloadMetaDataContexts);
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas().putAll(newShardingSphereSchemas(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
}
@@ -222,14 +222,28 @@ public final class ConfigurationContextManager {
* @param databaseName database name
* @param reloadDatabase reload database
* @param currentDatabase current database
+ * @param isDropConfig is drop configuration
*/
- public void alterSchemaMetaData(final String databaseName, final
ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase
currentDatabase) {
+ public void alterSchemaMetaData(final String databaseName, final
ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase
currentDatabase, final boolean isDropConfig) {
Map<String, ShardingSphereSchema> toBeAlterSchemas =
GenericSchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(),
currentDatabase.getSchemas());
Map<String, ShardingSphereSchema> toBeAddedSchemas =
GenericSchemaManager.getToBeAddedTablesBySchemas(reloadDatabase.getSchemas(),
currentDatabase.getSchemas());
- toBeAddedSchemas.forEach((key, value) ->
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().persist(databaseName,
key, value));
+ if (isDropConfig) {
+ toBeAddedSchemas.forEach((key, value) ->
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().persist(databaseName,
key, value));
+ } else {
+ alterSchemaMetaData(databaseName, toBeAddedSchemas);
+ }
toBeAlterSchemas.forEach((key, value) ->
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().delete(databaseName,
key, value));
}
+ private void alterSchemaMetaData(final String databaseName, final
Map<String, ShardingSphereSchema> toBeAddedSchemas) {
+ for (Entry<String, ShardingSphereSchema> entry :
toBeAddedSchemas.entrySet()) {
+ if (entry.getValue().getTables().isEmpty() &&
entry.getValue().getViews().isEmpty()) {
+
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().addSchema(databaseName,
entry.getKey());
+ }
+
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().persist(databaseName,
entry.getKey(), entry.getValue());
+ }
+ }
+
/**
* Renew ShardingSphere databases.
*
diff --git
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
index e44a9b80da4..fbbd964bf8f 100644
---
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
+++
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java
@@ -244,7 +244,7 @@ public final class StandaloneModeContextManager implements
ModeContextManager, C
.putAll(contextManager.getConfigurationContextManager().renewDatabase(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName),
switchingResource));
MetaDataContexts reloadMetaDataContexts =
contextManager.getConfigurationContextManager().createMetaDataContexts(databaseName,
false, switchingResource, null);
contextManager.getConfigurationContextManager().alterSchemaMetaData(databaseName,
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
-
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName));
+
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName),
true);
contextManager.deletedSchemaNames(databaseName,
reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName));
contextManager.renewMetaDataContexts(reloadMetaDataContexts);
switchingResource.closeStaleDataSources();