This is an automated email from the ASF dual-hosted git repository. jianglongtao pushed a commit to branch fix-33341 in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
commit d619eb465e48ef92a4d6d7f5a9c9868f6fc38756 Author: Raigor <[email protected]> AuthorDate: Thu Sep 5 10:54:57 2024 +0800 Pick #31977, keep inused storage node when unregister storage unit (#9) --- .../mode/manager/switcher/ResourceSwitchManager.java | 20 ++++++++++++++++++-- .../test/e2e/engine/type/dml/BaseDMLE2EIT.java | 18 +++++++++--------- 2 files changed, 27 insertions(+), 11 deletions(-) diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManager.java index ae29706d9a1..101b55c9327 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/ResourceSwitchManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/switcher/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; @@ -117,17 +119,31 @@ public final class ResourceSwitchManager { } private Map<StorageNode, DataSource> getToBeRemovedStaleDataSource(final ResourceMetaData resourceMetaData, final Collection<String> storageUnitNames) { - Map<StorageNode, DataSource> result = new LinkedHashMap<>(); + 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) { diff --git a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dml/BaseDMLE2EIT.java b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dml/BaseDMLE2EIT.java index 7f0f2f62773..20f19106068 100644 --- a/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dml/BaseDMLE2EIT.java +++ b/test/e2e/sql/src/test/java/org/apache/shardingsphere/test/e2e/engine/type/dml/BaseDMLE2EIT.java @@ -88,7 +88,7 @@ public abstract class BaseDMLE2EIT { * @throws IOException IO exception * @throws JAXBException JAXB exception */ - public void init(final E2ETestParameter testParam, Map<String, DataSource> actualDataSourceMap) throws SQLException, IOException, JAXBException { + public void init(final E2ETestParameter testParam, final Map<String, DataSource> actualDataSourceMap) throws SQLException, IOException, JAXBException { dataSetEnvironmentManager = new DataSetEnvironmentManager(new ScenarioDataPath(testParam.getScenario()).getDataSetFile(Type.ACTUAL), actualDataSourceMap); dataSetEnvironmentManager.fillData(); } @@ -220,14 +220,6 @@ public abstract class BaseDMLE2EIT { assertRows(generatedKeys, containerComposer.getGeneratedKeyDataSet().getRows(), databaseType); } - protected void executeDestroySQLs(final SingleE2EContainerComposer containerComposer) throws SQLException { - if (null != containerComposer.getAssertion().getDestroySQL()) { - try (Connection connection = containerComposer.getTargetDataSource().getConnection()) { - executeDestroySQLs(containerComposer, connection); - } - } - } - protected void executeInitSQLs(final SingleE2EContainerComposer containerComposer) throws SQLException { if (null != containerComposer.getAssertion().getInitialSQL()) { try (Connection connection = containerComposer.getTargetDataSource().getConnection()) { @@ -248,6 +240,14 @@ public abstract class BaseDMLE2EIT { } } + protected void executeDestroySQLs(final SingleE2EContainerComposer containerComposer) throws SQLException { + if (null != containerComposer.getAssertion().getDestroySQL()) { + try (Connection connection = containerComposer.getTargetDataSource().getConnection()) { + executeDestroySQLs(containerComposer, connection); + } + } + } + private void executeDestroySQLs(final SingleE2EContainerComposer containerComposer, final Connection connection) throws SQLException { if (null == containerComposer.getAssertion().getDestroySQL().getSql()) { return;
