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 2022/09/25 03:26:48 UTC
[shardingsphere] branch master updated: Enhanced validation of Alter Sharding Binding Table Rules. (#21167)
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 ed8429de0bc Enhanced validation of Alter Sharding Binding Table Rules. (#21167)
ed8429de0bc is described below
commit ed8429de0bc21f450e7d9b94190d11b4d2a43d96
Author: yx9o <ya...@163.com>
AuthorDate: Sun Sep 25 11:26:40 2022 +0800
Enhanced validation of Alter Sharding Binding Table Rules. (#21167)
---
.../checker/ShardingTableRuleStatementChecker.java | 46 ++++++++++++++++------
...rShardingBindingTableRulesStatementUpdater.java | 8 ++--
...rdingBindingTableRulesStatementUpdaterTest.java | 25 ++++++++----
3 files changed, 55 insertions(+), 24 deletions(-)
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
index 667650a4014..25cee8de7fb 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/checker/ShardingTableRuleStatementChecker.java
@@ -107,6 +107,21 @@ public final class ShardingTableRuleStatementChecker {
check(database, rules, currentRuleConfig, false);
}
+ /**
+ * Check binding table configuration.
+ *
+ * @param bindingTableGroups binding table groups
+ * @param currentRuleConfig current rule configuration
+ */
+ public static void checkBindingTableConfiguration(final Collection<String> bindingTableGroups, final ShardingRuleConfiguration currentRuleConfig) {
+ ShardingRuleConfiguration toBeCheckedRuleConfig = createToBeCheckedShardingRuleConfiguration(currentRuleConfig);
+ toBeCheckedRuleConfig.setBindingTableGroups(bindingTableGroups);
+ Collection<String> dataSourceNames = getRequiredResource(toBeCheckedRuleConfig);
+ dataSourceNames.addAll(getRequiredResource(currentRuleConfig));
+ ShardingSpherePreconditions.checkState(check(toBeCheckedRuleConfig, dataSourceNames),
+ () -> new InvalidRuleConfigurationException("sharding table", bindingTableGroups, Collections.singleton("invalid binding table configuration")));
+ }
+
private static void check(final ShardingSphereDatabase database,
final Collection<AbstractTableRuleSegment> rules, final ShardingRuleConfiguration currentRuleConfig, final boolean isCreate) {
String databaseName = database.getName();
@@ -334,18 +349,7 @@ public final class ShardingTableRuleStatementChecker {
if (toBeAlteredBindingTableNames.isEmpty()) {
return;
}
- ShardingRuleConfiguration toBeCheckedRuleConfig = new ShardingRuleConfiguration();
- toBeCheckedRuleConfig.setTables(new LinkedList<>(currentRuleConfig.getTables()));
- toBeCheckedRuleConfig.setAutoTables(new LinkedList<>(currentRuleConfig.getAutoTables()));
- toBeCheckedRuleConfig.setBindingTableGroups(new LinkedList<>(currentRuleConfig.getBindingTableGroups()));
- toBeCheckedRuleConfig.setBroadcastTables(new LinkedList<>(currentRuleConfig.getBroadcastTables()));
- toBeCheckedRuleConfig.setDefaultTableShardingStrategy(currentRuleConfig.getDefaultTableShardingStrategy());
- toBeCheckedRuleConfig.setDefaultDatabaseShardingStrategy(currentRuleConfig.getDefaultDatabaseShardingStrategy());
- toBeCheckedRuleConfig.setDefaultKeyGenerateStrategy(currentRuleConfig.getDefaultKeyGenerateStrategy());
- toBeCheckedRuleConfig.setDefaultShardingColumn(currentRuleConfig.getDefaultShardingColumn());
- toBeCheckedRuleConfig.setShardingAlgorithms(new LinkedHashMap<>(currentRuleConfig.getShardingAlgorithms()));
- toBeCheckedRuleConfig.setKeyGenerators(new LinkedHashMap<>(currentRuleConfig.getKeyGenerators()));
- toBeCheckedRuleConfig.setAuditors(new LinkedHashMap<>(currentRuleConfig.getAuditors()));
+ ShardingRuleConfiguration toBeCheckedRuleConfig = createToBeCheckedShardingRuleConfiguration(currentRuleConfig);
removeRuleConfiguration(toBeCheckedRuleConfig, toBeAlteredRuleConfig);
addRuleConfiguration(toBeCheckedRuleConfig, toBeAlteredRuleConfig);
Collection<String> dataSourceNames = getRequiredResource(toBeCheckedRuleConfig);
@@ -354,6 +358,22 @@ public final class ShardingTableRuleStatementChecker {
() -> new InvalidRuleConfigurationException("sharding table", toBeAlteredLogicTableNames, Collections.singleton("invalid binding table configuration")));
}
+ private static ShardingRuleConfiguration createToBeCheckedShardingRuleConfiguration(final ShardingRuleConfiguration currentRuleConfig) {
+ ShardingRuleConfiguration result = new ShardingRuleConfiguration();
+ result.setTables(new LinkedList<>(currentRuleConfig.getTables()));
+ result.setAutoTables(new LinkedList<>(currentRuleConfig.getAutoTables()));
+ result.setBindingTableGroups(new LinkedList<>(currentRuleConfig.getBindingTableGroups()));
+ result.setBroadcastTables(new LinkedList<>(currentRuleConfig.getBroadcastTables()));
+ result.setDefaultTableShardingStrategy(currentRuleConfig.getDefaultTableShardingStrategy());
+ result.setDefaultDatabaseShardingStrategy(currentRuleConfig.getDefaultDatabaseShardingStrategy());
+ result.setDefaultKeyGenerateStrategy(currentRuleConfig.getDefaultKeyGenerateStrategy());
+ result.setDefaultShardingColumn(currentRuleConfig.getDefaultShardingColumn());
+ result.setShardingAlgorithms(new LinkedHashMap<>(currentRuleConfig.getShardingAlgorithms()));
+ result.setKeyGenerators(new LinkedHashMap<>(currentRuleConfig.getKeyGenerators()));
+ result.setAuditors(new LinkedHashMap<>(currentRuleConfig.getAuditors()));
+ return result;
+ }
+
private static Collection<String> getRequiredResource(final ShardingRuleConfiguration config) {
Collection<String> result = new LinkedHashSet<>();
result.addAll(config.getAutoTables().stream().map(ShardingAutoTableRuleConfiguration::getActualDataSources)
@@ -367,7 +387,7 @@ public final class ShardingTableRuleStatementChecker {
for (String each : checkedConfig.getBindingTableGroups()) {
Collection<String> bindingTables = Splitter.on(",").trimResults().splitToList(each.toLowerCase());
if (bindingTables.size() <= 1) {
- continue;
+ return false;
}
Iterator<String> iterator = bindingTables.iterator();
TableRule sampleTableRule = getTableRule(iterator.next(), checkedConfig.getDataSourceNames(), tableRules, checkedConfig.getBroadcastTables());
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterShardingBindingTableRulesStatementUpdater.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterShardingBindingTableRulesStatementUpd [...]
index 1d18b897583..8b99f4c9602 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterShardingBindingTableRulesStatementUpdater.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/update/AlterShardingBindingTableRulesStatementUpdater.java
@@ -27,6 +27,7 @@ import org.apache.shardingsphere.infra.util.exception.ShardingSpherePrecondition
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
+import org.apache.shardingsphere.sharding.distsql.handler.checker.ShardingTableRuleStatementChecker;
import org.apache.shardingsphere.sharding.distsql.parser.segment.BindingTableRuleSegment;
import org.apache.shardingsphere.sharding.distsql.parser.statement.AlterShardingBindingTableRulesStatement;
@@ -35,7 +36,7 @@ import java.util.HashSet;
import java.util.stream.Collectors;
/**
- * Alter sharding binding table rule statement updater.
+ * Alter sharding binding table rules statement updater.
*/
public final class AlterShardingBindingTableRulesStatementUpdater implements RuleDefinitionAlterUpdater<AlterShardingBindingTableRulesStatement, ShardingRuleConfiguration> {
@@ -46,6 +47,7 @@ public final class AlterShardingBindingTableRulesStatementUpdater implements Rul
checkCurrentRuleConfiguration(databaseName, currentRuleConfig);
checkToBeAlertedBindingTables(databaseName, sqlStatement, currentRuleConfig);
checkToBeAlteredDuplicateBindingTables(databaseName, sqlStatement);
+ ShardingTableRuleStatementChecker.checkBindingTableConfiguration(((ShardingRuleConfiguration) buildToBeAlteredRuleConfiguration(sqlStatement)).getBindingTableGroups(), currentRuleConfig);
}
private void checkCurrentRuleConfiguration(final String databaseName, final ShardingRuleConfiguration currentRuleConfig) throws MissingRequiredRuleException {
@@ -53,10 +55,10 @@ public final class AlterShardingBindingTableRulesStatementUpdater implements Rul
}
private void checkToBeAlertedBindingTables(final String databaseName, final AlterShardingBindingTableRulesStatement sqlStatement,
- final ShardingRuleConfiguration currentRuleConfig) throws DuplicateRuleException {
+ final ShardingRuleConfiguration currentRuleConfig) throws MissingRequiredRuleException {
Collection<String> currentLogicTables = getCurrentLogicTables(currentRuleConfig);
Collection<String> notExistedBindingTables = sqlStatement.getBindingTables().stream().filter(each -> !containsIgnoreCase(currentLogicTables, each)).collect(Collectors.toSet());
- ShardingSpherePreconditions.checkState(notExistedBindingTables.isEmpty(), () -> new DuplicateRuleException("binding", databaseName, notExistedBindingTables));
+ ShardingSpherePreconditions.checkState(notExistedBindingTables.isEmpty(), () -> new MissingRequiredRuleException("Sharding", databaseName, notExistedBindingTables));
}
private Collection<String> getCurrentLogicTables(final ShardingRuleConfiguration currentRuleConfig) {
diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterShardingBindingTableRulesStatementUpdaterTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterShardingBindingTableRulesStatementUpdaterTest.java
index 88e7366a9b5..f18111d37f5 100644
--- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterShardingBindingTableRulesStatementUpdaterTest.java
+++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-distsql/shardingsphere-sharding-distsql-handler/src/test/java/org/apache/shardingsphere/sharding/distsql/update/AlterShardingBindingTableRulesStatementUpdaterTest.java
@@ -17,9 +17,10 @@
package org.apache.shardingsphere.sharding.distsql.update;
+import org.apache.shardingsphere.infra.distsql.exception.rule.DuplicateRuleException;
+import org.apache.shardingsphere.infra.distsql.exception.rule.InvalidRuleConfigurationException;
import org.apache.shardingsphere.infra.distsql.exception.rule.MissingRequiredRuleException;
import org.apache.shardingsphere.infra.distsql.exception.rule.RuleDefinitionViolationException;
-import org.apache.shardingsphere.infra.distsql.exception.rule.DuplicateRuleException;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration;
@@ -46,25 +47,33 @@ public final class AlterShardingBindingTableRulesStatementUpdaterTest {
@Test(expected = MissingRequiredRuleException.class)
public void assertCheckSQLStatementWithoutCurrentRule() throws RuleDefinitionViolationException {
- updater.checkSQLStatement(database, createSQLStatement(), null);
+ updater.checkSQLStatement(database, createSQLStatement(Arrays.asList(new BindingTableRuleSegment("t_order,t_order_item"))), null);
+ }
+
+ @Test(expected = MissingRequiredRuleException.class)
+ public void assertCheckSQLStatementWithNotExistedTables() throws RuleDefinitionViolationException {
+ updater.checkSQLStatement(database, createSQLStatement(Arrays.asList(new BindingTableRuleSegment("t_3,t_4"))), createCurrentRuleConfiguration());
+ }
+
+ @Test(expected = InvalidRuleConfigurationException.class)
+ public void assertCheckSQLStatementWithOneTable() throws RuleDefinitionViolationException {
+ updater.checkSQLStatement(database, createSQLStatement(Arrays.asList(new BindingTableRuleSegment("t_order"))), createCurrentRuleConfiguration());
}
@Test(expected = DuplicateRuleException.class)
public void assertCheckSQLStatementWithDuplicateTables() throws RuleDefinitionViolationException {
List<BindingTableRuleSegment> segments = Arrays.asList(new BindingTableRuleSegment("t_order,t_order_item"), new BindingTableRuleSegment("t_order,t_order_item"));
- AlterShardingBindingTableRulesStatement statement = new AlterShardingBindingTableRulesStatement(segments);
- updater.checkSQLStatement(database, statement, createCurrentRuleConfiguration());
+ updater.checkSQLStatement(database, createSQLStatement(segments), createCurrentRuleConfiguration());
}
@Test(expected = DuplicateRuleException.class)
public void assertCheckSQLStatementWithDifferentCaseDuplicateTables() throws RuleDefinitionViolationException {
List<BindingTableRuleSegment> segments = Arrays.asList(new BindingTableRuleSegment("T_ORDER,T_ORDER_ITEM"), new BindingTableRuleSegment("t_order,t_order_item"));
- AlterShardingBindingTableRulesStatement statement = new AlterShardingBindingTableRulesStatement(segments);
- updater.checkSQLStatement(database, statement, createCurrentRuleConfiguration());
+ updater.checkSQLStatement(database, createSQLStatement(segments), createCurrentRuleConfiguration());
}
- private AlterShardingBindingTableRulesStatement createSQLStatement() {
- return new AlterShardingBindingTableRulesStatement(Arrays.asList(new BindingTableRuleSegment("t_order,t_order_item"), new BindingTableRuleSegment("t_1,t_2")));
+ private AlterShardingBindingTableRulesStatement createSQLStatement(final List<BindingTableRuleSegment> segments) {
+ return new AlterShardingBindingTableRulesStatement(segments);
}
private ShardingRuleConfiguration createCurrentRuleConfiguration() {