This is an automated email from the ASF dual-hosted git repository.
zhangliang 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 c17837e Fix wrong metadata when config single dataSource for
ReadwriteSplitting (#15805)
c17837e is described below
commit c17837e35a007321f22e29fbc780f664264e6d09
Author: Zhengqiang Duan <[email protected]>
AuthorDate: Sat Mar 5 22:52:27 2022 +0800
Fix wrong metadata when config single dataSource for ReadwriteSplitting
(#15805)
* Fix wrong metadata when config single dataSource for ReadwriteSplitting
* optimize param name
---
.../singletable/route/SingleTableSQLRouter.java | 5 ++-
.../route/SingleTableSQLRouterTest.java | 43 ++++++++++++++++++++--
2 files changed, 43 insertions(+), 5 deletions(-)
diff --git
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouter.java
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouter.java
index 484107a..ded2140 100644
---
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouter.java
+++
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/main/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouter.java
@@ -47,8 +47,9 @@ public final class SingleTableSQLRouter implements
SQLRouter<SingleTableRule> {
public RouteContext createRouteContext(final LogicSQL logicSQL, final
ShardingSphereMetaData metaData, final SingleTableRule rule, final
ConfigurationProperties props) {
RouteContext result = new RouteContext();
if (1 == metaData.getResource().getDataSources().size()) {
- String singleDataSourceName =
metaData.getResource().getDataSources().keySet().iterator().next();
- result.getRouteUnits().add(new RouteUnit(new
RouteMapper(singleDataSourceName, singleDataSourceName),
Collections.emptyList()));
+ String logicDataSource =
rule.getDataSourceNames().iterator().next();
+ String actualDataSource =
metaData.getResource().getDataSources().keySet().iterator().next();
+ result.getRouteUnits().add(new RouteUnit(new
RouteMapper(logicDataSource, actualDataSource), Collections.emptyList()));
} else {
route(logicSQL.getSqlStatementContext(), rule, result, props);
}
diff --git
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouterTest.java
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouterTest.java
index 0949d7a..1dc7622 100644
---
a/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouterTest.java
+++
b/shardingsphere-kernel/shardingsphere-single-table/shardingsphere-single-table-core/src/test/java/org/apache/shardingsphere/singletable/route/SingleTableSQLRouterTest.java
@@ -57,26 +57,43 @@ public final class SingleTableSQLRouterTest {
@Test
public void assertCreateRouteContextWithSingleDataSource() {
SingleTableRule singleTableRule = new SingleTableRule(new
SingleTableRuleConfiguration(), mock(DatabaseType.class),
- createDataSourceMap(), Collections.emptyList(), new
ConfigurationProperties(new Properties()));
+ createSingleDataSourceMap(), Collections.emptyList(), new
ConfigurationProperties(new Properties()));
singleTableRule.getSingleTableDataNodes().put("t_order",
Collections.singletonList(new DataNode("ds_0", "t_order")));
ShardingSphereMetaData metaData = mockSingleDataSourceMetaData();
RouteContext actual = new
SingleTableSQLRouter().createRouteContext(createLogicSQL(), metaData,
singleTableRule, new ConfigurationProperties(new Properties()));
List<RouteUnit> routeUnits = new ArrayList<>(actual.getRouteUnits());
assertThat(actual.getRouteUnits().size(), is(1));
+ assertThat(routeUnits.get(0).getDataSourceMapper().getLogicName(),
is("ds_0"));
assertThat(routeUnits.get(0).getDataSourceMapper().getActualName(),
is("ds_0"));
assertThat(routeUnits.get(0).getTableMappers().size(), is(0));
assertFalse(actual.isFederated());
}
@Test
+ public void assertCreateRouteContextWithReadwriteSplittingDataSource() {
+ SingleTableRule singleTableRule = new SingleTableRule(new
SingleTableRuleConfiguration(), mock(DatabaseType.class),
+ createReadwriteSplittingDataSourceMap(),
Collections.emptyList(), new ConfigurationProperties(new Properties()));
+ singleTableRule.getSingleTableDataNodes().put("t_order",
Collections.singletonList(new DataNode("write_ds", "t_order")));
+ ShardingSphereMetaData metaData =
mockReadwriteSplittingDataSourceMetaData();
+ RouteContext actual = new
SingleTableSQLRouter().createRouteContext(createLogicSQL(), metaData,
singleTableRule, new ConfigurationProperties(new Properties()));
+ List<RouteUnit> routeUnits = new ArrayList<>(actual.getRouteUnits());
+ assertThat(actual.getRouteUnits().size(), is(1));
+ assertThat(routeUnits.get(0).getDataSourceMapper().getLogicName(),
is("readwrite_ds"));
+ assertThat(routeUnits.get(0).getDataSourceMapper().getActualName(),
is("write_ds"));
+ assertThat(routeUnits.get(0).getTableMappers().size(), is(0));
+ assertFalse(actual.isFederated());
+ }
+
+ @Test
public void assertCreateRouteContextWithMultiDataSource() {
SingleTableRule singleTableRule = new SingleTableRule(new
SingleTableRuleConfiguration(), mock(DatabaseType.class),
- createDataSourceMap(), Collections.emptyList(), new
ConfigurationProperties(new Properties()));
+ createMultiDataSourceMap(), Collections.emptyList(), new
ConfigurationProperties(new Properties()));
singleTableRule.getSingleTableDataNodes().put("t_order",
Collections.singletonList(new DataNode("ds_0", "t_order")));
ShardingSphereMetaData metaData = mockMultiDataSourceMetaData();
RouteContext actual = new
SingleTableSQLRouter().createRouteContext(createLogicSQL(), metaData,
singleTableRule, new ConfigurationProperties(new Properties()));
List<RouteUnit> routeUnits = new ArrayList<>(actual.getRouteUnits());
assertThat(actual.getRouteUnits().size(), is(1));
+ assertThat(routeUnits.get(0).getDataSourceMapper().getLogicName(),
is("ds_0"));
assertThat(routeUnits.get(0).getDataSourceMapper().getActualName(),
is("ds_0"));
assertThat(routeUnits.get(0).getTableMappers().size(), is(1));
RouteMapper tableMapper =
routeUnits.get(0).getTableMappers().iterator().next();
@@ -93,6 +110,14 @@ public final class SingleTableSQLRouterTest {
return result;
}
+ private ShardingSphereMetaData mockReadwriteSplittingDataSourceMetaData() {
+ ShardingSphereMetaData result = mock(ShardingSphereMetaData.class,
RETURNS_DEEP_STUBS);
+ Map<String, DataSource> dataSourceMap = new HashMap<>(2, 1);
+ dataSourceMap.put("write_ds", mock(DataSource.class,
RETURNS_DEEP_STUBS));
+ when(result.getResource().getDataSources()).thenReturn(dataSourceMap);
+ return result;
+ }
+
private ShardingSphereMetaData mockMultiDataSourceMetaData() {
ShardingSphereMetaData result = mock(ShardingSphereMetaData.class,
RETURNS_DEEP_STUBS);
Map<String, DataSource> dataSourceMap = new HashMap<>(2, 1);
@@ -113,7 +138,19 @@ public final class SingleTableSQLRouterTest {
return new LogicSQL(sqlStatementContext, "create table",
parametersList);
}
- private Map<String, DataSource> createDataSourceMap() {
+ private Map<String, DataSource> createSingleDataSourceMap() {
+ Map<String, DataSource> result = new HashMap<>(2, 1);
+ result.put("ds_0", mock(DataSource.class, RETURNS_DEEP_STUBS));
+ return result;
+ }
+
+ private Map<String, DataSource> createReadwriteSplittingDataSourceMap() {
+ Map<String, DataSource> result = new HashMap<>(2, 1);
+ result.put("readwrite_ds", mock(DataSource.class, RETURNS_DEEP_STUBS));
+ return result;
+ }
+
+ private Map<String, DataSource> createMultiDataSourceMap() {
Map<String, DataSource> result = new HashMap<>(2, 1);
result.put("ds_0", mock(DataSource.class, RETURNS_DEEP_STUBS));
result.put("ds_1", mock(DataSource.class, RETURNS_DEEP_STUBS));