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 ef292447d44 Improve init check of ShardingAutoTableAlgorithm (#24742)
ef292447d44 is described below

commit ef292447d447194d0fccf58019849ca6afcb44f4
Author: ChenJiaHao <[email protected]>
AuthorDate: Wed Mar 22 18:08:05 2023 +0800

    Improve init check of ShardingAutoTableAlgorithm (#24742)
    
    * Improve init check for ShardingAutoTableAlgorithm
    
    * Add related test cases
---
 .../algorithm/sharding/mod/HashModShardingAlgorithm.java   |  4 +++-
 .../algorithm/sharding/mod/ModShardingAlgorithm.java       |  4 +++-
 .../sharding/mod/HashModShardingAlgorithmTest.java         |  9 +++++++++
 .../algorithm/sharding/mod/ModShardingAlgorithmTest.java   |  5 +++++
 .../fixture/sharding/CoreAutoShardingAlgorithmFixture.java | 14 +++++++++++---
 5 files changed, 31 insertions(+), 5 deletions(-)

diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithm.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithm.java
index aa0440fce3d..5eb8bcaa070 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithm.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithm.java
@@ -44,7 +44,9 @@ public final class HashModShardingAlgorithm implements 
StandardShardingAlgorithm
     
     private int getShardingCount(final Properties props) {
         
ShardingSpherePreconditions.checkState(props.containsKey(SHARDING_COUNT_KEY), 
() -> new ShardingAlgorithmInitializationException(getType(), "Sharding count 
cannot be null."));
-        return Integer.parseInt(props.getProperty(SHARDING_COUNT_KEY));
+        int result = 
Integer.parseInt(String.valueOf(props.getProperty(SHARDING_COUNT_KEY)));
+        ShardingSpherePreconditions.checkState(result > 0, () -> new 
ShardingAlgorithmInitializationException(getType(), "Sharding count must be a 
positive integer."));
+        return result;
     }
     
     @Override
diff --git 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/ModShardingAlgorithm.java
 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/ModShardingAlgorithm.java
index 2209efa065d..3b5d0ae6dae 100644
--- 
a/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/ModShardingAlgorithm.java
+++ 
b/features/sharding/core/src/main/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/ModShardingAlgorithm.java
@@ -65,7 +65,9 @@ public final class ModShardingAlgorithm implements 
StandardShardingAlgorithm<Com
     
     private int getShardingCount(final Properties props) {
         
ShardingSpherePreconditions.checkState(props.containsKey(SHARDING_COUNT_KEY), 
() -> new ShardingAlgorithmInitializationException(getType(), "Sharding count 
can not be null."));
-        return Integer.parseInt(props.getProperty(SHARDING_COUNT_KEY));
+        int result = 
Integer.parseInt(String.valueOf(props.getProperty(SHARDING_COUNT_KEY)));
+        ShardingSpherePreconditions.checkState(result > 0, () -> new 
ShardingAlgorithmInitializationException(getType(), "Sharding count must be a 
positive integer."));
+        return result;
     }
     
     private int getStartOffset(final Properties props) {
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithmTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithmTest.java
index 678d09be2c4..ee8c5e4dc71 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithmTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/HashModShardingAlgorithmTest.java
@@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.datanode.DataNodeInfo;
 import org.apache.shardingsphere.infra.util.spi.type.typed.TypedSPILoader;
 import 
org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
 import 
org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
+import 
org.apache.shardingsphere.sharding.exception.algorithm.sharding.ShardingAlgorithmInitializationException;
 import org.apache.shardingsphere.sharding.spi.ShardingAlgorithm;
 import org.apache.shardingsphere.test.util.PropertiesBuilder;
 import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
@@ -31,9 +32,11 @@ import org.junit.jupiter.api.Test;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.List;
+import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public final class HashModShardingAlgorithmTest {
     
@@ -58,4 +61,10 @@ public final class HashModShardingAlgorithmTest {
         Collection<String> actual = 
shardingAlgorithm.doSharding(availableTargetNames, new 
RangeShardingValue<>("t_order", "create_time", DATA_NODE_INFO, 
Range.closed("a", "f")));
         assertThat(actual.size(), is(4));
     }
+    
+    @Test
+    public void assertRangeDoShardingWithWrongArgumentForShardingCount() {
+        Properties props = PropertiesBuilder.build(new 
Property("sharding-count", "0"));
+        assertThrows(ShardingAlgorithmInitializationException.class, () -> 
TypedSPILoader.getService(ShardingAlgorithm.class, "HASH_MOD", props));
+    }
 }
diff --git 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/ModShardingAlgorithmTest.java
 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/ModShardingAlgorithmTest.java
index 118b9d6e210..e3fb2706128 100644
--- 
a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/ModShardingAlgorithmTest.java
+++ 
b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/sharding/mod/ModShardingAlgorithmTest.java
@@ -89,6 +89,11 @@ public final class ModShardingAlgorithmTest {
         assertThat(actual.size(), is(16));
     }
     
+    @Test
+    public void assertRangeDoShardingWithWrongArgumentForShardingCount() {
+        assertThrows(ShardingAlgorithmInitializationException.class, () -> 
TypedSPILoader.getService(ShardingAlgorithm.class, "MOD", 
PropertiesBuilder.build(new Property("sharding-count", "0"))));
+    }
+    
     @Test
     public void assertRangeDoShardingWithWrongArgumentForStartOffset() {
         Properties props = createZeroPaddingProperties();
diff --git 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/fixture/sharding/CoreAutoShardingAlgorithmFixture.java
 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/fixture/sharding/CoreAutoShardingAlgorithmFixture.java
index eefa58edd59..4a2634a54fb 100644
--- 
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/fixture/sharding/CoreAutoShardingAlgorithmFixture.java
+++ 
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/fixture/sharding/CoreAutoShardingAlgorithmFixture.java
@@ -18,11 +18,13 @@
 package org.apache.shardingsphere.sharding.distsql.fixture.sharding;
 
 import com.google.common.base.Preconditions;
+import 
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import 
org.apache.shardingsphere.sharding.algorithm.sharding.ShardingAutoTableAlgorithmUtil;
 import 
org.apache.shardingsphere.sharding.api.sharding.ShardingAutoTableAlgorithm;
 import 
org.apache.shardingsphere.sharding.api.sharding.standard.PreciseShardingValue;
 import 
org.apache.shardingsphere.sharding.api.sharding.standard.RangeShardingValue;
 import 
org.apache.shardingsphere.sharding.api.sharding.standard.StandardShardingAlgorithm;
+import 
org.apache.shardingsphere.sharding.exception.algorithm.sharding.ShardingAlgorithmInitializationException;
 
 import java.math.BigInteger;
 import java.util.Collection;
@@ -60,15 +62,21 @@ public final class CoreAutoShardingAlgorithmFixture 
implements StandardShardingA
     
     private int getShardingCount(final Properties props) {
         Preconditions.checkArgument(props.containsKey(SHARDING_COUNT_KEY), 
"Sharding count can not be null.");
-        return Integer.parseInt(props.getProperty(SHARDING_COUNT_KEY));
+        int result = 
Integer.parseInt(String.valueOf(props.getProperty(SHARDING_COUNT_KEY)));
+        ShardingSpherePreconditions.checkState(result > 0, () -> new 
ShardingAlgorithmInitializationException(getType(), "Sharding count must be a 
positive integer."));
+        return result;
     }
     
     private int getStartOffset(final Properties props) {
-        return 
Integer.parseInt(String.valueOf(props.getProperty(START_OFFSET_INDEX_KEY, 
"0")));
+        int result = 
Integer.parseInt(String.valueOf(props.getProperty(START_OFFSET_INDEX_KEY, 
"0")));
+        ShardingSpherePreconditions.checkState(result >= 0, () -> new 
ShardingAlgorithmInitializationException(getType(), "Start offset can not be 
less than 0."));
+        return result;
     }
     
     private int getStopOffset(final Properties props) {
-        return 
Integer.parseInt(String.valueOf(props.getProperty(STOP_OFFSET_INDEX_KEY, "0")));
+        int result = 
Integer.parseInt(String.valueOf(props.getProperty(STOP_OFFSET_INDEX_KEY, "0")));
+        ShardingSpherePreconditions.checkState(result >= 0, () -> new 
ShardingAlgorithmInitializationException(getType(), "Stop offset can not be 
less than 0."));
+        return result;
     }
     
     private boolean isZeroPadding(final Properties props) {

Reply via email to