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 07:41:56 UTC

[shardingsphere] branch master updated: Refactor shadow RDL updater (#26364)

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 7b5ba96cffc Refactor shadow RDL updater (#26364)
7b5ba96cffc is described below

commit 7b5ba96cffccb4872d6fa6e1a1fed223620199a2
Author: ChenJiaHao <Pa...@163.com>
AuthorDate: Thu Jun 15 15:41:48 2023 +0800

    Refactor shadow RDL updater (#26364)
    
    * Refactor shadow RDL updater
    
    * Fix code style
---
 ...DropDefaultShadowAlgorithmStatementUpdater.java |  9 ++++
 .../DropShadowAlgorithmStatementUpdater.java       |  9 ++++
 .../update/DropShadowRuleStatementUpdater.java     | 59 ++++++++++++++++++++++
 .../handler/update/RuleDefinitionDropUpdater.java  | 11 ++++
 .../rdl/rule/NewRuleDefinitionBackendHandler.java  |  2 +
 5 files changed, 90 insertions(+)

diff --git a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmStatementUpdater.java b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmStatementUpdater.java
index dca15348d87..dbd96ab5f32 100644
--- a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmStatementUpdater.java
+++ b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropDefaultShadowAlgorithmStatementUpdater.java
@@ -53,6 +53,15 @@ public final class DropDefaultShadowAlgorithmStatementUpdater implements RuleDef
         return null != currentRuleConfig && null != currentRuleConfig.getDefaultShadowAlgorithmName();
     }
     
+    @Override
+    public ShadowRuleConfiguration buildToBeDroppedRuleConfiguration(final ShadowRuleConfiguration currentRuleConfig, final DropDefaultShadowAlgorithmStatement sqlStatement) {
+        ShadowRuleConfiguration result = new ShadowRuleConfiguration();
+        result.setShadowAlgorithms(Collections.singletonMap(currentRuleConfig.getDefaultShadowAlgorithmName(),
+                currentRuleConfig.getShadowAlgorithms().get(currentRuleConfig.getDefaultShadowAlgorithmName())));
+        result.setDefaultShadowAlgorithmName(currentRuleConfig.getDefaultShadowAlgorithmName());
+        return result;
+    }
+    
     @Override
     public boolean updateCurrentRuleConfiguration(final DropDefaultShadowAlgorithmStatement sqlStatement, final ShadowRuleConfiguration currentRuleConfig) {
         currentRuleConfig.getShadowAlgorithms().remove(currentRuleConfig.getDefaultShadowAlgorithmName());
diff --git a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmStatementUpdater.java b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmStatementUpdater.java
index 3700a9c46a0..32619964c9a 100644
--- a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmStatementUpdater.java
+++ b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowAlgorithmStatementUpdater.java
@@ -77,6 +77,15 @@ public final class DropShadowAlgorithmStatementUpdater implements RuleDefinition
                 && !getIdenticalData(ShadowRuleStatementSupporter.getAlgorithmNames(currentRuleConfig), sqlStatement.getNames()).isEmpty();
     }
     
+    @Override
+    public ShadowRuleConfiguration buildToBeDroppedRuleConfiguration(final ShadowRuleConfiguration currentRuleConfig, final DropShadowAlgorithmStatement sqlStatement) {
+        ShadowRuleConfiguration result = new ShadowRuleConfiguration();
+        for (String each : sqlStatement.getNames()) {
+            result.getShadowAlgorithms().put(each, null);
+        }
+        return result;
+    }
+    
     @Override
     public boolean updateCurrentRuleConfiguration(final DropShadowAlgorithmStatement sqlStatement, final ShadowRuleConfiguration currentRuleConfig) {
         Collection<String> algorithmNames = sqlStatement.getNames();
diff --git a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowRuleStatementUpdater.java b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowRuleStatementUpdater.java
index 69acf2b9840..41eb45727e9 100644
--- a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowRuleStatementUpdater.java
+++ b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/update/DropShadowRuleStatementUpdater.java
@@ -19,14 +19,21 @@ package org.apache.shardingsphere.shadow.distsql.handler.update;
 
 import org.apache.shardingsphere.distsql.handler.exception.rule.MissingRequiredRuleException;
 import org.apache.shardingsphere.distsql.handler.update.RuleDefinitionDropUpdater;
+import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
 import org.apache.shardingsphere.shadow.api.config.datasource.ShadowDataSourceConfiguration;
+import org.apache.shardingsphere.shadow.api.config.table.ShadowTableConfiguration;
 import org.apache.shardingsphere.shadow.distsql.handler.checker.ShadowRuleStatementChecker;
 import org.apache.shardingsphere.shadow.distsql.parser.statement.DropShadowRuleStatement;
 
 import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedHashMap;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Map;
 import java.util.stream.Collectors;
 
 /**
@@ -63,6 +70,58 @@ public final class DropShadowRuleStatementUpdater implements RuleDefinitionDropU
         return isExistRuleConfig(currentRuleConfig) && !getIdenticalData(sqlStatement.getNames(), getDataSourceNames(currentRuleConfig)).isEmpty();
     }
     
+    @Override
+    public ShadowRuleConfiguration buildToBeDroppedRuleConfiguration(final ShadowRuleConfiguration currentRuleConfig, final DropShadowRuleStatement sqlStatement) {
+        Collection<ShadowDataSourceConfiguration> toBeDroppedDataSources = new LinkedList<>();
+        Map<String, ShadowTableConfiguration> toBeDroppedTables = new LinkedHashMap<>();
+        Map<String, AlgorithmConfiguration> toBeDroppedShadowAlgorithms = new HashMap<>();
+        for (String each : sqlStatement.getNames()) {
+            compareAndGetToBeDroppedRule(currentRuleConfig, toBeDroppedDataSources, toBeDroppedTables, toBeDroppedShadowAlgorithms, each, sqlStatement.getNames());
+        }
+        ShadowRuleConfiguration result = new ShadowRuleConfiguration();
+        result.setDataSources(toBeDroppedDataSources);
+        result.setTables(toBeDroppedTables);
+        result.setShadowAlgorithms(toBeDroppedShadowAlgorithms);
+        return result;
+    }
+    
+    private void compareAndGetToBeDroppedRule(final ShadowRuleConfiguration currentRuleConfig, final Collection<ShadowDataSourceConfiguration> toBeDroppedDataSources,
+                                              final Map<String, ShadowTableConfiguration> toBeDroppedTables, final Map<String, AlgorithmConfiguration> toBeDroppedShadowAlgorithms,
+                                              final String toBeDroppedDataSourceName, final Collection<String> toBeDroppedDataSourceNames) {
+        toBeDroppedDataSources.add(new ShadowDataSourceConfiguration(toBeDroppedDataSourceName, null, null));
+        for (Map.Entry<String, ShadowTableConfiguration> each : currentRuleConfig.getTables().entrySet()) {
+            if (toBeDroppedDataSourceNames.containsAll(each.getValue().getDataSourceNames())) {
+                toBeDroppedTables.put(each.getKey(), each.getValue());
+            }
+        }
+        Collection<String> inUsedAlgorithms = currentRuleConfig.getTables().entrySet().stream().filter(each -> !toBeDroppedTables.containsKey(each.getKey()))
+                .flatMap(entry -> entry.getValue().getShadowAlgorithmNames().stream()).collect(Collectors.toSet());
+        if (null != currentRuleConfig.getDefaultShadowAlgorithmName()) {
+            inUsedAlgorithms.add(currentRuleConfig.getDefaultShadowAlgorithmName());
+        }
+        for (String each : currentRuleConfig.getShadowAlgorithms().keySet()) {
+            if (!inUsedAlgorithms.contains(each)) {
+                toBeDroppedShadowAlgorithms.put(each, currentRuleConfig.getShadowAlgorithms().get(each));
+            }
+        }
+    }
+    
+    @Override
+    public ShadowRuleConfiguration buildToBeAlteredRuleConfiguration(final ShadowRuleConfiguration currentRuleConfig, final DropShadowRuleStatement sqlStatement) {
+        Map<String, ShadowTableConfiguration> tables = new LinkedHashMap<>();
+        Collection<String> toBeDroppedDataSourceNames = sqlStatement.getNames();
+        for (Map.Entry<String, ShadowTableConfiguration> each : currentRuleConfig.getTables().entrySet()) {
+            if (!toBeDroppedDataSourceNames.containsAll(each.getValue().getDataSourceNames())) {
+                List<String> currentDataSources = new LinkedList<>(each.getValue().getDataSourceNames());
+                currentDataSources.removeAll(toBeDroppedDataSourceNames);
+                tables.put(each.getKey(), new ShadowTableConfiguration(currentDataSources, null));
+            }
+        }
+        ShadowRuleConfiguration result = new ShadowRuleConfiguration();
+        result.setTables(tables);
+        return result;
+    }
+    
     @Override
     public boolean updateCurrentRuleConfiguration(final DropShadowRuleStatement sqlStatement, final ShadowRuleConfiguration currentRuleConfig) {
         currentRuleConfig.getDataSources().removeIf(each -> sqlStatement.getNames().contains(each.getName()));
diff --git a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/update/RuleDefinitionDropUpdater.java b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/update/RuleDefinitionDropUpdater.java
index 1dfa5c4c355..161ca2f3af8 100644
--- a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/update/RuleDefinitionDropUpdater.java
+++ b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/update/RuleDefinitionDropUpdater.java
@@ -43,6 +43,17 @@ public interface RuleDefinitionDropUpdater<T extends SQLStatement, R extends Rul
         return null;
     }
     
+    /**
+     * Build to be altered rule configuration.
+     *
+     * @param currentRuleConfig current rule configuration to be updated
+     * @param sqlStatement SQL statement
+     * @return to be altered rule configuration
+     */
+    default R buildToBeAlteredRuleConfiguration(R currentRuleConfig, T sqlStatement) {
+        return null;
+    }
+    
     /**
      * Update current rule configuration.
      *
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 7a63e84f1de..5d87ed39e76 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
@@ -111,11 +111,13 @@ public final class NewRuleDefinitionBackendHandler<T extends RuleDefinitionState
             return;
         }
         RuleConfiguration toBeDroppedRuleConfig = updater.buildToBeDroppedRuleConfiguration(currentRuleConfig, sqlStatement);
+        RuleConfiguration toBeAlteredRuleConfig = updater.buildToBeAlteredRuleConfiguration(currentRuleConfig, sqlStatement);
         if (updater.updateCurrentRuleConfiguration(sqlStatement, currentRuleConfig)) {
             database.getRuleMetaData().getConfigurations().remove(currentRuleConfig);
             // TODO remove rule root node
         }
         ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().removeRuleConfiguration(database.getName(), toBeDroppedRuleConfig);
+        ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().alterRuleConfiguration(database.getName(), toBeAlteredRuleConfig);
         if (updater instanceof DropReadwriteSplittingRuleStatementUpdater) {
             database.getRuleMetaData().findSingleRule(StaticDataSourceContainedRule.class)
                     .ifPresent(optional -> ((DropReadwriteSplittingRuleStatement) sqlStatement).getNames().forEach(optional::cleanStorageNodeDataSource));