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 626c1d765fb Adjust methods order for ContextManager (#18929)
626c1d765fb is described below
commit 626c1d765fbf62935b1b3460f93fe0464569e9e1
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Jul 7 15:50:59 2022 +0800
Adjust methods order for ContextManager (#18929)
---
.../mode/manager/ContextManager.java | 146 ++++++++++-----------
1 file changed, 69 insertions(+), 77 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 d16d040aabb..37d63d132ab 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
@@ -201,26 +201,86 @@ public final class ContextManager implements
AutoCloseable {
* Add resource.
*
* @param databaseName database name
- * @param toBeAddedDataSourcePropsMap data source properties map
+ * @param toBeAddedDataSourcePropsMap to be added data source properties
map
* @throws SQLException SQL exception
*/
public synchronized void addResource(final String databaseName, final
Map<String, DataSourceProperties> toBeAddedDataSourcePropsMap) throws
SQLException {
- refreshMetaDataContextForAddResource(databaseName,
toBeAddedDataSourcePropsMap);
+ MetaDataContexts changedMetaDataContexts =
buildChangedMetaDataContextWithAddedDataSource(databaseName,
toBeAddedDataSourcePropsMap);
+ refreshMetaDataContext(databaseName, changedMetaDataContexts);
metaDataContexts.getPersistService().ifPresent(optional ->
optional.getDataSourceService().append(databaseName,
toBeAddedDataSourcePropsMap));
}
+ private MetaDataContexts
buildChangedMetaDataContextWithAddedDataSource(final String databaseName, final
Map<String, DataSourceProperties> addedDataSourceProps) throws SQLException {
+ ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabases().get(databaseName);
+ Map<String, DataSource> dataSourceMap = new
HashMap<>(database.getResource().getDataSources());
+
dataSourceMap.putAll(DataSourcePoolCreator.create(addedDataSourceProps));
+ 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;
+ }
+
/**
* Alter resource.
*
* @param databaseName database name
- * @param toBeAlteredDataSourcePropsMap data source properties map
+ * @param toBeAlteredDataSourcePropsMap to be altered data source
properties map
* @throws SQLException SQL exception
*/
public synchronized void alterResource(final String databaseName, final
Map<String, DataSourceProperties> toBeAlteredDataSourcePropsMap) throws
SQLException {
- refreshMetaDataContextForAlterResource(databaseName,
toBeAlteredDataSourcePropsMap);
+ 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());
+
metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each
->
each.addResource(metaDataContexts.getMetaData().getDatabases().get(databaseName)));
+ }
+
/**
* Drop resource.
*
@@ -385,6 +445,11 @@ public final class ContextManager implements AutoCloseable
{
return currentSchemas.entrySet().stream().filter(entry ->
!reloadedDatabase.getSchemas().containsKey(entry.getKey())).collect(Collectors.toMap(Entry::getKey,
Entry::getValue));
}
+ private void persistMetaData(final MetaDataContexts metaDataContexts) {
+ metaDataContexts.getMetaData().getDatabases().forEach((databaseName,
schemas) -> schemas.getSchemas()
+ .forEach((schemaName, tables) ->
metaDataContexts.getPersistService().ifPresent(optional ->
optional.getDatabaseMetaDataService().persistMetaData(databaseName, schemaName,
tables))));
+ }
+
/**
* Reload schema.
*
@@ -461,79 +526,6 @@ public final class ContextManager implements AutoCloseable
{
}
}
- 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(Map.Entry::getKey,
Map.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(Map.Entry::getKey,
Map.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 refreshMetaDataContextForAddResource(final String
databaseName, final Map<String, DataSourceProperties> dataSourcePropsMap)
throws SQLException {
- MetaDataContexts changedMetaDataContexts =
buildChangedMetaDataContextWithAddedDataSource(databaseName,
dataSourcePropsMap);
- refreshMetaDataContext(databaseName, changedMetaDataContexts);
- }
-
- private void refreshMetaDataContextForAlterResource(final String
databaseName, final Map<String, DataSourceProperties> dataSourcePropsMap)
throws SQLException {
- MetaDataContexts changedMetaDataContexts =
buildChangedMetaDataContextWithAlteredDataSource(databaseName,
dataSourcePropsMap);
- refreshMetaDataContext(databaseName, changedMetaDataContexts);
- }
-
- 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());
-
metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each
->
each.addResource(metaDataContexts.getMetaData().getDatabases().get(databaseName)));
- }
-
- private MetaDataContexts
buildChangedMetaDataContextWithAddedDataSource(final String databaseName, final
Map<String, DataSourceProperties> addedDataSourceProps) throws SQLException {
- ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabases().get(databaseName);
- Map<String, DataSource> dataSourceMap = new
HashMap<>(database.getResource().getDataSources());
-
dataSourceMap.putAll(DataSourcePoolCreator.create(addedDataSourceProps));
- 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 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(Map.Entry::getKey,
Map.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 void persistMetaData(final MetaDataContexts metaDataContexts) {
- metaDataContexts.getMetaData().getDatabases().forEach((databaseName,
schemas) -> schemas.getSchemas()
- .forEach((schemaName, tables) ->
metaDataContexts.getPersistService().ifPresent(optional ->
optional.getDatabaseMetaDataService().persistMetaData(databaseName, schemaName,
tables))));
- }
-
@Override
public void close() throws Exception {
executorEngine.close();