You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by ji...@apache.org on 2023/06/15 09:52:58 UTC

[shardingsphere] branch master updated: Fix ReadwriteSplittingRule statement updater (#26369)

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 e3b42c966b2 Fix ReadwriteSplittingRule statement updater (#26369)
e3b42c966b2 is described below

commit e3b42c966b28f1e2bd415f7226029dd9dff9f510
Author: ChenJiaHao <Pa...@163.com>
AuthorDate: Thu Jun 15 17:52:48 2023 +0800

    Fix ReadwriteSplittingRule statement updater (#26369)
---
 ...AlterReadwriteSplittingRuleStatementUpdater.java | 12 +++---------
 .../DropReadwriteSplittingRuleStatementUpdater.java | 21 +++++++++++----------
 .../rdl/rule/NewRuleDefinitionBackendHandler.java   |  2 +-
 3 files changed, 15 insertions(+), 20 deletions(-)

diff --git a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleStatementUpdater.java b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleStatementUpdater.java
index 67623670690..0cfa36e952f 100644
--- a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleStatementUpdater.java
+++ b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleStatementUpdater.java
@@ -33,7 +33,6 @@ import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -55,17 +54,12 @@ public final class AlterReadwriteSplittingRuleStatementUpdater implements RuleDe
     public ReadwriteSplittingRuleConfiguration buildToBeDroppedRuleConfiguration(final ReadwriteSplittingRuleConfiguration currentRuleConfig,
                                                                                  final ReadwriteSplittingRuleConfiguration toBeAlteredRuleConfig) {
         Collection<ReadwriteSplittingDataSourceRuleConfiguration> dataSources = new LinkedList<>();
+        Map<String, AlgorithmConfiguration> loadBalancers = new HashMap<>();
         List<String> toBeAlteredDataSourceNames = toBeAlteredRuleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toList());
         for (ReadwriteSplittingDataSourceRuleConfiguration each : currentRuleConfig.getDataSources()) {
-            if (!toBeAlteredDataSourceNames.contains(each.getName())) {
+            if (toBeAlteredDataSourceNames.contains(each.getName())) {
                 dataSources.add(each);
-            }
-        }
-        Map<String, AlgorithmConfiguration> loadBalancers = new HashMap<>();
-        for (String each : currentRuleConfig.getLoadBalancers().keySet()) {
-            Set<String> toBeAlteredLoadBalancerNames = toBeAlteredRuleConfig.getLoadBalancers().keySet();
-            if (!toBeAlteredLoadBalancerNames.contains(each)) {
-                loadBalancers.put(each, null);
+                loadBalancers.put(each.getLoadBalancerName(), null);
             }
         }
         return new ReadwriteSplittingRuleConfiguration(dataSources, loadBalancers);
diff --git a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleStatementUpdater.java b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleStatementUpdater.java
index cfc2deb7496..f5c8c638fa6 100644
--- a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleStatementUpdater.java
+++ b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleStatementUpdater.java
@@ -40,6 +40,7 @@ import java.util.LinkedList;
 import java.util.Map;
 import java.util.Objects;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -98,20 +99,20 @@ public final class DropReadwriteSplittingRuleStatementUpdater implements RuleDef
     public ReadwriteSplittingRuleConfiguration buildToBeDroppedRuleConfiguration(final ReadwriteSplittingRuleConfiguration currentRuleConfig, final DropReadwriteSplittingRuleStatement sqlStatement) {
         Collection<ReadwriteSplittingDataSourceRuleConfiguration> toBeDroppedDataSources = new LinkedList<>();
         Map<String, AlgorithmConfiguration> toBeDroppedLoadBalancers = new HashMap<>();
-        for (String each : sqlStatement.getNames()) {
-            compareAndGetToBeDroppedRule(currentRuleConfig, toBeDroppedDataSources, toBeDroppedLoadBalancers, each, sqlStatement.getNames());
-        }
+        sqlStatement.getNames().forEach(each -> toBeDroppedDataSources.add(new ReadwriteSplittingDataSourceRuleConfiguration(each, null, null, null)));
+        compareAndGetToBeDroppedLoadBalancers(currentRuleConfig, sqlStatement.getNames(), toBeDroppedLoadBalancers);
         return new ReadwriteSplittingRuleConfiguration(toBeDroppedDataSources, toBeDroppedLoadBalancers);
     }
     
-    private void compareAndGetToBeDroppedRule(final ReadwriteSplittingRuleConfiguration currentRuleConfig, final Collection<ReadwriteSplittingDataSourceRuleConfiguration> toBeDroppedDataSources,
-                                              final Map<String, AlgorithmConfiguration> toBeDroppedLoadBalancers, final String toBeDroppedDataSourceName, final Collection<String> dataSourceNames) {
-        toBeDroppedDataSources.add(new ReadwriteSplittingDataSourceRuleConfiguration(toBeDroppedDataSourceName, null, null, null));
-        currentRuleConfig.getDataSources().stream().filter(dataSource -> toBeDroppedDataSourceName.equals(dataSource.getName())).findAny().ifPresent(toBeDroppedDataSourceRuleConfig -> {
-            if (null != toBeDroppedDataSourceRuleConfig.getLoadBalancerName() && isLoadBalancerNotInUse(currentRuleConfig, toBeDroppedDataSourceRuleConfig.getLoadBalancerName(), dataSourceNames)) {
-                toBeDroppedLoadBalancers.put(toBeDroppedDataSourceRuleConfig.getLoadBalancerName(), currentRuleConfig.getLoadBalancers().get(toBeDroppedDataSourceRuleConfig.getLoadBalancerName()));
+    private void compareAndGetToBeDroppedLoadBalancers(final ReadwriteSplittingRuleConfiguration currentRuleConfig, final Collection<String> toBeDroppedDataSourceNames,
+                                                       final Map<String, AlgorithmConfiguration> toBeDroppedLoadBalancers) {
+        Set<String> inUsedLoadBalancers = currentRuleConfig.getDataSources().stream().filter(dataSource -> !toBeDroppedDataSourceNames.contains(dataSource.getName()))
+                .map(ReadwriteSplittingDataSourceRuleConfiguration::getLoadBalancerName).collect(Collectors.toSet());
+        for (String each : currentRuleConfig.getLoadBalancers().keySet()) {
+            if (!inUsedLoadBalancers.contains(each)) {
+                toBeDroppedLoadBalancers.put(each, null);
             }
-        });
+        }
     }
     
     @Override
diff --git a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
index 5d87ed39e76..d0a988c1226 100644
--- a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
+++ b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/NewRuleDefinitionBackendHandler.java
@@ -101,8 +101,8 @@ public final class NewRuleDefinitionBackendHandler<T extends RuleDefinitionState
         RuleConfiguration toBeAlteredRuleConfig = updater.buildToBeAlteredRuleConfiguration(sqlStatement);
         RuleConfiguration toBeDroppedRuleConfig = updater.buildToBeDroppedRuleConfiguration(currentRuleConfig, toBeAlteredRuleConfig);
         updater.updateCurrentRuleConfiguration(currentRuleConfig, toBeAlteredRuleConfig);
-        ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().alterRuleConfiguration(database.getName(), toBeAlteredRuleConfig);
         ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().removeRuleConfiguration(database.getName(), toBeDroppedRuleConfig);
+        ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().alterRuleConfiguration(database.getName(), toBeAlteredRuleConfig);
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})