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));