You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2026/08/10 15:17:47 UTC
(shardingsphere) branch master updated: Evaluate inline expressions in readwrite-splitting data source names (#39374)
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 e246f00d805 Evaluate inline expressions in readwrite-splitting data source names (#39374)
e246f00d805 is described below
commit e246f00d80591ee91667f25060a1649174343c36
Author: Eunbin Son <58...@users.noreply.github.com>
AuthorDate: Tue Aug 11 00:17:41 2026 +0900
Evaluate inline expressions in readwrite-splitting data source names (#39374)
---
RELEASE-NOTES.md | 1 +
.../ReadwriteSplittingRuleConfigurationChecker.java | 16 +++++++++++-----
...dwriteSplittingRuleConfigurationCheckerTest.java | 21 +++++++++++++++++++++
3 files changed, 33 insertions(+), 5 deletions(-)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index e3d10f3adaa..9396f7e16fc 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -55,6 +55,7 @@
1. Sharding: Fix generated actual index names exceeding database identifier length limits while preserving legacy generated index name compatibility - [#38449](https://github.com/apache/shardingsphere/pull/38449)
1. Sharding: Fix AUTO_INTERVAL sharding failure under JVM default locales that use comma decimal separators - [#38806](https://github.com/apache/shardingsphere/pull/38806)
1. Sharding: Compute the Snowflake key generator epoch in UTC instead of the JVM default timezone - [#38932](https://github.com/apache/shardingsphere/pull/38932)
+1. Readwrite-splitting: Evaluate inline expressions in data source names of rule configuration checker - [#39374](https://github.com/apache/shardingsphere/pull/39374)
1. SQL Federation: Fix SQL Federation pagination binding for long LIMIT parameters - [#39237](https://github.com/apache/shardingsphere/pull/39237)
### Enhancements
diff --git a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
index 0cde88dad39..c4ba0f172c5 100644
--- a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
+++ b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationChecker.java
@@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.algorithm.loadbalancer.spi.LoadBalanceAlg
import org.apache.shardingsphere.infra.config.rule.checker.DatabaseRuleConfigurationChecker;
import org.apache.shardingsphere.infra.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.exception.external.sql.identifier.SQLExceptionIdentifier;
+import org.apache.shardingsphere.infra.expr.entry.InlineExpressionParserFactory;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.readwritesplitting.config.ReadwriteSplittingRuleConfiguration;
@@ -31,6 +32,7 @@ import org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingO
import javax.sql.DataSource;
import java.util.Collection;
+import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
@@ -64,7 +66,7 @@ public final class ReadwriteSplittingRuleConfigurationChecker implements Databas
}
LoadBalanceAlgorithm loadBalancer = loadBalancers.get(each.getLoadBalancerName());
ShardingSpherePreconditions.checkNotNull(loadBalancer, () -> new UnregisteredAlgorithmException("Load balancer", each.getLoadBalancerName(), new SQLExceptionIdentifier(databaseName)));
- loadBalancer.check(databaseName, each.getReadDataSourceNames());
+ loadBalancer.check(databaseName, getActualDataSourceNames(each.getReadDataSourceNames()));
}
}
@@ -73,15 +75,19 @@ public final class ReadwriteSplittingRuleConfigurationChecker implements Databas
Collection<String> result = new LinkedHashSet<>();
for (ReadwriteSplittingDataSourceGroupRuleConfiguration each : ruleConfig.getDataSourceGroups()) {
if (null != each.getWriteDataSourceName()) {
- result.add(each.getWriteDataSourceName());
- }
- if (!each.getReadDataSourceNames().isEmpty()) {
- result.addAll(each.getReadDataSourceNames());
+ result.addAll(getActualDataSourceNames(Collections.singleton(each.getWriteDataSourceName())));
}
+ result.addAll(getActualDataSourceNames(each.getReadDataSourceNames()));
}
return result;
}
+ private Collection<String> getActualDataSourceNames(final Collection<String> dataSourceNames) {
+ Collection<String> result = new LinkedHashSet<>();
+ dataSourceNames.forEach(each -> result.addAll(InlineExpressionParserFactory.newInstance(each).splitAndEvaluate()));
+ return result;
+ }
+
@Override
public int getOrder() {
return ReadwriteSplittingOrder.ORDER;
diff --git a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
index 893f778db0f..b82c23ef38e 100644
--- a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
+++ b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/checker/ReadwriteSplittingRuleConfigurationCheckerTest.java
@@ -101,6 +101,18 @@ class ReadwriteSplittingRuleConfigurationCheckerTest {
assertThrows(AlgorithmInitializationException.class, () -> checker.check("test", ruleConfig, mockDataSources(), Collections.emptyList()));
}
+ @Test
+ void assertCheckWeightLoadBalanceWithInlineExpressionDataSourceNames() {
+ ReadwriteSplittingRuleConfiguration ruleConfig = mock(ReadwriteSplittingRuleConfiguration.class);
+ Collection<ReadwriteSplittingDataSourceGroupRuleConfiguration> configs = Collections.singleton(
+ createDataSourceGroupRuleConfiguration("write_ds_0", Collections.singletonList("read_ds_${0..1}")));
+ when(ruleConfig.getDataSourceGroups()).thenReturn(configs);
+ AlgorithmConfiguration algorithm = new AlgorithmConfiguration("WEIGHT", PropertiesBuilder.build(new Property("read_ds_0", "1"), new Property("read_ds_1", "2")));
+ when(ruleConfig.getLoadBalancers()).thenReturn(Collections.singletonMap("weight_ds", algorithm));
+ DatabaseRuleConfigurationChecker checker = OrderedSPILoader.getServicesByClass(DatabaseRuleConfigurationChecker.class, Collections.singleton(ruleConfig.getClass())).get(ruleConfig.getClass());
+ assertDoesNotThrow(() -> checker.check("test", ruleConfig, mockDataSources(), Collections.emptyList()));
+ }
+
@Test
void assertCheckWhenConfigOtherRulesDatasource() {
ReadwriteSplittingRuleConfiguration ruleConfig = createContainsOtherRulesDatasourceConfiguration();
@@ -149,6 +161,15 @@ class ReadwriteSplittingRuleConfigurationCheckerTest {
assertThat(checker.getRequiredDataSourceNames(ruleConfig), is(new LinkedHashSet<>(Arrays.asList("write_ds", "read_ds0", "read_ds1"))));
}
+ @Test
+ void assertGetRequiredDataSourceNamesWithInlineExpression() {
+ ReadwriteSplittingDataSourceGroupRuleConfiguration dataSourceGroupConfig = new ReadwriteSplittingDataSourceGroupRuleConfiguration(
+ "foo_group_${0..1}", "write_ds_${0..1}", Collections.singletonList("read_ds_${0..1}"), "foo_algo");
+ ReadwriteSplittingRuleConfiguration ruleConfig = new ReadwriteSplittingRuleConfiguration(Collections.singleton(dataSourceGroupConfig), Collections.emptyMap());
+ DatabaseRuleConfigurationChecker checker = OrderedSPILoader.getServicesByClass(DatabaseRuleConfigurationChecker.class, Collections.singleton(ruleConfig.getClass())).get(ruleConfig.getClass());
+ assertThat(checker.getRequiredDataSourceNames(ruleConfig), is(new LinkedHashSet<>(Arrays.asList("write_ds_0", "write_ds_1", "read_ds_0", "read_ds_1"))));
+ }
+
@Test
void assertGetRequiredDataSourceNamesWhenEmpty() {
ReadwriteSplittingDataSourceGroupRuleConfiguration dataSourceGroupConfig = new ReadwriteSplittingDataSourceGroupRuleConfiguration(