This is an automated email from the ASF dual-hosted git repository. panjuan 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 d8d941af3fd Add check logic for ShardingAlgorithm and KeyGenerator name not exists (#18834) d8d941af3fd is described below commit d8d941af3fdb882612a2ae82d74e22ab7a69a35f Author: Zhengqiang Duan <duanzhengqi...@apache.org> AuthorDate: Tue Jul 5 10:59:51 2022 +0800 Add check logic for ShardingAlgorithm and KeyGenerator name not exists (#18834) * Add check logic for ShardingAlgorithm and KeyGenerator name not exists * fix integration test * correct some wrong sharding config --- .../AlgorithmProvidedShardingRuleBuilder.java | 44 ++++++++++++++++++++++ .../sharding/rule/builder/ShardingRuleBuilder.java | 43 +++++++++++++++++++++ .../AlgorithmProvidedShardingRuleBuilderTest.java | 37 ++++++++++++++++-- .../rule/builder/ShardingRuleBuilderTest.java | 37 ++++++++++++++++-- .../sharding/configWithoutDataSourceWithProps.yaml | 4 +- .../config_sharding_sphere_jdbc_source.yaml | 3 ++ 6 files changed, 159 insertions(+), 9 deletions(-) diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilder.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilder.java index fdfc3b384bb..ff0ee13aa87 100644 --- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilder.java +++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilder.java @@ -22,8 +22,15 @@ import org.apache.shardingsphere.infra.instance.InstanceContext; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder; import org.apache.shardingsphere.sharding.algorithm.config.AlgorithmProvidedShardingRuleConfiguration; +import org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration; +import org.apache.shardingsphere.sharding.api.config.rule.ShardingTableRuleConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration; import org.apache.shardingsphere.sharding.constant.ShardingOrder; import org.apache.shardingsphere.sharding.rule.ShardingRule; +import org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm; +import org.apache.shardingsphere.sharding.spi.ShardingAlgorithm; import javax.sql.DataSource; import java.util.Collection; @@ -38,9 +45,46 @@ public final class AlgorithmProvidedShardingRuleBuilder implements DatabaseRuleB public ShardingRule build(final AlgorithmProvidedShardingRuleConfiguration config, final String databaseName, final Map<String, DataSource> dataSources, final Collection<ShardingSphereRule> builtRules, final InstanceContext instanceContext) { Preconditions.checkArgument(null != dataSources && !dataSources.isEmpty(), "Data sources cannot be empty."); + Preconditions.checkArgument(isValidRuleConfiguration(config), "Invalid sharding configuration in AlgorithmProvidedShardingRuleConfiguration."); return new ShardingRule(config, dataSources.keySet(), instanceContext); } + private boolean isValidRuleConfiguration(final AlgorithmProvidedShardingRuleConfiguration config) { + Map<String, KeyGenerateAlgorithm> keyGenerators = config.getKeyGenerators(); + Map<String, ShardingAlgorithm> shardingAlgorithms = config.getShardingAlgorithms(); + if (isInvalidKeyGenerateStrategy(config.getDefaultKeyGenerateStrategy(), keyGenerators) + || isInvalidShardingStrategy(config.getDefaultDatabaseShardingStrategy(), shardingAlgorithms) + || isInvalidShardingStrategy(config.getDefaultTableShardingStrategy(), shardingAlgorithms)) { + return false; + } + for (ShardingTableRuleConfiguration each : config.getTables()) { + if (isInvalidKeyGenerateStrategy(each.getKeyGenerateStrategy(), keyGenerators) || isInvalidShardingStrategy(each.getDatabaseShardingStrategy(), shardingAlgorithms) + || isInvalidShardingStrategy(each.getTableShardingStrategy(), shardingAlgorithms)) { + return false; + } + } + for (ShardingAutoTableRuleConfiguration each : config.getAutoTables()) { + if (isInvalidKeyGenerateStrategy(each.getKeyGenerateStrategy(), keyGenerators) || isInvalidShardingStrategy(each.getShardingStrategy(), shardingAlgorithms)) { + return false; + } + } + return true; + } + + private boolean isInvalidKeyGenerateStrategy(final KeyGenerateStrategyConfiguration keyGenerateStrategy, final Map<String, KeyGenerateAlgorithm> keyGenerators) { + if (null == keyGenerateStrategy) { + return false; + } + return !keyGenerators.containsKey(keyGenerateStrategy.getKeyGeneratorName()); + } + + private boolean isInvalidShardingStrategy(final ShardingStrategyConfiguration shardingStrategy, final Map<String, ShardingAlgorithm> shardingAlgorithms) { + if (null == shardingStrategy || shardingStrategy instanceof NoneShardingStrategyConfiguration) { + return false; + } + return !shardingAlgorithms.containsKey(shardingStrategy.getShardingAlgorithmName()); + } + @Override public int getOrder() { return ShardingOrder.ALGORITHM_PROVIDER_ORDER; diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java index 6588bbf57ae..fccefda9c17 100644 --- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java +++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/main/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilder.java @@ -18,10 +18,16 @@ package org.apache.shardingsphere.sharding.rule.builder; import com.google.common.base.Preconditions; +import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration; import org.apache.shardingsphere.infra.instance.InstanceContext; import org.apache.shardingsphere.infra.rule.ShardingSphereRule; import org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder; 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.api.config.strategy.keygen.KeyGenerateStrategyConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.sharding.NoneShardingStrategyConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.sharding.ShardingStrategyConfiguration; import org.apache.shardingsphere.sharding.constant.ShardingOrder; import org.apache.shardingsphere.sharding.rule.ShardingRule; @@ -38,9 +44,46 @@ public final class ShardingRuleBuilder implements DatabaseRuleBuilder<ShardingRu public ShardingRule build(final ShardingRuleConfiguration config, final String databaseName, final Map<String, DataSource> dataSources, final Collection<ShardingSphereRule> builtRules, final InstanceContext instanceContext) { Preconditions.checkArgument(null != dataSources && !dataSources.isEmpty(), "Data source names cannot be empty."); + Preconditions.checkArgument(isValidRuleConfiguration(config), "Invalid sharding configuration in ShardingRuleConfiguration."); return new ShardingRule(config, dataSources.keySet(), instanceContext); } + private boolean isValidRuleConfiguration(final ShardingRuleConfiguration config) { + Map<String, ShardingSphereAlgorithmConfiguration> keyGenerators = config.getKeyGenerators(); + Map<String, ShardingSphereAlgorithmConfiguration> shardingAlgorithms = config.getShardingAlgorithms(); + if (isInvalidKeyGenerateStrategy(config.getDefaultKeyGenerateStrategy(), keyGenerators) + || isInvalidShardingStrategy(config.getDefaultDatabaseShardingStrategy(), shardingAlgorithms) + || isInvalidShardingStrategy(config.getDefaultTableShardingStrategy(), shardingAlgorithms)) { + return false; + } + for (ShardingTableRuleConfiguration each : config.getTables()) { + if (isInvalidKeyGenerateStrategy(each.getKeyGenerateStrategy(), keyGenerators) || isInvalidShardingStrategy(each.getDatabaseShardingStrategy(), shardingAlgorithms) + || isInvalidShardingStrategy(each.getTableShardingStrategy(), shardingAlgorithms)) { + return false; + } + } + for (ShardingAutoTableRuleConfiguration each : config.getAutoTables()) { + if (isInvalidKeyGenerateStrategy(each.getKeyGenerateStrategy(), keyGenerators) || isInvalidShardingStrategy(each.getShardingStrategy(), shardingAlgorithms)) { + return false; + } + } + return true; + } + + private boolean isInvalidKeyGenerateStrategy(final KeyGenerateStrategyConfiguration keyGenerateStrategy, final Map<String, ShardingSphereAlgorithmConfiguration> keyGenerators) { + if (null == keyGenerateStrategy) { + return false; + } + return !keyGenerators.containsKey(keyGenerateStrategy.getKeyGeneratorName()); + } + + private boolean isInvalidShardingStrategy(final ShardingStrategyConfiguration shardingStrategy, final Map<String, ShardingSphereAlgorithmConfiguration> shardingAlgorithms) { + if (null == shardingStrategy || shardingStrategy instanceof NoneShardingStrategyConfiguration) { + return false; + } + return !shardingAlgorithms.containsKey(shardingStrategy.getShardingAlgorithmName()); + } + @Override public int getOrder() { return ShardingOrder.ORDER; diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilderTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilderTest.java index 3007659d9d7..4089e2bc1ff 100644 --- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilderTest.java +++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/AlgorithmProvidedShardingRuleBuilderTest.java @@ -21,7 +21,10 @@ import org.apache.shardingsphere.infra.instance.InstanceContext; import org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder; import org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilderFactory; import org.apache.shardingsphere.sharding.algorithm.config.AlgorithmProvidedShardingRuleConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration; import org.apache.shardingsphere.sharding.rule.ShardingRule; +import org.apache.shardingsphere.sharding.spi.KeyGenerateAlgorithm; import org.junit.Before; import org.junit.Test; @@ -49,19 +52,47 @@ public final class AlgorithmProvidedShardingRuleBuilderTest { @SuppressWarnings("unchecked") @Test public void assertBuild() { - assertThat(builder.build(ruleConfig, "test_schema", + assertThat(builder.build(ruleConfig, "sharding_db", Collections.singletonMap("name", mock(DataSource.class, RETURNS_DEEP_STUBS)), Collections.emptyList(), mock(InstanceContext.class)), instanceOf(ShardingRule.class)); } @SuppressWarnings("unchecked") @Test(expected = IllegalArgumentException.class) public void assertBuildWithNullDataSourceMap() { - assertThat(builder.build(ruleConfig, "test_schema", null, Collections.emptyList(), mock(InstanceContext.class)), instanceOf(ShardingRule.class)); + assertThat(builder.build(ruleConfig, "sharding_db", null, Collections.emptyList(), mock(InstanceContext.class)), instanceOf(ShardingRule.class)); } @SuppressWarnings("unchecked") @Test(expected = IllegalArgumentException.class) public void assertBuildWithEmptyDataSourceMap() { - assertThat(builder.build(ruleConfig, "test_schema", Collections.emptyMap(), Collections.emptyList(), mock(InstanceContext.class)), instanceOf(ShardingRule.class)); + assertThat(builder.build(ruleConfig, "sharding_db", Collections.emptyMap(), Collections.emptyList(), mock(InstanceContext.class)), instanceOf(ShardingRule.class)); + } + + @SuppressWarnings("unchecked") + @Test(expected = IllegalArgumentException.class) + public void assertBuildWithInvalidKeyGenerator() { + ruleConfig.setDefaultKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("order_id", "snowflake")); + assertThat(builder.build(ruleConfig, "sharding_db", Collections.singletonMap("ds_0", mock(DataSource.class)), Collections.emptyList(), mock(InstanceContext.class)), + instanceOf(ShardingRule.class)); + } + + @SuppressWarnings("unchecked") + @Test(expected = IllegalArgumentException.class) + public void assertBuildWithInvalidDatabaseShardingStrategy() { + ruleConfig.setDefaultKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("order_id", "snowflake")); + ruleConfig.getKeyGenerators().put("snowflake", mock(KeyGenerateAlgorithm.class)); + ruleConfig.setDefaultDatabaseShardingStrategy(new StandardShardingStrategyConfiguration("user_id", "database_inline")); + assertThat(builder.build(ruleConfig, "sharding_db", Collections.singletonMap("ds_0", mock(DataSource.class)), Collections.emptyList(), mock(InstanceContext.class)), + instanceOf(ShardingRule.class)); + } + + @SuppressWarnings("unchecked") + @Test(expected = IllegalArgumentException.class) + public void assertBuildWithInvalidTableShardingStrategy() { + ruleConfig.setDefaultKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("order_id", "snowflake")); + ruleConfig.getKeyGenerators().put("snowflake", mock(KeyGenerateAlgorithm.class)); + ruleConfig.setDefaultTableShardingStrategy(new StandardShardingStrategyConfiguration("order_id", "t_order_inline")); + assertThat(builder.build(ruleConfig, "sharding_db", Collections.singletonMap("ds_0", mock(DataSource.class)), Collections.emptyList(), mock(InstanceContext.class)), + instanceOf(ShardingRule.class)); } } diff --git a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java index 6b69772538d..910f303cb72 100644 --- a/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java +++ b/shardingsphere-features/shardingsphere-sharding/shardingsphere-sharding-core/src/test/java/org/apache/shardingsphere/sharding/rule/builder/ShardingRuleBuilderTest.java @@ -17,10 +17,13 @@ package org.apache.shardingsphere.sharding.rule.builder; +import org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration; import org.apache.shardingsphere.infra.instance.InstanceContext; import org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder; import org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilderFactory; import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.keygen.KeyGenerateStrategyConfiguration; +import org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardShardingStrategyConfiguration; import org.apache.shardingsphere.sharding.rule.ShardingRule; import org.junit.Before; import org.junit.Test; @@ -49,19 +52,47 @@ public final class ShardingRuleBuilderTest { @SuppressWarnings("unchecked") @Test public void assertBuild() { - assertThat(builder.build(ruleConfig, "test_schema", + assertThat(builder.build(ruleConfig, "sharding_db", Collections.singletonMap("name", mock(DataSource.class, RETURNS_DEEP_STUBS)), Collections.emptyList(), mock(InstanceContext.class)), instanceOf(ShardingRule.class)); } @SuppressWarnings("unchecked") @Test(expected = IllegalArgumentException.class) public void assertBuildWithNullDataSourceMap() { - assertThat(builder.build(ruleConfig, "test_schema", null, Collections.emptyList(), mock(InstanceContext.class)), instanceOf(ShardingRule.class)); + assertThat(builder.build(ruleConfig, "sharding_db", null, Collections.emptyList(), mock(InstanceContext.class)), instanceOf(ShardingRule.class)); } @SuppressWarnings("unchecked") @Test(expected = IllegalArgumentException.class) public void assertBuildWithEmptyDataSourceMap() { - assertThat(builder.build(ruleConfig, "test_schema", Collections.emptyMap(), Collections.emptyList(), mock(InstanceContext.class)), instanceOf(ShardingRule.class)); + assertThat(builder.build(ruleConfig, "sharding_db", Collections.emptyMap(), Collections.emptyList(), mock(InstanceContext.class)), instanceOf(ShardingRule.class)); + } + + @SuppressWarnings("unchecked") + @Test(expected = IllegalArgumentException.class) + public void assertBuildWithInvalidKeyGenerator() { + ruleConfig.setDefaultKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("order_id", "snowflake")); + assertThat(builder.build(ruleConfig, "sharding_db", Collections.singletonMap("ds_0", mock(DataSource.class)), Collections.emptyList(), mock(InstanceContext.class)), + instanceOf(ShardingRule.class)); + } + + @SuppressWarnings("unchecked") + @Test(expected = IllegalArgumentException.class) + public void assertBuildWithInvalidDatabaseShardingStrategy() { + ruleConfig.setDefaultKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("order_id", "snowflake")); + ruleConfig.getKeyGenerators().put("snowflake", mock(ShardingSphereAlgorithmConfiguration.class)); + ruleConfig.setDefaultDatabaseShardingStrategy(new StandardShardingStrategyConfiguration("user_id", "database_inline")); + assertThat(builder.build(ruleConfig, "sharding_db", Collections.singletonMap("ds_0", mock(DataSource.class)), Collections.emptyList(), mock(InstanceContext.class)), + instanceOf(ShardingRule.class)); + } + + @SuppressWarnings("unchecked") + @Test(expected = IllegalArgumentException.class) + public void assertBuildWithInvalidTableShardingStrategy() { + ruleConfig.setDefaultKeyGenerateStrategy(new KeyGenerateStrategyConfiguration("order_id", "snowflake")); + ruleConfig.getKeyGenerators().put("snowflake", mock(ShardingSphereAlgorithmConfiguration.class)); + ruleConfig.setDefaultTableShardingStrategy(new StandardShardingStrategyConfiguration("order_id", "t_order_inline")); + assertThat(builder.build(ruleConfig, "sharding_db", Collections.singletonMap("ds_0", mock(DataSource.class)), Collections.emptyList(), mock(InstanceContext.class)), + instanceOf(ShardingRule.class)); } } diff --git a/shardingsphere-test/shardingsphere-integration-driver-test/src/test/resources/yaml/integrate/sharding/configWithoutDataSourceWithProps.yaml b/shardingsphere-test/shardingsphere-integration-driver-test/src/test/resources/yaml/integrate/sharding/configWithoutDataSourceWithProps.yaml index a7ded4fdbd9..73440510fb2 100644 --- a/shardingsphere-test/shardingsphere-integration-driver-test/src/test/resources/yaml/integrate/sharding/configWithoutDataSourceWithProps.yaml +++ b/shardingsphere-test/shardingsphere-integration-driver-test/src/test/resources/yaml/integrate/sharding/configWithoutDataSourceWithProps.yaml @@ -61,9 +61,7 @@ rules: defaultDatabaseStrategy: none: defaultTableStrategy: - complex: - shardingColumns: id, order_id - shardingAlgorithmName: complex_sharding_fixture + none: shardingAlgorithms: standard_sharding_fixture: diff --git a/shardingsphere-test/shardingsphere-pipeline-test/src/test/resources/config_sharding_sphere_jdbc_source.yaml b/shardingsphere-test/shardingsphere-pipeline-test/src/test/resources/config_sharding_sphere_jdbc_source.yaml index 116ab7bcbd9..96e05f6f2dc 100644 --- a/shardingsphere-test/shardingsphere-pipeline-test/src/test/resources/config_sharding_sphere_jdbc_source.yaml +++ b/shardingsphere-test/shardingsphere-pipeline-test/src/test/resources/config_sharding_sphere_jdbc_source.yaml @@ -49,6 +49,9 @@ rules: type: INLINE props: algorithm-expression: t_order + keyGenerators: + snowflake: + type: SNOWFLAKE scalingName: default_scaling scaling: default_scaling: