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 1aa23530341 Extract StorageUnitManager from ConfigurationManager to
manager storage units (#32069)
1aa23530341 is described below
commit 1aa23530341c5fd3f0ba248245c45597925e6106
Author: Haoran Meng <[email protected]>
AuthorDate: Fri Jul 12 11:06:34 2024 +0800
Extract StorageUnitManager from ConfigurationManager to manager storage
units (#32069)
* Extract StorageUnitManager from ConfigurationManager to manager storage
units
* fix checkstyle
---
.../mode/metadata/MetaDataContextManager.java | 6 +-
.../metadata/manager/ConfigurationManager.java | 84 +------
...urationManager.java => StorageUnitManager.java} | 253 ++++-----------------
.../dispatch/StorageUnitEventSubscriber.java | 6 +-
4 files changed, 48 insertions(+), 301 deletions(-)
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 e12adc276e7..9744129b548 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
@@ -27,6 +27,7 @@ import
org.apache.shardingsphere.mode.metadata.manager.SchemaMetaDataManager;
import org.apache.shardingsphere.mode.metadata.manager.ResourceSwitchManager;
import org.apache.shardingsphere.mode.metadata.manager.RuleItemManager;
import
org.apache.shardingsphere.mode.metadata.manager.ShardingSphereDatabaseDataManager;
+import org.apache.shardingsphere.mode.metadata.manager.StorageUnitManager;
import org.apache.shardingsphere.mode.spi.PersistRepository;
import java.util.concurrent.atomic.AtomicReference;
@@ -51,12 +52,15 @@ public class MetaDataContextManager {
private final MetaDataPersistService metaDataPersistService;
+ private final StorageUnitManager storageUnitManager;
+
public MetaDataContextManager(final AtomicReference<MetaDataContexts>
metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext,
final PersistRepository repository) {
this.metaDataContexts = metaDataContexts;
resourceSwitchManager = new ResourceSwitchManager();
databaseManager = new
ShardingSphereDatabaseDataManager(metaDataContexts);
- configurationManager = new ConfigurationManager(metaDataContexts,
computeNodeInstanceContext, repository, resourceSwitchManager);
+ storageUnitManager = new StorageUnitManager(metaDataContexts,
computeNodeInstanceContext, repository, resourceSwitchManager);
+ configurationManager = new ConfigurationManager(metaDataContexts,
computeNodeInstanceContext, repository);
schemaMetaDataManager = new SchemaMetaDataManager(metaDataContexts,
repository);
ruleItemManager = new RuleItemManager(metaDataContexts, repository,
configurationManager);
metaDataPersistService = new MetaDataPersistService(repository);
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
index 7b42ca00e77..527a11b52a0 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
@@ -52,7 +52,6 @@ import
org.apache.shardingsphere.transaction.rule.TransactionRule;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Collection;
-import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
@@ -73,87 +72,15 @@ public final class ConfigurationManager {
private final ComputeNodeInstanceContext computeNodeInstanceContext;
- private final ResourceSwitchManager resourceSwitchManager;
-
private final MetaDataPersistService metaDataPersistService;
public ConfigurationManager(final AtomicReference<MetaDataContexts>
metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext,
- final PersistRepository repository, final
ResourceSwitchManager resourceSwitchManager) {
+ final PersistRepository repository) {
this.metaDataContexts = metaDataContexts;
this.computeNodeInstanceContext = computeNodeInstanceContext;
- this.resourceSwitchManager = resourceSwitchManager;
metaDataPersistService = new MetaDataPersistService(repository);
}
- /**
- * Register storage unit.
- *
- * @param databaseName database name
- * @param propsMap data source pool properties map
- */
- public synchronized void registerStorageUnit(final String databaseName,
final Map<String, DataSourcePoolProperties> propsMap) {
- try {
- closeStaleRules(databaseName);
- SwitchingResource switchingResource =
resourceSwitchManager.registerStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
propsMap);
- buildNewMetaDataContext(databaseName, switchingResource);
- } catch (final SQLException ex) {
- log.error("Alter database: {} register storage unit failed",
databaseName, ex);
- }
- }
-
- /**
- * Alter storage unit.
- *
- * @param databaseName database name
- * @param propsMap data source pool properties map
- */
- public synchronized void alterStorageUnit(final String databaseName, final
Map<String, DataSourcePoolProperties> propsMap) {
- try {
- closeStaleRules(databaseName);
- SwitchingResource switchingResource =
resourceSwitchManager.alterStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
propsMap);
- buildNewMetaDataContext(databaseName, switchingResource);
- } catch (final SQLException ex) {
- log.error("Alter database: {} register storage unit failed",
databaseName, ex);
- }
- }
-
- /**
- * UnRegister storage unit.
- *
- * @param databaseName database name
- * @param storageUnitName storage unit name
- */
- public synchronized void unregisterStorageUnit(final String databaseName,
final String storageUnitName) {
- try {
- closeStaleRules(databaseName);
- SwitchingResource switchingResource =
resourceSwitchManager.unregisterStorageUnit(metaDataContexts.get().getMetaData().getDatabase(databaseName).getResourceMetaData(),
- Collections.singletonList(storageUnitName));
- buildNewMetaDataContext(databaseName, switchingResource);
- } 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 {
- MetaDataContexts reloadMetaDataContexts =
createMetaDataContexts(databaseName, false, switchingResource, null);
- metaDataContexts.set(reloadMetaDataContexts);
-
metaDataContexts.get().getMetaData().getDatabases().putAll(buildShardingSphereDatabase(reloadMetaDataContexts.getMetaData().getDatabase(databaseName)));
- switchingResource.closeStaleDataSources();
- }
-
- private Map<String, ShardingSphereDatabase>
buildShardingSphereDatabase(final ShardingSphereDatabase originalDatabase) {
- return
Collections.singletonMap(originalDatabase.getName().toLowerCase(), new
ShardingSphereDatabase(originalDatabase.getName(),
- originalDatabase.getProtocolType(),
originalDatabase.getResourceMetaData(), originalDatabase.getRuleMetaData(),
buildSchemas(originalDatabase)));
- }
-
- private Map<String, ShardingSphereSchema> buildSchemas(final
ShardingSphereDatabase originalDatabase) {
- Map<String, ShardingSphereSchema> result = new
LinkedHashMap<>(originalDatabase.getSchemas().size(), 1F);
- originalDatabase.getSchemas().keySet().forEach(schemaName ->
result.put(schemaName.toLowerCase(),
- new
ShardingSphereSchema(originalDatabase.getSchema(schemaName).getTables(),
-
metaDataPersistService.getDatabaseMetaDataService().getViewMetaDataPersistService().load(originalDatabase.getName(),
schemaName))));
- return result;
- }
-
/**
* Alter rule configuration.
*
@@ -272,15 +199,6 @@ public final class ConfigurationManager {
return result;
}
- @SneakyThrows(Exception.class)
- private void closeStaleRules(final String databaseName) {
- for (ShardingSphereRule each :
metaDataContexts.get().getMetaData().getDatabase(databaseName).getRuleMetaData().getRules())
{
- if (each instanceof AutoCloseable) {
- ((AutoCloseable) each).close();
- }
- }
- }
-
/**
* Create meta data contexts.
*
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
similarity index 52%
copy from
mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
copy to
mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
index 7b42ca00e77..b4e1bee37f0 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/StorageUnitManager.java
@@ -23,7 +23,6 @@ import
org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
import
org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
-import
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfiguration;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
@@ -32,42 +31,31 @@ import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaDa
import
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
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.manager.GenericSchemaManager;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
-import org.apache.shardingsphere.infra.rule.PartialRuleUpdateSupported;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
-import
org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
-import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine;
import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
import org.apache.shardingsphere.mode.spi.PersistRepository;
-import org.apache.shardingsphere.mode.tuple.annotation.RepositoryTupleEntity;
-import org.apache.shardingsphere.transaction.rule.TransactionRule;
import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
import java.util.LinkedHashMap;
-import java.util.LinkedList;
import java.util.Map;
import java.util.Map.Entry;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.Properties;
import java.util.concurrent.atomic.AtomicReference;
import java.util.stream.Collectors;
/**
- * Configuration context manager.
+ * Storage unit manager.
*/
@Slf4j
-public final class ConfigurationManager {
+public final class StorageUnitManager {
private final AtomicReference<MetaDataContexts> metaDataContexts;
@@ -77,8 +65,8 @@ public final class ConfigurationManager {
private final MetaDataPersistService metaDataPersistService;
- public ConfigurationManager(final AtomicReference<MetaDataContexts>
metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext,
- final PersistRepository repository, final
ResourceSwitchManager resourceSwitchManager) {
+ public StorageUnitManager(final AtomicReference<MetaDataContexts>
metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext,
+ final PersistRepository repository, final
ResourceSwitchManager resourceSwitchManager) {
this.metaDataContexts = metaDataContexts;
this.computeNodeInstanceContext = computeNodeInstanceContext;
this.resourceSwitchManager = resourceSwitchManager;
@@ -141,112 +129,30 @@ public final class ConfigurationManager {
switchingResource.closeStaleDataSources();
}
- private Map<String, ShardingSphereDatabase>
buildShardingSphereDatabase(final ShardingSphereDatabase originalDatabase) {
- return
Collections.singletonMap(originalDatabase.getName().toLowerCase(), new
ShardingSphereDatabase(originalDatabase.getName(),
- originalDatabase.getProtocolType(),
originalDatabase.getResourceMetaData(), originalDatabase.getRuleMetaData(),
buildSchemas(originalDatabase)));
+ private MetaDataContexts createMetaDataContexts(final String databaseName,
final boolean internalLoadMetaData,
+ final SwitchingResource
switchingResource, final Collection<RuleConfiguration> ruleConfigs) throws
SQLException {
+ Map<String, ShardingSphereDatabase> changedDatabases =
createChangedDatabases(databaseName, internalLoadMetaData, switchingResource,
ruleConfigs);
+ ConfigurationProperties props =
metaDataContexts.get().getMetaData().getProps();
+ RuleMetaData changedGlobalMetaData = new RuleMetaData(
+
GlobalRulesBuilder.buildRules(metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getConfigurations(),
changedDatabases, props));
+ return newMetaDataContexts(new
ShardingSphereMetaData(changedDatabases,
metaDataContexts.get().getMetaData().getGlobalResourceMetaData(),
changedGlobalMetaData, props));
}
- private Map<String, ShardingSphereSchema> buildSchemas(final
ShardingSphereDatabase originalDatabase) {
- Map<String, ShardingSphereSchema> result = new
LinkedHashMap<>(originalDatabase.getSchemas().size(), 1F);
- originalDatabase.getSchemas().keySet().forEach(schemaName ->
result.put(schemaName.toLowerCase(),
- new
ShardingSphereSchema(originalDatabase.getSchema(schemaName).getTables(),
-
metaDataPersistService.getDatabaseMetaDataService().getViewMetaDataPersistService().load(originalDatabase.getName(),
schemaName))));
+ private synchronized Map<String, ShardingSphereDatabase>
createChangedDatabases(final String databaseName, final boolean
internalLoadMetaData,
+
final SwitchingResource switchingResource, final
Collection<RuleConfiguration> ruleConfigs) throws SQLException {
+ ResourceMetaData effectiveResourceMetaData =
getEffectiveResourceMetaData(metaDataContexts.get().getMetaData().getDatabase(databaseName),
switchingResource);
+ Collection<RuleConfiguration> toBeCreatedRuleConfigs = null ==
ruleConfigs
+ ?
metaDataContexts.get().getMetaData().getDatabase(databaseName).getRuleMetaData().getConfigurations()
+ : ruleConfigs;
+ DatabaseConfiguration toBeCreatedDatabaseConfig =
getDatabaseConfiguration(effectiveResourceMetaData, switchingResource,
toBeCreatedRuleConfigs);
+ ShardingSphereDatabase changedDatabase =
createChangedDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(),
internalLoadMetaData,
+ metaDataPersistService, toBeCreatedDatabaseConfig,
metaDataContexts.get().getMetaData().getProps(), computeNodeInstanceContext);
+ Map<String, ShardingSphereDatabase> result = new
LinkedHashMap<>(metaDataContexts.get().getMetaData().getDatabases());
+ result.put(databaseName.toLowerCase(), changedDatabase);
return result;
}
- /**
- * Alter rule configuration.
- *
- * @param databaseName database name
- * @param ruleConfig rule configurations
- */
- @SuppressWarnings({"unchecked", "rawtypes"})
- public synchronized void alterRuleConfiguration(final String databaseName,
final RuleConfiguration ruleConfig) {
- ShardingSphereDatabase database =
metaDataContexts.get().getMetaData().getDatabase(databaseName);
- Collection<ShardingSphereRule> rules = new
LinkedList<>(database.getRuleMetaData().getRules());
- Optional<ShardingSphereRule> toBeChangedRule =
rules.stream().filter(each ->
each.getConfiguration().getClass().equals(ruleConfig.getClass())).findFirst();
- if (toBeChangedRule.isPresent() && toBeChangedRule.get() instanceof
PartialRuleUpdateSupported && ((PartialRuleUpdateSupported)
toBeChangedRule.get()).partialUpdate(ruleConfig)) {
- ((PartialRuleUpdateSupported)
toBeChangedRule.get()).updateConfiguration(ruleConfig);
- return;
- }
- try {
- rules.removeIf(each ->
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
- rules.addAll(DatabaseRulesBuilder.build(databaseName,
database.getProtocolType(), database.getRuleMetaData().getRules(),
- ruleConfig, computeNodeInstanceContext,
database.getResourceMetaData()));
- refreshMetadata(databaseName, database, rules);
- } catch (final SQLException ex) {
- log.error("Alter database: {} rule configurations failed",
databaseName, ex);
- }
- }
-
- /**
- * Drop rule configuration.
- *
- * @param databaseName database name
- * @param ruleConfig rule configurations
- */
- @SuppressWarnings({"unchecked", "rawtypes"})
- public synchronized void dropRuleConfiguration(final String databaseName,
final RuleConfiguration ruleConfig) {
- ShardingSphereDatabase database =
metaDataContexts.get().getMetaData().getDatabase(databaseName);
- Collection<ShardingSphereRule> rules = new
LinkedList<>(database.getRuleMetaData().getRules());
- Optional<ShardingSphereRule> toBeChangedRule =
rules.stream().filter(each ->
each.getConfiguration().getClass().equals(ruleConfig.getClass())).findFirst();
- if (toBeChangedRule.isPresent() && toBeChangedRule.get() instanceof
PartialRuleUpdateSupported && ((PartialRuleUpdateSupported)
toBeChangedRule.get()).partialUpdate(ruleConfig)) {
- ((PartialRuleUpdateSupported)
toBeChangedRule.get()).updateConfiguration(ruleConfig);
- return;
- }
- try {
- rules.removeIf(each ->
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
- if (!((DatabaseRuleConfiguration) ruleConfig).isEmpty()) {
- rules.addAll(DatabaseRulesBuilder.build(databaseName,
database.getProtocolType(), database.getRuleMetaData().getRules(),
- ruleConfig, computeNodeInstanceContext,
database.getResourceMetaData()));
- }
- refreshMetadata(databaseName, database, rules);
- } catch (final SQLException ex) {
- log.error("Drop database: {} rule configurations failed",
databaseName, ex);
- }
- }
-
- private void refreshMetadata(final String databaseName, final
ShardingSphereDatabase database, final Collection<ShardingSphereRule> rules)
throws SQLException {
- database.getRuleMetaData().getRules().clear();
- database.getRuleMetaData().getRules().addAll(rules);
- MetaDataContexts reloadMetaDataContexts =
createMetaDataContextsByAlterRule(databaseName,
database.getRuleMetaData().getConfigurations());
- metaDataContexts.set(reloadMetaDataContexts);
-
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas().putAll(buildShardingSphereSchemas(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
- }
-
- private MetaDataContexts createMetaDataContextsByAlterRule(final String
databaseName, final Collection<RuleConfiguration> ruleConfigs) throws
SQLException {
- Map<String, ShardingSphereDatabase> changedDatabases =
createChangedDatabases(databaseName, false, null, ruleConfigs);
- return newMetaDataContexts(new
ShardingSphereMetaData(changedDatabases,
metaDataContexts.get().getMetaData().getGlobalResourceMetaData(),
- metaDataContexts.get().getMetaData().getGlobalRuleMetaData(),
metaDataContexts.get().getMetaData().getProps()));
- }
-
- /**
- * Alter schema meta data.
- *
- * @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, final boolean isDropConfig) {
- Map<String, ShardingSphereSchema> toBeAlterSchemas =
GenericSchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(),
currentDatabase.getSchemas());
- Map<String, ShardingSphereSchema> toBeAddedSchemas =
GenericSchemaManager.getToBeAddedTablesBySchemas(reloadDatabase.getSchemas(),
currentDatabase.getSchemas());
- if (isDropConfig) {
- toBeAddedSchemas.forEach((key, value) ->
metaDataPersistService.getDatabaseMetaDataService().persistByDropConfiguration(databaseName,
key, value));
- } else {
- toBeAddedSchemas.forEach((key, value) ->
metaDataPersistService.getDatabaseMetaDataService().persistByAlterConfiguration(databaseName,
key, value));
- }
- toBeAlterSchemas.forEach((key, value) ->
metaDataPersistService.getDatabaseMetaDataService().delete(databaseName, key,
value));
- }
-
- /**
- * Get effective resource meta data.
- *
- * @param database database
- * @param resource resource
- * @return effective resource meta data
- */
- public ResourceMetaData getEffectiveResourceMetaData(final
ShardingSphereDatabase database, final SwitchingResource resource) {
+ private ResourceMetaData getEffectiveResourceMetaData(final
ShardingSphereDatabase database, final SwitchingResource resource) {
Map<StorageNode, DataSource> storageNodes =
getStorageNodes(database.getResourceMetaData().getDataSources(), resource);
Map<String, StorageUnit> storageUnits =
getStorageUnits(database.getResourceMetaData().getStorageUnits(), resource);
return new ResourceMetaData(storageNodes, storageUnits);
@@ -272,63 +178,10 @@ public final class ConfigurationManager {
return result;
}
- @SneakyThrows(Exception.class)
- private void closeStaleRules(final String databaseName) {
- for (ShardingSphereRule each :
metaDataContexts.get().getMetaData().getDatabase(databaseName).getRuleMetaData().getRules())
{
- if (each instanceof AutoCloseable) {
- ((AutoCloseable) each).close();
- }
- }
- }
-
- /**
- * Create meta data contexts.
- *
- * @param databaseName database name
- * @param internalLoadMetaData internal load meta data
- * @param switchingResource switching resource
- * @param ruleConfigs rule configs
- * @return MetaDataContexts meta data contexts
- * @throws SQLException SQL exception
- */
- public MetaDataContexts createMetaDataContexts(final String databaseName,
final boolean internalLoadMetaData,
- final SwitchingResource
switchingResource, final Collection<RuleConfiguration> ruleConfigs) throws
SQLException {
- Map<String, ShardingSphereDatabase> changedDatabases =
createChangedDatabases(databaseName, internalLoadMetaData, switchingResource,
ruleConfigs);
- ConfigurationProperties props =
metaDataContexts.get().getMetaData().getProps();
- RuleMetaData changedGlobalMetaData = new RuleMetaData(
-
GlobalRulesBuilder.buildRules(metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getConfigurations(),
changedDatabases, props));
- return newMetaDataContexts(new
ShardingSphereMetaData(changedDatabases,
metaDataContexts.get().getMetaData().getGlobalResourceMetaData(),
changedGlobalMetaData, props));
- }
-
- /**
- * Create changed databases.
- *
- * @param databaseName database name
- * @param internalLoadMetaData internal load meta data
- * @param switchingResource switching resource
- * @param ruleConfigs rule configs
- * @return ShardingSphere databases
- * @throws SQLException SQL exception
- */
- public synchronized Map<String, ShardingSphereDatabase>
createChangedDatabases(final String databaseName, final boolean
internalLoadMetaData,
-
final SwitchingResource switchingResource, final
Collection<RuleConfiguration> ruleConfigs) throws SQLException {
- ResourceMetaData effectiveResourceMetaData =
getEffectiveResourceMetaData(metaDataContexts.get().getMetaData().getDatabase(databaseName),
switchingResource);
- Collection<RuleConfiguration> toBeCreatedRuleConfigs = null ==
ruleConfigs
- ?
metaDataContexts.get().getMetaData().getDatabase(databaseName).getRuleMetaData().getConfigurations()
- : ruleConfigs;
- DatabaseConfiguration toBeCreatedDatabaseConfig =
getDatabaseConfiguration(effectiveResourceMetaData, switchingResource,
toBeCreatedRuleConfigs);
- ShardingSphereDatabase changedDatabase =
createChangedDatabase(metaDataContexts.get().getMetaData().getDatabase(databaseName).getName(),
internalLoadMetaData,
- metaDataPersistService, toBeCreatedDatabaseConfig,
metaDataContexts.get().getMetaData().getProps(), computeNodeInstanceContext);
- Map<String, ShardingSphereDatabase> result = new
LinkedHashMap<>(metaDataContexts.get().getMetaData().getDatabases());
- result.put(databaseName.toLowerCase(), changedDatabase);
- return result;
- }
-
private DatabaseConfiguration getDatabaseConfiguration(final
ResourceMetaData resourceMetaData, final SwitchingResource switchingResource,
final
Collection<RuleConfiguration> toBeCreatedRuleConfigs) {
- Map<String, DataSourcePoolProperties> propsMap = null ==
switchingResource
- ? resourceMetaData.getStorageUnits().entrySet().stream()
- .collect(Collectors.toMap(Entry::getKey, entry ->
entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) ->
oldValue, LinkedHashMap::new))
+ Map<String, DataSourcePoolProperties> propsMap = null ==
switchingResource ? resourceMetaData.getStorageUnits().entrySet().stream()
+ .collect(Collectors.toMap(Entry::getKey, entry ->
entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) ->
oldValue, LinkedHashMap::new))
: switchingResource.getMergedDataSourcePoolPropertiesMap();
return new
DataSourceProvidedDatabaseConfiguration(getMergedStorageNodeDataSources(resourceMetaData,
switchingResource), toBeCreatedRuleConfigs, propsMap);
}
@@ -349,56 +202,28 @@ public final class ConfigurationManager {
: ExternalMetaDataFactory.create(databaseName, databaseConfig,
props, computeNodeInstanceContext);
}
- private Map<String, ShardingSphereSchema> buildShardingSphereSchemas(final
ShardingSphereDatabase database) {
- Map<String, ShardingSphereSchema> result = new
LinkedHashMap<>(database.getSchemas().size(), 1F);
- database.getSchemas().forEach((key, value) -> result.put(key, new
ShardingSphereSchema(value.getTables(), value.getViews())));
- return result;
+ private Map<String, ShardingSphereDatabase>
buildShardingSphereDatabase(final ShardingSphereDatabase originalDatabase) {
+ return
Collections.singletonMap(originalDatabase.getName().toLowerCase(), new
ShardingSphereDatabase(originalDatabase.getName(),
+ originalDatabase.getProtocolType(),
originalDatabase.getResourceMetaData(), originalDatabase.getRuleMetaData(),
buildSchemas(originalDatabase)));
}
- /**
- * Alter global rule configuration.
- *
- * @param ruleConfig global rule configuration
- */
- public synchronized void alterGlobalRuleConfiguration(final
RuleConfiguration ruleConfig) {
- if (null == ruleConfig) {
- return;
- }
- closeStaleTransactionRule(ruleConfig);
- Collection<ShardingSphereRule> rules = new
LinkedList<>(metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules());
- rules.removeIf(each ->
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
- rules.addAll(GlobalRulesBuilder.buildSingleRules(ruleConfig,
metaDataContexts.get().getMetaData().getDatabases(),
metaDataContexts.get().getMetaData().getProps()));
-
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules().clear();
-
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules().addAll(rules);
- ShardingSphereMetaData toBeChangedMetaData = new
ShardingSphereMetaData(metaDataContexts.get().getMetaData().getDatabases(),
metaDataContexts.get().getMetaData().getGlobalResourceMetaData(),
- metaDataContexts.get().getMetaData().getGlobalRuleMetaData(),
metaDataContexts.get().getMetaData().getProps());
- metaDataContexts.set(newMetaDataContexts(toBeChangedMetaData));
+ private Map<String, ShardingSphereSchema> buildSchemas(final
ShardingSphereDatabase originalDatabase) {
+ Map<String, ShardingSphereSchema> result = new
LinkedHashMap<>(originalDatabase.getSchemas().size(), 1F);
+ originalDatabase.getSchemas().keySet().forEach(schemaName ->
result.put(schemaName.toLowerCase(),
+ new
ShardingSphereSchema(originalDatabase.getSchema(schemaName).getTables(),
+
metaDataPersistService.getDatabaseMetaDataService().getViewMetaDataPersistService().load(originalDatabase.getName(),
schemaName))));
+ return result;
}
- // Optimize string comparison rule type.
@SneakyThrows(Exception.class)
- private void closeStaleTransactionRule(final RuleConfiguration ruleConfig)
{
- YamlRuleConfiguration yamlRuleConfig = new
YamlRuleConfigurationSwapperEngine().swapToYamlRuleConfiguration(ruleConfig);
- if
(!"transaction".equals(Objects.requireNonNull(yamlRuleConfig.getClass().getAnnotation(RepositoryTupleEntity.class)).value()))
{
- return;
- }
- Optional<TransactionRule> transactionRule =
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().findSingleRule(TransactionRule.class);
- if (transactionRule.isPresent()) {
- ((AutoCloseable) transactionRule.get()).close();
+ private void closeStaleRules(final String databaseName) {
+ for (ShardingSphereRule each :
metaDataContexts.get().getMetaData().getDatabase(databaseName).getRuleMetaData().getRules())
{
+ if (each instanceof AutoCloseable) {
+ ((AutoCloseable) each).close();
+ }
}
}
- /**
- * Alter properties.
- *
- * @param props properties to be altered
- */
- public synchronized void alterProperties(final Properties props) {
- ShardingSphereMetaData toBeChangedMetaData = new
ShardingSphereMetaData(metaDataContexts.get().getMetaData().getDatabases(),
metaDataContexts.get().getMetaData().getGlobalResourceMetaData(),
- metaDataContexts.get().getMetaData().getGlobalRuleMetaData(),
new ConfigurationProperties(props));
- metaDataContexts.set(newMetaDataContexts(toBeChangedMetaData));
- }
-
private MetaDataContexts newMetaDataContexts(final ShardingSphereMetaData
metaData) {
return MetaDataContextsFactory.create(metaDataPersistService,
metaData);
}
diff --git
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/subscriber/dispatch/StorageUnitEventSubscriber.java
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/subscriber/dispatch/StorageUnitEventSubscriber.java
index 0e79ac89046..ba45a28bfee 100644
---
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/subscriber/dispatch/StorageUnitEventSubscriber.java
+++
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/event/subscriber/dispatch/StorageUnitEventSubscriber.java
@@ -44,7 +44,7 @@ public final class StorageUnitEventSubscriber implements
EventSubscriber {
.getActiveVersionByFullPath(event.getActiveVersionKey()))) {
return;
}
-
contextManager.getMetaDataContextManager().getConfigurationManager().registerStorageUnit(event.getDatabaseName(),
+
contextManager.getMetaDataContextManager().getStorageUnitManager().registerStorageUnit(event.getDatabaseName(),
contextManager.getPersistServiceFacade().getMetaDataPersistService().getDataSourceUnitService().load(event.getDatabaseName(),
event.getStorageUnitName()));
}
@@ -59,7 +59,7 @@ public final class StorageUnitEventSubscriber implements
EventSubscriber {
.getActiveVersionByFullPath(event.getActiveVersionKey()))) {
return;
}
-
contextManager.getMetaDataContextManager().getConfigurationManager().alterStorageUnit(
+
contextManager.getMetaDataContextManager().getStorageUnitManager().alterStorageUnit(
event.getDatabaseName(),
contextManager.getPersistServiceFacade().getMetaDataPersistService().getDataSourceUnitService().load(event.getDatabaseName(),
event.getStorageUnitName()));
}
@@ -73,6 +73,6 @@ public final class StorageUnitEventSubscriber implements
EventSubscriber {
if
(!contextManager.getMetaDataContexts().getMetaData().containsDatabase(event.getDatabaseName()))
{
return;
}
-
contextManager.getMetaDataContextManager().getConfigurationManager().unregisterStorageUnit(event.getDatabaseName(),
event.getStorageUnitName());
+
contextManager.getMetaDataContextManager().getStorageUnitManager().unregisterStorageUnit(event.getDatabaseName(),
event.getStorageUnitName());
}
}