This is an automated email from the ASF dual-hosted git repository.
terrymanu 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 5c8e40d7ec4 Validate rule configurations before persistence (#39888)
5c8e40d7ec4 is described below
commit 5c8e40d7ec45ef1ab5f619e523d71ed4782cec69
Author: Liang Zhang <[email protected]>
AuthorDate: Fri Sep 18 20:14:43 2026 +0800
Validate rule configurations before persistence (#39888)
* Add @SingletonSPI on MCPRuleDistSQLStatementClassifier
* Validate rule configurations before persistence
---
.../rule/builder/global/GlobalRulesBuilderTest.java | 6 ++----
.../config/database/DatabaseRulePersistService.java | 7 +++----
.../config/global/GlobalRulePersistService.java | 2 ++
.../database/DatabaseRulePersistServiceTest.java | 20 ++++++++++++++++++++
.../config/global/GlobalRulePersistServiceTest.java | 21 +++++++++++++++++++++
5 files changed, 48 insertions(+), 8 deletions(-)
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java
index 8ccf0326eea..5a447093eec 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java
@@ -51,8 +51,7 @@ class GlobalRulesBuilderTest {
void assertBuildRulesWithInvalidRuleConfiguration() {
FixtureGlobalRuleConfiguration ruleConfig = new
FixtureGlobalRuleConfiguration();
ruleConfig.setName("");
- assertThrows(InvalidRuleConfigurationException.class,
- () ->
GlobalRulesBuilder.buildRules(Collections.singletonList(ruleConfig),
Collections.singleton(buildDatabase()), mock()));
+ assertThrows(InvalidRuleConfigurationException.class, () ->
GlobalRulesBuilder.buildRules(Collections.singletonList(ruleConfig),
Collections.singleton(buildDatabase()), mock()));
}
@Test
@@ -65,8 +64,7 @@ class GlobalRulesBuilderTest {
void assertBuildSingleRulesWithInvalidRuleConfiguration() {
FixtureGlobalRuleConfiguration ruleConfig = new
FixtureGlobalRuleConfiguration();
ruleConfig.setName("");
- assertThrows(InvalidRuleConfigurationException.class,
- () -> GlobalRulesBuilder.buildSingleRules(ruleConfig,
Collections.singleton(buildDatabase()), mock()));
+ assertThrows(InvalidRuleConfigurationException.class, () ->
GlobalRulesBuilder.buildSingleRules(ruleConfig,
Collections.singleton(buildDatabase()), mock()));
}
private ShardingSphereDatabase buildDatabase() {
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DatabaseRulePersistService.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DatabaseRulePersistService.java
index 36c87bdd311..bddcdb11dcd 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DatabaseRulePersistService.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DatabaseRulePersistService.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.mode.metadata.persist.config.database;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import
org.apache.shardingsphere.infra.config.rule.validator.RuleConfigurationValidator;
import
org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine;
import
org.apache.shardingsphere.mode.metadata.persist.version.VersionPersistService;
@@ -36,7 +37,6 @@ import java.util.Collection;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
-import java.util.Objects;
import java.util.stream.Collectors;
/**
@@ -79,9 +79,7 @@ public final class DatabaseRulePersistService {
Collection<DatabaseRuleNodePath> nodePaths = new LinkedList<>();
nodePaths.addAll(getUniqueItemNodePaths(databaseName,
databaseRuleNode.getRuleType(), databaseRuleNode.getUniqueItems()));
nodePaths.addAll(getNamedItemNodePaths(databaseName,
databaseRuleNode.getRuleType(), databaseRuleNode.getNamedItems()));
- return nodePaths.stream()
- .map(each -> new RuleNodeTuple(each,
versionPersistService.loadContent(new
VersionNodePath(each)))).filter(Objects::nonNull)
- .collect(Collectors.toList());
+ return nodePaths.stream().map(each -> new RuleNodeTuple(each,
versionPersistService.loadContent(new
VersionNodePath(each)))).collect(Collectors.toList());
}
private Collection<DatabaseRuleNodePath> getUniqueItemNodePaths(final
String databaseName, final String ruleType, final Collection<String>
uniqueItems) {
@@ -105,6 +103,7 @@ public final class DatabaseRulePersistService {
* @return meta data versions
*/
public Collection<MetaDataVersion> persist(final String databaseName,
final Collection<RuleConfiguration> configs) {
+ RuleConfigurationValidator.validate(configs);
Collection<MetaDataVersion> result = new LinkedList<>();
for (YamlRuleConfiguration each :
yamlSwapperEngine.swapToYamlRuleConfigurations(configs)) {
result.addAll(persistTuples(tupleSwapperEngine.swapToTuples(databaseName,
each)));
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/global/GlobalRulePersistService.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/global/GlobalRulePersistService.java
index 1713863d83b..c2386a7083f 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/global/GlobalRulePersistService.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/persist/config/global/GlobalRulePersistService.java
@@ -18,6 +18,7 @@
package org.apache.shardingsphere.mode.metadata.persist.config.global;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import
org.apache.shardingsphere.infra.config.rule.validator.RuleConfigurationValidator;
import
org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlGlobalRuleConfiguration;
import
org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine;
@@ -78,6 +79,7 @@ public final class GlobalRulePersistService {
* @param globalRuleConfigs global rule configurations
*/
public void persist(final Collection<RuleConfiguration> globalRuleConfigs)
{
+ RuleConfigurationValidator.validate(globalRuleConfigs);
for (YamlRuleConfiguration each :
yamlSwapperEngine.swapToYamlRuleConfigurations(globalRuleConfigs)) {
persistTuple(tupleSwapperEngine.swapToTuple((YamlGlobalRuleConfiguration)
each));
}
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DatabaseRulePersistServiceTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DatabaseRulePersistServiceTest.java
index 5e3efb09e48..6214a4eed8e 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DatabaseRulePersistServiceTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/database/DatabaseRulePersistServiceTest.java
@@ -17,7 +17,9 @@
package org.apache.shardingsphere.mode.metadata.persist.config.database;
+import lombok.Getter;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.rule.InvalidRuleConfigurationException;
import org.apache.shardingsphere.mode.node.path.version.MetaDataVersion;
import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
import
org.apache.shardingsphere.test.infra.fixture.rule.MockedRuleConfiguration;
@@ -27,13 +29,17 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
+import javax.validation.constraints.NotBlank;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
+import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
@@ -85,6 +91,13 @@ class DatabaseRulePersistServiceTest {
assertThat(actual.iterator().next().getActiveVersion(), is(11));
}
+ @Test
+ void assertPersistWithInvalidRuleConfiguration() {
+ Collection<RuleConfiguration> ruleConfigs = Arrays.asList(new
MockedRuleConfiguration("foo_value"), new InvalidRuleConfiguration());
+ assertThrows(InvalidRuleConfigurationException.class, () ->
persistService.persist("foo_db", ruleConfigs));
+ verifyNoInteractions(repository);
+ }
+
@Test
void assertDeleteWithRuleType() {
persistService.delete("foo_db", "foo_rule");
@@ -97,4 +110,11 @@ class DatabaseRulePersistServiceTest {
assertThat(actual.size(), is(1));
assertThat(actual.iterator().next().getActiveVersion(), is(0));
}
+
+ @Getter
+ private static final class InvalidRuleConfiguration implements
RuleConfiguration {
+
+ @NotBlank
+ private final String name = "";
+ }
}
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/global/GlobalRulePersistServiceTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/global/GlobalRulePersistServiceTest.java
index 3b4bb8f77bd..3357d09836b 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/global/GlobalRulePersistServiceTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/persist/config/global/GlobalRulePersistServiceTest.java
@@ -17,7 +17,10 @@
package org.apache.shardingsphere.mode.metadata.persist.config.global;
+import lombok.Getter;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import
org.apache.shardingsphere.infra.config.rule.scope.GlobalRuleConfiguration;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.rule.InvalidRuleConfigurationException;
import
org.apache.shardingsphere.mode.metadata.persist.version.VersionPersistService;
import org.apache.shardingsphere.mode.spi.repository.PersistRepository;
import
org.apache.shardingsphere.test.infra.fixture.rule.global.MockedGlobalRuleConfiguration;
@@ -27,7 +30,10 @@ import org.junit.jupiter.api.extension.ExtendWith;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
+import javax.validation.constraints.NotBlank;
import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.Collections;
import java.util.List;
@@ -36,6 +42,7 @@ import static org.hamcrest.Matchers.is;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.verifyNoInteractions;
import static org.mockito.Mockito.when;
@ExtendWith(MockitoExtension.class)
@@ -89,4 +96,18 @@ class GlobalRulePersistServiceTest {
verify(repository).persist("/rules/global_fixture/versions/0", "name:
foo_value" + System.lineSeparator());
verify(repository).persist("/rules/global_fixture/active_version",
"0");
}
+
+ @Test
+ void assertPersistWithInvalidRuleConfiguration() {
+ Collection<RuleConfiguration> ruleConfigs = Arrays.asList(new
MockedGlobalRuleConfiguration("foo_value"), new
InvalidGlobalRuleConfiguration());
+ assertThrows(InvalidRuleConfigurationException.class, () ->
globalRulePersistService.persist(ruleConfigs));
+ verifyNoInteractions(repository);
+ }
+
+ @Getter
+ private static final class InvalidGlobalRuleConfiguration implements
GlobalRuleConfiguration {
+
+ @NotBlank
+ private final String name = "";
+ }
}