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(