This is an automated email from the ASF dual-hosted git repository.

zhangliang 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 b658f72  Close updated data sources after meta data rebuild (#11642)
b658f72 is described below

commit b658f724fca20c366dabbdc5038c29ad63a1b77d
Author: Haoran Meng <[email protected]>
AuthorDate: Wed Aug 4 21:23:03 2021 +0800

    Close updated data sources after meta data rebuild (#11642)
    
    * Close updated data source after meta data rebuild
    
    * for code style
---
 .../metadata/GovernanceMetaDataContexts.java       | 120 +++++++++++++--------
 .../metadata/resource/ShardingSphereResource.java  |   8 +-
 2 files changed, 81 insertions(+), 47 deletions(-)

diff --git 
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContexts.java
 
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContexts.java
index 5f90037..729bdad 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContexts.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-context/src/main/java/org/apache/shardingsphere/governance/context/metadata/GovernanceMetaDataContexts.java
@@ -51,6 +51,7 @@ import 
org.apache.shardingsphere.infra.lock.InnerLockReleasedEvent;
 import org.apache.shardingsphere.infra.lock.LockNameUtil;
 import org.apache.shardingsphere.infra.lock.ShardingSphereLock;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
+import 
org.apache.shardingsphere.infra.metadata.resource.ShardingSphereResource;
 import 
org.apache.shardingsphere.infra.metadata.rule.ShardingSphereRuleMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.ShardingSphereSchema;
 import org.apache.shardingsphere.infra.optimize.context.OptimizeContextFactory;
@@ -242,8 +243,8 @@ public final class GovernanceMetaDataContexts implements 
MetaDataContexts {
             Map<String, ShardingSphereMetaData> newMetaDataMap = new 
HashMap<>(metaDataContexts.getMetaDataMap().size(), 1);
             for (Entry<String, ShardingSphereMetaData> entry : 
metaDataContexts.getMetaDataMap().entrySet()) {
                 String schemaName = entry.getKey();
-                ShardingSphereMetaData oldMetaData = entry.getValue();
-                ShardingSphereMetaData newMetaData = 
event.getSchemaName().equals(schemaName) ? getChangedMetaData(oldMetaData, 
event.getSchema(), schemaName) : oldMetaData;
+                ShardingSphereMetaData originalMetaData = entry.getValue();
+                ShardingSphereMetaData newMetaData = 
event.getSchemaName().equals(schemaName) ? getChangedMetaData(originalMetaData, 
event.getSchema(), schemaName) : originalMetaData;
                 newMetaDataMap.put(schemaName, newMetaData);
                 
metaDataContexts.getOptimizeContextFactory().getSchemaMetadatas().getSchemas().put(event.getSchemaName(),
                         new FederateSchemaMetadata(event.getSchemaName(), 
newMetaData.getSchema().getTables()));
@@ -265,7 +266,7 @@ public final class GovernanceMetaDataContexts implements 
MetaDataContexts {
     public synchronized void renew(final RuleConfigurationsChangedEvent event) 
throws SQLException {
         String schemaName = event.getSchemaName();
         ShardingSphereMetaData metaData = 
getChangedMetaData(metaDataContexts.getMetaDataMap().get(schemaName), 
event.getRuleConfigurations());
-        Map<String, ShardingSphereMetaData> newMetaDataMap = 
getNewMetaData(schemaName, metaData);
+        Map<String, ShardingSphereMetaData> newMetaDataMap = 
rebuildSchemaMetaData(schemaName, metaData);
         metaDataContexts = new 
StandardMetaDataContexts(distMetaDataPersistService, newMetaDataMap, 
metaDataContexts.getGlobalRuleMetaData(), metaDataContexts.getExecutorEngine(),
                 metaDataContexts.getProps(), 
metaDataContexts.getOptimizeContextFactory());
         
distMetaDataPersistService.getSchemaMetaDataService().persist(schemaName, 
newMetaDataMap.get(schemaName).getSchema());
@@ -280,12 +281,14 @@ public final class GovernanceMetaDataContexts implements 
MetaDataContexts {
     @Subscribe
     public synchronized void renew(final DataSourceChangedEvent event) throws 
SQLException {
         String schemaName = event.getSchemaName();
-        ShardingSphereMetaData metaData = 
getChangedMetaData(metaDataContexts.getMetaDataMap().get(schemaName), 
event.getDataSourceConfigurations());
-        Map<String, ShardingSphereMetaData> newMetaDataMap = 
getNewMetaData(schemaName, metaData);
-        metaDataContexts = new 
StandardMetaDataContexts(distMetaDataPersistService, newMetaDataMap, 
+        Collection<DataSource> pendingClosedDataSources = 
getPendingClosedDataSources(schemaName, event.getDataSourceConfigurations());
+        ShardingSphereMetaData metaData = 
rebuildMetaData(metaDataContexts.getMetaDataMap().get(schemaName), 
event.getDataSourceConfigurations());
+        Map<String, ShardingSphereMetaData> schemaMetaData = 
rebuildSchemaMetaData(schemaName, metaData);
+        metaDataContexts = new 
StandardMetaDataContexts(distMetaDataPersistService, schemaMetaData, 
                 metaDataContexts.getGlobalRuleMetaData(), 
metaDataContexts.getExecutorEngine(), metaDataContexts.getProps(), 
metaDataContexts.getOptimizeContextFactory());
         ShardingSphereEventBus.getInstance().post(new 
DataSourceChangeCompletedEvent(event.getSchemaName(),
-                
metaDataContexts.getMetaDataMap().get(event.getSchemaName()).getResource().getDatabaseType(),
 newMetaDataMap.get(event.getSchemaName()).getResource().getDataSources()));
+                
metaDataContexts.getMetaDataMap().get(event.getSchemaName()).getResource().getDatabaseType(),
 schemaMetaData.get(event.getSchemaName()).getResource().getDataSources()));
+        closeDataSources(schemaName, pendingClosedDataSources);
     }
     
     /**
@@ -336,13 +339,11 @@ public final class GovernanceMetaDataContexts implements 
MetaDataContexts {
         }
     }
 
-    private Map<String, ShardingSphereMetaData> getNewMetaData(final String 
schemaName, final ShardingSphereMetaData metaData) {
-        Map<String, ShardingSphereMetaData> newMetaDataMap = new 
HashMap<>(metaDataContexts.getMetaDataMap());
-        newMetaDataMap.remove(schemaName);
-        newMetaDataMap.put(schemaName, metaData);
-        
metaDataContexts.getOptimizeContextFactory().getSchemaMetadatas().getSchemas().remove(schemaName);
+    private Map<String, ShardingSphereMetaData> rebuildSchemaMetaData(final 
String schemaName, final ShardingSphereMetaData metaData) {
+        Map<String, ShardingSphereMetaData> result = new 
HashMap<>(metaDataContexts.getMetaDataMap());
+        result.put(schemaName, metaData);
         
metaDataContexts.getOptimizeContextFactory().getSchemaMetadatas().getSchemas().put(schemaName,
 new FederateSchemaMetadata(schemaName, metaData.getSchema().getTables()));
-        return newMetaDataMap;
+        return result;
     }
     
     private void persistSchema(final String schemaName) {
@@ -360,63 +361,90 @@ public final class GovernanceMetaDataContexts implements 
MetaDataContexts {
                 
metaDataContexts.getProps().getProps()).build(distMetaDataPersistService).getMetaData(schemaName);
     }
     
-    private ShardingSphereMetaData getChangedMetaData(final 
ShardingSphereMetaData oldMetaData, final ShardingSphereSchema schema, final 
String schemaName) {
+    private ShardingSphereMetaData getChangedMetaData(final 
ShardingSphereMetaData originalMetaData, final ShardingSphereSchema schema, 
final String schemaName) {
         // TODO refresh table addressing mapper
-        return new ShardingSphereMetaData(schemaName, 
oldMetaData.getResource(), oldMetaData.getRuleMetaData(), schema);
+        return new ShardingSphereMetaData(schemaName, 
originalMetaData.getResource(), originalMetaData.getRuleMetaData(), schema);
     }
     
-    private ShardingSphereMetaData getChangedMetaData(final 
ShardingSphereMetaData oldMetaData, final Collection<RuleConfiguration> 
ruleConfigs) throws SQLException {
-        MetaDataContextsBuilder builder = new 
MetaDataContextsBuilder(Collections.singletonMap(oldMetaData.getName(), 
oldMetaData.getResource().getDataSources()),
-                Collections.singletonMap(oldMetaData.getName(), ruleConfigs), 
distMetaDataPersistService.getGlobalRuleService().load(), 
metaDataContexts.getProps().getProps());
+    private ShardingSphereMetaData getChangedMetaData(final 
ShardingSphereMetaData originalMetaData, final Collection<RuleConfiguration> 
ruleConfigs) throws SQLException {
+        MetaDataContextsBuilder builder = new 
MetaDataContextsBuilder(Collections.singletonMap(originalMetaData.getName(), 
originalMetaData.getResource().getDataSources()),
+                Collections.singletonMap(originalMetaData.getName(), 
ruleConfigs), distMetaDataPersistService.getGlobalRuleService().load(), 
metaDataContexts.getProps().getProps());
         return 
builder.build(distMetaDataPersistService).getMetaDataMap().values().iterator().next();
     }
     
-    private ShardingSphereMetaData getChangedMetaData(final 
ShardingSphereMetaData oldMetaData, final Map<String, DataSourceConfiguration> 
newDataSourceConfigs) throws SQLException {
-        Collection<String> deletedDataSources = 
getDeletedDataSources(oldMetaData, newDataSourceConfigs);
-        Map<String, DataSource> modifiedDataSources = 
getModifiedDataSources(oldMetaData, newDataSourceConfigs);
-        oldMetaData.getResource().close(deletedDataSources);
-        oldMetaData.getResource().close(modifiedDataSources.keySet());
-        Map<String, Map<String, DataSource>> dataSourcesMap = 
Collections.singletonMap(oldMetaData.getName(), 
-                getNewDataSources(oldMetaData.getResource().getDataSources(), 
getAddedDataSources(oldMetaData, newDataSourceConfigs), modifiedDataSources, 
deletedDataSources));
-        return new MetaDataContextsBuilder(dataSourcesMap, 
Collections.singletonMap(oldMetaData.getName(), 
-                oldMetaData.getRuleMetaData().getConfigurations()), 
distMetaDataPersistService.getGlobalRuleService().load(),
-                
metaDataContexts.getProps().getProps()).build(distMetaDataPersistService).getMetaDataMap().get(oldMetaData.getName());
+    private ShardingSphereMetaData rebuildMetaData(final 
ShardingSphereMetaData originalMetaData, final Map<String, 
DataSourceConfiguration> newDataSourceConfigs) throws SQLException {
+        Collection<String> deletedDataSources = 
getDeletedDataSources(originalMetaData, newDataSourceConfigs).keySet();
+        Map<String, DataSource> changedDataSources = 
buildChangedDataSources(originalMetaData, newDataSourceConfigs);
+        Map<String, Map<String, DataSource>> dataSourcesMap = 
Collections.singletonMap(originalMetaData.getName(), 
+                
getNewDataSources(originalMetaData.getResource().getDataSources(), 
getAddedDataSources(originalMetaData, newDataSourceConfigs), 
changedDataSources, deletedDataSources));
+        return new MetaDataContextsBuilder(dataSourcesMap, 
Collections.singletonMap(originalMetaData.getName(),
+                originalMetaData.getRuleMetaData().getConfigurations()), 
distMetaDataPersistService.getGlobalRuleService().load(),
+                
metaDataContexts.getProps().getProps()).build(distMetaDataPersistService).getMetaData(originalMetaData.getName());
     }
     
-    private Map<String, DataSource> getNewDataSources(final Map<String, 
DataSource> oldDataSources, 
-                                                      final Map<String, 
DataSource> addedDataSources, final Map<String, DataSource> 
modifiedDataSources, final Collection<String> deletedDataSources) {
-        Map<String, DataSource> result = new LinkedHashMap<>(oldDataSources);
+    private Map<String, DataSource> getNewDataSources(final Map<String, 
DataSource> originalDataSources, 
+                                                      final Map<String, 
DataSource> addedDataSources, final Map<String, DataSource> changedDataSources, 
final Collection<String> deletedDataSources) {
+        Map<String, DataSource> result = new 
LinkedHashMap<>(originalDataSources);
         result.keySet().removeAll(deletedDataSources);
-        result.keySet().removeAll(modifiedDataSources.keySet());
-        result.putAll(modifiedDataSources);
+        result.putAll(changedDataSources);
         result.putAll(addedDataSources);
         return result;
     }
     
-    private Collection<String> getDeletedDataSources(final 
ShardingSphereMetaData oldMetaData, final Map<String, DataSourceConfiguration> 
newDataSourceConfigs) {
-        Collection<String> result = new 
LinkedList<>(oldMetaData.getResource().getDataSources().keySet());
-        result.removeAll(newDataSourceConfigs.keySet());
-        return result;
+    private Map<String, DataSource> getDeletedDataSources(final 
ShardingSphereMetaData originalMetaData, final Map<String, 
DataSourceConfiguration> newDataSourceConfigs) {
+        return 
originalMetaData.getResource().getDataSources().entrySet().stream().filter(entry
 -> !newDataSourceConfigs.containsKey(entry.getKey()))
+                .collect(Collectors.toMap(entry -> entry.getKey(), entry -> 
entry.getValue()));
+    }
+    
+    private Map<String, DataSource> getChangedDataSources(final 
ShardingSphereMetaData originalMetaData, final Map<String, 
DataSourceConfiguration> newDataSourceConfigs) {
+        Collection<String> changedDataSourceNames = 
getChangedDataSourceConfiguration(originalMetaData, 
newDataSourceConfigs).keySet();
+        return 
originalMetaData.getResource().getDataSources().entrySet().stream().filter(entry
 -> changedDataSourceNames.contains(entry.getKey()))
+                .collect(Collectors.toMap(entry -> entry.getKey(), entry -> 
entry.getValue()));
     }
     
-    private Map<String, DataSource> getAddedDataSources(final 
ShardingSphereMetaData oldMetaData, final Map<String, DataSourceConfiguration> 
newDataSourceConfigs) {
-        return 
DataSourceConverter.getDataSourceMap(Maps.filterKeys(newDataSourceConfigs, each 
-> !oldMetaData.getResource().getDataSources().containsKey(each)));
+    private Map<String, DataSource> getAddedDataSources(final 
ShardingSphereMetaData originalMetaData, final Map<String, 
DataSourceConfiguration> newDataSourceConfigs) {
+        return 
DataSourceConverter.getDataSourceMap(Maps.filterKeys(newDataSourceConfigs, each 
-> !originalMetaData.getResource().getDataSources().containsKey(each)));
     }
     
-    private Map<String, DataSource> getModifiedDataSources(final 
ShardingSphereMetaData oldMetaData, final Map<String, DataSourceConfiguration> 
newDataSourceConfigs) {
-        Map<String, DataSourceConfiguration> modifiedDataSourceConfigs = 
newDataSourceConfigs.entrySet().stream()
-                .filter(entry -> 
isModifiedDataSource(oldMetaData.getResource().getDataSources(), 
entry.getKey(), entry.getValue()))
+    private Map<String, DataSourceConfiguration> 
getChangedDataSourceConfiguration(final ShardingSphereMetaData 
originalMetaData, 
+                                                                               
     final Map<String, DataSourceConfiguration> dataSourceConfigurations) {
+        return dataSourceConfigurations.entrySet().stream()
+                .filter(entry -> 
isModifiedDataSource(originalMetaData.getResource().getDataSources(), 
entry.getKey(), entry.getValue()))
                 .collect(Collectors.toMap(Entry::getKey, Entry::getValue, 
(oldValue, currentValue) -> oldValue, LinkedHashMap::new));
-        return DataSourceConverter.getDataSourceMap(modifiedDataSourceConfigs);
     }
     
-    private boolean isModifiedDataSource(final Map<String, DataSource> 
oldDataSources, final String newDataSourceName, final DataSourceConfiguration 
newDataSourceConfig) {
-        DataSourceConfiguration dataSourceConfig = 
DataSourceConverter.getDataSourceConfigurationMap(oldDataSources).get(newDataSourceName);
-        return null != dataSourceConfig && 
!newDataSourceConfig.equals(dataSourceConfig);
+    private Map<String, DataSource> buildChangedDataSources(final 
ShardingSphereMetaData originalMetaData, final Map<String, 
DataSourceConfiguration> newDataSourceConfigs) {
+        return 
DataSourceConverter.getDataSourceMap(getChangedDataSourceConfiguration(originalMetaData,
 newDataSourceConfigs));
+    }
+    
+    private boolean isModifiedDataSource(final Map<String, DataSource> 
originalDataSources, final String dataSourceName, final DataSourceConfiguration 
dataSourceConfiguration) {
+        DataSourceConfiguration dataSourceConfig = 
DataSourceConverter.getDataSourceConfigurationMap(originalDataSources).get(dataSourceName);
+        return null != dataSourceConfig && 
!dataSourceConfiguration.equals(dataSourceConfig);
     }
     
     private Map<String, Map<String, DataSource>> createDataSourcesMap(final 
Map<String, Map<String, DataSourceConfiguration>> dataSourcesConfigs) {
         return 
dataSourcesConfigs.entrySet().stream().collect(Collectors.toMap(Entry::getKey, 
             entry -> DataSourceConverter.getDataSourceMap(entry.getValue())));
     }
+    
+    private Collection<DataSource> getPendingClosedDataSources(final String 
schemaName, final Map<String, DataSourceConfiguration> 
dataSourceConfigurations) {
+        Collection<DataSource> result = new LinkedList<>();
+        
result.addAll(getDeletedDataSources(metaDataContexts.getMetaData(schemaName), 
dataSourceConfigurations).values());
+        
result.addAll(getChangedDataSources(metaDataContexts.getMetaData(schemaName), 
dataSourceConfigurations).values());
+        return result;
+    }
+    
+    private void closeDataSources(final String schemaName, final 
Collection<DataSource> dataSources) {
+        ShardingSphereResource resource = 
metaDataContexts.getMetaData(schemaName).getResource();
+        dataSources.forEach(each -> closeDataSource(resource, each));
+    }
+    
+    private void closeDataSource(final ShardingSphereResource resource, final 
DataSource dataSource) {
+        try {
+            resource.close(dataSource);
+            // CHECKSTYLE:OFF
+        } catch (final Exception ignore) {
+            // CHECKSTYLE:ON
+        }
+    }
 }
diff --git 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/resource/ShardingSphereResource.java
 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/resource/ShardingSphereResource.java
index d7d7107..0c8c5de 100644
--- 
a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/resource/ShardingSphereResource.java
+++ 
b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/resource/ShardingSphereResource.java
@@ -74,7 +74,13 @@ public final class ShardingSphereResource {
         }
     }
     
-    private void close(final DataSource dataSource) throws SQLException {
+    /**
+     * Close data source.
+     *
+     * @param dataSource data source to be closed
+     * @throws SQLException exception
+     */
+    public void close(final DataSource dataSource) throws SQLException {
         if (dataSource instanceof AutoCloseable) {
             try {
                 ((AutoCloseable) dataSource).close();

Reply via email to