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 <[email protected]>
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));