This is an automated email from the ASF dual-hosted git repository.
jianglongtao 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 ce2d1cbf2cb Fix datasource is not closed after unregister storage unit
(#33585)
ce2d1cbf2cb is described below
commit ce2d1cbf2cb52c06f59799fc3c217eb5a268c349
Author: Haoran Meng <[email protected]>
AuthorDate: Thu Nov 7 17:57:43 2024 +0800
Fix datasource is not closed after unregister storage unit (#33585)
---
.../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 83e663dab17..9a9f11e2056 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
@@ -118,6 +118,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 56dc33523de..afc91244935 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
@@ -161,7 +161,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);