This is an automated email from the ASF dual-hosted git repository.
menghaoran 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 e8a6956d313 Keep inused storage node when unregister storage unit
(#31977)
e8a6956d313 is described below
commit e8a6956d313cc5cc48629eb8437b6e7392e7ffb3
Author: Raigor <[email protected]>
AuthorDate: Thu Jul 4 15:42:20 2024 +0800
Keep inused storage node when unregister storage unit (#31977)
---
.../mode/metadata/manager/ResourceSwitchManager.java | 18 +++++++++++++++++-
1 file changed, 17 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 f805f64dc66..ad0cd0567e7 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
@@ -22,11 +22,13 @@ import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePo
import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
import
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNodeAggregator;
+import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnit;
import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUnitNodeMapCreator;
import javax.sql.DataSource;
import java.util.Collection;
import java.util.Collections;
+import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
@@ -118,16 +120,30 @@ public final class ResourceSwitchManager {
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);
for (String each : storageUnitNames) {
if (!resourceMetaData.getStorageUnits().containsKey(each)) {
- return Collections.emptyMap();
+ continue;
}
StorageNode storageNode =
resourceMetaData.getStorageUnits().get(each).getStorageNode();
+ if (isStorageNodeInUsed(reservedStorageUnits, storageNode)) {
+ continue;
+ }
result.put(storageNode,
resourceMetaData.getDataSources().get(storageNode));
}
return result;
}
+ private Map<String, StorageUnit> getReservedStorageUnits(final
ResourceMetaData resourceMetaData, final Collection<String> storageUnitNames) {
+ Map<String, StorageUnit> result = new
HashMap<>(resourceMetaData.getStorageUnits());
+ result.keySet().removeIf(storageUnitNames::contains);
+ return result;
+ }
+
+ private boolean isStorageNodeInUsed(final Map<String, StorageUnit>
reservedStorageUnits, final StorageNode storageNode) {
+ return reservedStorageUnits.values().stream().anyMatch(each ->
each.getStorageNode().equals(storageNode));
+ }
+
private void removeToBeRemovedStorageUnitNames(final ResourceMetaData
resourceMetaData, final Map<String, DataSourcePoolProperties>
dataSourcePoolPropsMap,
final Collection<String>
storageUnitNames) {
for (String each : storageUnitNames) {