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 <pace2...@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));