This is an automated email from the ASF dual-hosted git repository. jiangmaolin pushed a commit to branch dev-5.5.1 in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
commit becb9e1d4c9359300704898bd4422af70912b2d5 Author: Haoran Meng <[email protected]> AuthorDate: Thu Nov 7 17:57:43 2024 +0800 Fix datasource is not closed after unregister storage unit (#33585) (cherry picked from commit ce2d1cbf2cb52c06f59799fc3c217eb5a268c349) --- .../mode/metadata/manager/ResourceSwitchManager.java | 15 +++++++++++++++ .../persist/ClusterMetaDataManagerPersistService.java | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ResourceSwitchManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ResourceSwitchManager.java index 03eecd368ed..ade852c8c18 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ResourceSwitchManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ResourceSwitchManager.java @@ -130,6 +130,21 @@ public final class ResourceSwitchManager { return result; } + /** + * create switching resource by unregister storage unit. + * + * @param resourceMetaData resource meta data + * @param storageUnitNames storage unit names + * @return created switching resource + */ + public SwitchingResource createByUnregisterStorageUnit(final ResourceMetaData resourceMetaData, final Collection<String> storageUnitNames) { + Map<String, DataSourcePoolProperties> mergedDataSourcePoolPropertiesMap = new LinkedHashMap<>(resourceMetaData.getStorageUnits().entrySet().stream() + .collect(Collectors.toMap(Entry::getKey, entry -> entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) -> oldValue, LinkedHashMap::new))); + storageUnitNames.forEach(mergedDataSourcePoolPropertiesMap::remove); + return new SwitchingResource(Collections.emptyMap(), + getToBeRemovedStaleDataSource(resourceMetaData, storageUnitNames), storageUnitNames, mergedDataSourcePoolPropertiesMap); + } + private Map<StorageNode, DataSource> getToBeRemovedStaleDataSource(final ResourceMetaData resourceMetaData, final Collection<String> storageUnitNames) { Map<StorageNode, DataSource> result = new LinkedHashMap<>(storageUnitNames.size(), 1F); Map<String, StorageUnit> reservedStorageUnits = getReservedStorageUnits(resourceMetaData, storageUnitNames); diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java index a2e915c4b84..cbe81caa91a 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java @@ -172,7 +172,7 @@ public final class ClusterMetaDataManagerPersistService implements MetaDataManag for (String each : getToBeDroppedResourceNames(databaseName, toBeDroppedStorageUnitNames)) { MetaDataContexts originalMetaDataContexts = metaDataContextManager.getMetaDataContexts().get(); SwitchingResource switchingResource = metaDataContextManager.getResourceSwitchManager() - .switchByUnregisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(), Collections.singletonList(each)); + .createByUnregisterStorageUnit(originalMetaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(), Collections.singletonList(each)); MetaDataContexts reloadMetaDataContexts = MetaDataContextsFactory.createBySwitchResource(databaseName, false, switchingResource, originalMetaDataContexts, metaDataPersistService, metaDataContextManager.getComputeNodeInstanceContext()); metaDataPersistService.getDataSourceUnitService().delete(databaseName, each);
