This is an automated email from the ASF dual-hosted git repository.
panjuan 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 04e74f2d703 Refactor ContextManager.alterResource() (#18978)
04e74f2d703 is described below
commit 04e74f2d703ed75bca398a7e4956a465dc2a3a4c
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Jul 9 21:58:50 2022 +0800
Refactor ContextManager.alterResource() (#18978)
---
.../mode/manager/ContextManager.java | 54 +++-------------------
1 file changed, 6 insertions(+), 48 deletions(-)
diff --git
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 5f150b0c798..4ab18ead561 100644
---
a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++
b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -26,9 +26,7 @@ import
org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
-import
org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator;
import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
-import
org.apache.shardingsphere.infra.datasource.props.DataSourcePropertiesCreator;
import org.apache.shardingsphere.infra.executor.kernel.ExecutorEngine;
import
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContext;
import
org.apache.shardingsphere.infra.federation.optimizer.context.OptimizerContextFactory;
@@ -53,7 +51,6 @@ import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
-import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedList;
import java.util.Map;
@@ -221,52 +218,13 @@ public final class ContextManager implements
AutoCloseable {
* @throws SQLException SQL exception
*/
public synchronized void alterResource(final String databaseName, final
Map<String, DataSourceProperties> toBeAlteredDataSourcePropsMap) throws
SQLException {
- MetaDataContexts changedMetaDataContexts =
buildChangedMetaDataContextWithAlteredDataSource(databaseName,
toBeAlteredDataSourcePropsMap);
- refreshMetaDataContext(databaseName, changedMetaDataContexts);
- metaDataContexts.getPersistService().ifPresent(optional ->
optional.getDataSourceService().append(databaseName,
toBeAlteredDataSourcePropsMap));
- }
-
- private MetaDataContexts
buildChangedMetaDataContextWithAlteredDataSource(final String databaseName,
final Map<String, DataSourceProperties> alteredDataSourceProps) throws
SQLException {
- ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabases().get(databaseName);
- Map<String, DataSource> pendingClosedDataSources =
getChangedDataSources(database, alteredDataSourceProps);
- Map<String, DataSourceProperties> pendingAlteredDataSourceProps =
alteredDataSourceProps.entrySet().stream().filter(entry ->
pendingClosedDataSources.containsKey(entry.getKey()))
- .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
-
pendingClosedDataSources.values().forEach(database.getResource()::close);
- Map<String, DataSource> dataSourceMap = new
HashMap<>(database.getResource().getDataSources());
-
dataSourceMap.putAll(DataSourcePoolCreator.create(pendingAlteredDataSourceProps));
- ConfigurationProperties props =
metaDataContexts.getMetaData().getProps();
- DatabaseConfiguration databaseConfig = new
DataSourceProvidedDatabaseConfiguration(dataSourceMap,
database.getRuleMetaData().getConfigurations());
- Map<String, ShardingSphereDatabase> databases =
ShardingSphereDatabasesFactory.create(Collections.singletonMap(database.getName(),
databaseConfig), props, instanceContext);
- ShardingSphereRuleMetaData globalMetaData = new
ShardingSphereRuleMetaData(
-
GlobalRulesBuilder.buildRules(metaDataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations(),
databases, instanceContext));
- ShardingSphereMetaData metaData = new
ShardingSphereMetaData(databases, globalMetaData, props);
- MetaDataContexts result = newMetaDataContexts(metaData,
OptimizerContextFactory.create(databases, globalMetaData));
- persistMetaData(result);
- return result;
- }
-
- private Map<String, DataSource> getChangedDataSources(final
ShardingSphereDatabase database, final Map<String, DataSourceProperties>
dataSourcePropsMap) {
- Collection<String> changedDataSourceNames =
getChangedDataSourceProperties(database, dataSourcePropsMap).keySet();
- return
database.getResource().getDataSources().entrySet().stream().filter(entry ->
changedDataSourceNames.contains(entry.getKey()))
- .collect(Collectors.toMap(Entry::getKey, Entry::getValue));
- }
-
- private Map<String, DataSourceProperties>
getChangedDataSourceProperties(final ShardingSphereDatabase database, final
Map<String, DataSourceProperties> dataSourcePropsMap) {
- return dataSourcePropsMap.entrySet().stream()
- .filter(entry ->
isModifiedDataSource(database.getResource().getDataSources(), entry.getKey(),
entry.getValue()))
- .collect(Collectors.toMap(Entry::getKey, Entry::getValue,
(oldValue, currentValue) -> oldValue, LinkedHashMap::new));
- }
-
- private boolean isModifiedDataSource(final Map<String, DataSource>
originalDataSources, final String dataSourceName, final DataSourceProperties
dataSourceProps) {
- return originalDataSources.containsKey(dataSourceName) &&
!dataSourceProps.equals(DataSourcePropertiesCreator.create(originalDataSources.get(dataSourceName)));
- }
-
- private void refreshMetaDataContext(final String databaseName, final
MetaDataContexts changedMetaDataContexts) {
-
metaDataContexts.getMetaData().getDatabases().putAll(changedMetaDataContexts.getMetaData().getDatabases());
-
metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().putAll(changedMetaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases());
-
metaDataContexts.getOptimizerContext().getParserContexts().putAll(changedMetaDataContexts.getOptimizerContext().getParserContexts());
-
metaDataContexts.getOptimizerContext().getPlannerContexts().putAll(changedMetaDataContexts.getOptimizerContext().getPlannerContexts());
+ SwitchingResource switchingResource = new
ResourceSwitchManager().create(metaDataContexts.getMetaData().getDatabases().get(databaseName).getResource(),
toBeAlteredDataSourcePropsMap);
+
metaDataContexts.getMetaData().getDatabases().putAll(createChangedDatabases(databaseName,
switchingResource, null));
metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each
->
each.addResource(metaDataContexts.getMetaData().getDatabases().get(databaseName)));
+
metaDataContexts.getOptimizerContext().alterDatabase(metaDataContexts.getMetaData().getDatabases().get(databaseName),
metaDataContexts.getMetaData().getGlobalRuleMetaData());
+ persistMetaData(metaDataContexts);
+ metaDataContexts.getPersistService().ifPresent(optional ->
optional.getDataSourceService().append(databaseName,
toBeAlteredDataSourcePropsMap));
+ switchingResource.closeStaleDataSources();
}
/**