You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by su...@apache.org on 2022/12/25 06:11:54 UTC

[shardingsphere] branch master updated: Optimize register storage unit handler. (#23089)

This is an automated email from the ASF dual-hosted git repository.

sunnianjun 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 7a269347697 Optimize register storage unit handler. (#23089)
7a269347697 is described below

commit 7a26934769728c4e6e4b467470a8a0fe77920cb6
Author: Raigor <ra...@gmail.com>
AuthorDate: Sun Dec 25 14:11:44 2022 +0800

    Optimize register storage unit handler. (#23089)
---
 ...erter.java => DataSourceSegmentsConverter.java} | 14 +++----
 ...t.java => DataSourceSegmentsConverterTest.java} |  4 +-
 .../RegisterMigrationSourceStorageUnitUpdater.java |  4 +-
 .../resource/AlterStorageUnitBackendHandler.java   |  4 +-
 .../RegisterStorageUnitBackendHandler.java         | 48 +++++++++++-----------
 .../RegisterStorageUnitBackendHandlerTest.java     | 38 +++--------------
 6 files changed, 42 insertions(+), 70 deletions(-)

diff --git a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/converter/ResourceSegmentsConverter.java b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/converter/DataSourceSegmentsConverter.java
similarity index 90%
rename from distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/converter/ResourceSegmentsConverter.java
rename to distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/converter/DataSourceSegmentsConverter.java
index 827b9df4e9b..cd890066349 100644
--- a/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/converter/ResourceSegmentsConverter.java
+++ b/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/parser/segment/converter/DataSourceSegmentsConverter.java
@@ -30,21 +30,21 @@ import java.util.LinkedHashMap;
 import java.util.Map;
 
 /**
- * Resource segments converter.
+ * Data source segments converter.
  */
 @NoArgsConstructor(access = AccessLevel.PRIVATE)
-public final class ResourceSegmentsConverter {
+public final class DataSourceSegmentsConverter {
     
     /**
-     * Convert resource segments to data source properties map.
+     * Convert data source segments to data source properties map.
      *
      * @param databaseType database type
-     * @param resources data source segments
+     * @param dataSourceSegments data source segments
      * @return data source properties map
      */
-    public static Map<String, DataSourceProperties> convert(final DatabaseType databaseType, final Collection<DataSourceSegment> resources) {
-        Map<String, DataSourceProperties> result = new LinkedHashMap<>(resources.size(), 1);
-        for (DataSourceSegment each : resources) {
+    public static Map<String, DataSourceProperties> convert(final DatabaseType databaseType, final Collection<DataSourceSegment> dataSourceSegments) {
+        Map<String, DataSourceProperties> result = new LinkedHashMap<>(dataSourceSegments.size(), 1);
+        for (DataSourceSegment each : dataSourceSegments) {
             result.put(each.getName(), new DataSourceProperties("com.zaxxer.hikari.HikariDataSource", createProperties(databaseType, each)));
         }
         return result;
diff --git a/distsql/statement/src/test/java/org/apache/shardingsphere/distsql/parser/segment/converter/ResourceSegmentsConverterTest.java b/distsql/statement/src/test/java/org/apache/shardingsphere/distsql/parser/segment/converter/DataSourceSegmentsConverterTest.java
similarity index 92%
rename from distsql/statement/src/test/java/org/apache/shardingsphere/distsql/parser/segment/converter/ResourceSegmentsConverterTest.java
rename to distsql/statement/src/test/java/org/apache/shardingsphere/distsql/parser/segment/converter/DataSourceSegmentsConverterTest.java
index b56d91e60dc..b8947894a4e 100644
--- a/distsql/statement/src/test/java/org/apache/shardingsphere/distsql/parser/segment/converter/ResourceSegmentsConverterTest.java
+++ b/distsql/statement/src/test/java/org/apache/shardingsphere/distsql/parser/segment/converter/DataSourceSegmentsConverterTest.java
@@ -34,11 +34,11 @@ import static org.hamcrest.CoreMatchers.is;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 
-public final class ResourceSegmentsConverterTest {
+public final class DataSourceSegmentsConverterTest {
     
     @Test
     public void assertConvert() {
-        Map<String, DataSourceProperties> actual = ResourceSegmentsConverter.convert(new MySQLDatabaseType(), createDataSourceSegments());
+        Map<String, DataSourceProperties> actual = DataSourceSegmentsConverter.convert(new MySQLDatabaseType(), createDataSourceSegments());
         assertThat(actual.size(), is(2));
         assertTrue(actual.keySet().containsAll(Arrays.asList("ds0", "ds1")));
         assertThat(actual.values().iterator().next().getAllLocalProperties().get("username"), is("root0"));
diff --git a/kernel/data-pipeline/distsql/handler/src/main/java/org/apache/shardingsphere/migration/distsql/handler/update/RegisterMigrationSourceStorageUnitUpdater.java b/kernel/data-pipeline/distsql/handler/src/main/java/org/apache/shardingsphere/migration/distsql/handler/update/RegisterMigrationSourceStorageUnitUpdater.java
index fe7c5ed2d61..c526cf5e329 100644
--- a/kernel/data-pipeline/distsql/handler/src/main/java/org/apache/shardingsphere/migration/distsql/handler/update/RegisterMigrationSourceStorageUnitUpdater.java
+++ b/kernel/data-pipeline/distsql/handler/src/main/java/org/apache/shardingsphere/migration/distsql/handler/update/RegisterMigrationSourceStorageUnitUpdater.java
@@ -23,7 +23,7 @@ import org.apache.shardingsphere.distsql.handler.validate.DataSourcePropertiesVa
 import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
 import org.apache.shardingsphere.distsql.parser.segment.HostnameAndPortBasedDataSourceSegment;
 import org.apache.shardingsphere.distsql.parser.segment.URLBasedDataSourceSegment;
-import org.apache.shardingsphere.distsql.parser.segment.converter.ResourceSegmentsConverter;
+import org.apache.shardingsphere.distsql.parser.segment.converter.DataSourceSegmentsConverter;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.database.type.DatabaseTypeEngine;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
@@ -51,7 +51,7 @@ public final class RegisterMigrationSourceStorageUnitUpdater implements RALUpdat
                 () -> new UnsupportedSQLOperationException("Not currently support add hostname and port, please use url"));
         URLBasedDataSourceSegment urlBasedDataSourceSegment = (URLBasedDataSourceSegment) dataSources.get(0);
         DatabaseType databaseType = DatabaseTypeEngine.getDatabaseType(urlBasedDataSourceSegment.getUrl());
-        Map<String, DataSourceProperties> sourcePropertiesMap = ResourceSegmentsConverter.convert(databaseType, dataSources);
+        Map<String, DataSourceProperties> sourcePropertiesMap = DataSourceSegmentsConverter.convert(databaseType, dataSources);
         validateHandler.validate(sourcePropertiesMap);
         jobAPI.addMigrationSourceResources(sourcePropertiesMap);
     }
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/AlterStorageUnitBackendHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/AlterStorageUnitBackendHandler.java
index fbab6054c71..f3853601b7d 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/AlterStorageUnitBackendHandler.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/AlterStorageUnitBackendHandler.java
@@ -22,7 +22,7 @@ import org.apache.shardingsphere.distsql.handler.validate.DataSourcePropertiesVa
 import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
 import org.apache.shardingsphere.distsql.parser.segment.HostnameAndPortBasedDataSourceSegment;
 import org.apache.shardingsphere.distsql.parser.segment.URLBasedDataSourceSegment;
-import org.apache.shardingsphere.distsql.parser.segment.converter.ResourceSegmentsConverter;
+import org.apache.shardingsphere.distsql.parser.segment.converter.DataSourceSegmentsConverter;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterStorageUnitStatement;
 import org.apache.shardingsphere.infra.database.metadata.url.JdbcUrl;
 import org.apache.shardingsphere.infra.database.metadata.url.StandardJdbcUrlParser;
@@ -68,7 +68,7 @@ public final class AlterStorageUnitBackendHandler extends DatabaseRequiredBacken
     @Override
     public ResponseHeader execute(final String databaseName, final AlterStorageUnitStatement sqlStatement) {
         checkSQLStatement(databaseName, sqlStatement);
-        Map<String, DataSourceProperties> dataSourcePropsMap = ResourceSegmentsConverter.convert(databaseType, sqlStatement.getStorageUnits());
+        Map<String, DataSourceProperties> dataSourcePropsMap = DataSourceSegmentsConverter.convert(databaseType, sqlStatement.getStorageUnits());
         validateHandler.validate(dataSourcePropsMap);
         try {
             ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().alterStorageUnits(databaseName, dataSourcePropsMap);
diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java
index dcb1c4b3516..332f41f2b13 100644
--- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java
+++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java
@@ -22,10 +22,11 @@ import org.apache.shardingsphere.distsql.handler.exception.resource.DuplicateRes
 import org.apache.shardingsphere.distsql.handler.exception.resource.InvalidResourcesException;
 import org.apache.shardingsphere.distsql.handler.validate.DataSourcePropertiesValidateHandler;
 import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
-import org.apache.shardingsphere.distsql.parser.segment.converter.ResourceSegmentsConverter;
+import org.apache.shardingsphere.distsql.parser.segment.converter.DataSourceSegmentsConverter;
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.RegisterStorageUnitStatement;
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
+import org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
 import org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
 import org.apache.shardingsphere.infra.util.exception.external.server.ShardingSphereServerException;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -33,19 +34,13 @@ import org.apache.shardingsphere.proxy.backend.handler.DatabaseRequiredBackendHa
 import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
-import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
-import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
 
 import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Map;
-import java.util.Optional;
-import java.util.Set;
 import java.util.stream.Collectors;
 
 /**
@@ -67,15 +62,12 @@ public final class RegisterStorageUnitBackendHandler extends DatabaseRequiredBac
     @Override
     public ResponseHeader execute(final String databaseName, final RegisterStorageUnitStatement sqlStatement) {
         checkSQLStatement(databaseName, sqlStatement);
-        Map<String, DataSourceProperties> dataSourcePropsMap = ResourceSegmentsConverter.convert(databaseType, sqlStatement.getStorageUnits());
+        Map<String, DataSourceProperties> dataSourcePropsMap = DataSourceSegmentsConverter.convert(databaseType, sqlStatement.getStorageUnits());
         if (sqlStatement.isIfNotExists()) {
-            Set<String> currentStorageUnits = ProxyContext.getInstance().getContextManager().getDataSourceMap(databaseName).keySet();
-            Iterator<String> iterator = dataSourcePropsMap.keySet().iterator();
-            while (iterator.hasNext()) {
-                if (currentStorageUnits.contains(iterator.next())) {
-                    iterator.remove();
-                }
-            }
+            Collection<String> currentStorageUnits = getCurrentStorageUnitNames(databaseName);
+            Collection<String> logicalDataSourceNames = getLogicalDataSourceNames(databaseName);
+            dataSourcePropsMap.keySet().removeIf(currentStorageUnits::contains);
+            dataSourcePropsMap.keySet().removeIf(logicalDataSourceNames::contains);
         }
         if (dataSourcePropsMap.isEmpty()) {
             return new UpdateResponseHeader(sqlStatement);
@@ -95,14 +87,14 @@ public final class RegisterStorageUnitBackendHandler extends DatabaseRequiredBac
         Collection<String> dataSourceNames = new ArrayList<>(sqlStatement.getStorageUnits().size());
         if (!sqlStatement.isIfNotExists()) {
             checkDuplicatedDataSourceNames(databaseName, dataSourceNames, sqlStatement);
-            checkDuplicatedDataSourceNameWithReadwriteSplittingRule(databaseName, dataSourceNames);
+            checkDuplicatedLogicalDataSourceNames(databaseName, dataSourceNames);
         }
     }
     
     private void checkDuplicatedDataSourceNames(final String databaseName, final Collection<String> dataSourceNames, final RegisterStorageUnitStatement sqlStatement) {
         Collection<String> duplicatedDataSourceNames = new HashSet<>(sqlStatement.getStorageUnits().size(), 1);
         for (DataSourceSegment each : sqlStatement.getStorageUnits()) {
-            if (dataSourceNames.contains(each.getName()) || ProxyContext.getInstance().getDatabase(databaseName).getResourceMetaData().getDataSources().containsKey(each.getName())) {
+            if (dataSourceNames.contains(each.getName()) || getCurrentStorageUnitNames(databaseName).contains(each.getName())) {
                 duplicatedDataSourceNames.add(each.getName());
             }
             dataSourceNames.add(each.getName());
@@ -110,16 +102,22 @@ public final class RegisterStorageUnitBackendHandler extends DatabaseRequiredBac
         ShardingSpherePreconditions.checkState(duplicatedDataSourceNames.isEmpty(), () -> new DuplicateResourceException(duplicatedDataSourceNames));
     }
     
-    private void checkDuplicatedDataSourceNameWithReadwriteSplittingRule(final String databaseName, final Collection<String> requiredDataSourceNames) {
-        // TODO use SPI to decouple features
-        Optional<ReadwriteSplittingRule> rule = ProxyContext.getInstance().getDatabase(databaseName).getRuleMetaData().findSingleRule(ReadwriteSplittingRule.class);
-        if (!rule.isPresent()) {
+    private void checkDuplicatedLogicalDataSourceNames(final String databaseName, final Collection<String> requiredDataSourceNames) {
+        Collection<String> logicalDataSourceNames = getLogicalDataSourceNames(databaseName);
+        if (logicalDataSourceNames.isEmpty()) {
             return;
         }
-        ReadwriteSplittingRuleConfiguration ruleConfig = (ReadwriteSplittingRuleConfiguration) rule.get().getConfiguration();
-        Collection<String> existedRuleNames = ruleConfig.getDataSources().stream().map(ReadwriteSplittingDataSourceRuleConfiguration::getName).collect(Collectors.toSet());
-        Collection<String> duplicatedDataSourceNames = requiredDataSourceNames.stream().filter(existedRuleNames::contains).collect(Collectors.toSet());
+        Collection<String> duplicatedDataSourceNames = requiredDataSourceNames.stream().filter(logicalDataSourceNames::contains).collect(Collectors.toSet());
         ShardingSpherePreconditions.checkState(duplicatedDataSourceNames.isEmpty(),
-                () -> new InvalidResourcesException(Collections.singleton(String.format("%s already exists in readwrite splitting", duplicatedDataSourceNames))));
+                () -> new InvalidResourcesException(Collections.singleton(String.format("%s already existed in rule", duplicatedDataSourceNames))));
+    }
+    
+    private Collection<String> getCurrentStorageUnitNames(final String databaseName) {
+        return ProxyContext.getInstance().getContextManager().getDataSourceMap(databaseName).keySet();
+    }
+    
+    private Collection<String> getLogicalDataSourceNames(final String databaseName) {
+        return ProxyContext.getInstance().getDatabase(databaseName).getRuleMetaData().getRules().stream().filter(each -> each instanceof DataSourceContainedRule)
+                .map(each -> ((DataSourceContainedRule) each).getDataSourceMapper().keySet()).flatMap(Collection::stream).collect(Collectors.toList());
     }
 }
diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandlerTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandlerTest.java
index 588cf2e0abe..b098d92f9bd 100644
--- a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandlerTest.java
+++ b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandlerTest.java
@@ -26,8 +26,8 @@ import org.apache.shardingsphere.distsql.parser.segment.URLBasedDataSourceSegmen
 import org.apache.shardingsphere.distsql.parser.statement.rdl.create.RegisterStorageUnitStatement;
 import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData;
 import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData;
+import org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -35,9 +35,6 @@ import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
 import org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResponseHeader;
 import org.apache.shardingsphere.proxy.backend.session.ConnectionSession;
 import org.apache.shardingsphere.proxy.backend.util.ProxyContextRestorer;
-import org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
-import org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -49,7 +46,6 @@ import org.mockito.junit.MockitoJUnitRunner;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.LinkedList;
-import java.util.Optional;
 import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.instanceOf;
@@ -76,15 +72,9 @@ public final class RegisterStorageUnitBackendHandlerTest extends ProxyContextRes
     @Mock
     private ShardingSphereDatabase database;
     
-    @Mock
-    private ShardingSphereResourceMetaData resourceMetaData;
-    
     @Mock
     private ShardingSphereRuleMetaData ruleMetaData;
     
-    @Mock
-    private ReadwriteSplittingRule readwriteSplittingRule;
-    
     private RegisterStorageUnitBackendHandler registerStorageUnitBackendHandler;
     
     @Before
@@ -93,7 +83,6 @@ public final class RegisterStorageUnitBackendHandlerTest extends ProxyContextRes
         when(metaDataContexts.getMetaData().containsDatabase("test_db")).thenReturn(true);
         when(connectionSession.getProtocolType()).thenReturn(new MySQLDatabaseType());
         when(database.getRuleMetaData()).thenReturn(ruleMetaData);
-        when(ruleMetaData.findSingleRule(ReadwriteSplittingRule.class)).thenReturn(Optional.of(readwriteSplittingRule));
         registerStorageUnitBackendHandler = new RegisterStorageUnitBackendHandler(registerStorageUnitStatement, connectionSession);
         Plugins.getMemberAccessor().set(registerStorageUnitBackendHandler.getClass().getDeclaredField("validateHandler"), registerStorageUnitBackendHandler, validateHandler);
     }
@@ -103,10 +92,6 @@ public final class RegisterStorageUnitBackendHandlerTest extends ProxyContextRes
         ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
         ProxyContext.init(contextManager);
-        when(metaDataContexts.getMetaData().getDatabases()).thenReturn(Collections.singletonMap("test_db", database));
-        when(database.getResourceMetaData()).thenReturn(resourceMetaData);
-        when(resourceMetaData.getDataSources()).thenReturn(Collections.emptyMap());
-        when(readwriteSplittingRule.getConfiguration()).thenReturn(createReadwriteSplittingRuleConfiguration("read_write"));
         ResponseHeader responseHeader = registerStorageUnitBackendHandler.execute("test_db", createRegisterStorageUnitStatement());
         assertThat(responseHeader, instanceOf(UpdateResponseHeader.class));
     }
@@ -116,32 +101,25 @@ public final class RegisterStorageUnitBackendHandlerTest extends ProxyContextRes
         ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
         ProxyContext.init(contextManager);
-        when(metaDataContexts.getMetaData().getDatabases()).thenReturn(Collections.singletonMap("test_db", database));
-        when(database.getResourceMetaData()).thenReturn(resourceMetaData);
-        when(resourceMetaData.getDataSources()).thenReturn(Collections.emptyMap());
         registerStorageUnitBackendHandler.execute("test_db", createRegisterStorageUnitStatementWithDuplicateStorageUnitNames());
     }
     
     @Test(expected = DuplicateResourceException.class)
     public void assertExecuteWithDuplicateStorageUnitNamesWithResourceMetaData() {
         ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS);
-        when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
         ProxyContext.init(contextManager);
-        when(metaDataContexts.getMetaData().getDatabases()).thenReturn(Collections.singletonMap("test_db", database));
-        when(database.getResourceMetaData()).thenReturn(resourceMetaData);
-        when(resourceMetaData.getDataSources()).thenReturn(Collections.singletonMap("ds_0", null));
+        when(contextManager.getDataSourceMap("test_db").keySet()).thenReturn(Collections.singleton("ds_0"));
         registerStorageUnitBackendHandler.execute("test_db", createRegisterStorageUnitStatement());
     }
     
     @Test(expected = InvalidResourcesException.class)
-    public void assertExecuteWithDuplicateStorageUnitNamesWithReadwriteSplittingRule() {
+    public void assertExecuteWithDuplicateStorageUnitNamesWithDataSourceContainedRule() {
         ContextManager contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS);
         when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
         ProxyContext.init(contextManager);
-        when(metaDataContexts.getMetaData().getDatabases()).thenReturn(Collections.singletonMap("test_db", database));
-        when(database.getResourceMetaData()).thenReturn(resourceMetaData);
-        when(resourceMetaData.getDataSources()).thenReturn(Collections.emptyMap());
-        when(readwriteSplittingRule.getConfiguration()).thenReturn(createReadwriteSplittingRuleConfiguration("ds_0"));
+        DataSourceContainedRule rule = mock(DataSourceContainedRule.class);
+        when(rule.getDataSourceMapper()).thenReturn(Collections.singletonMap("ds_0", Collections.emptyList()));
+        when(database.getRuleMetaData().getRules()).thenReturn(Collections.singletonList(rule));
         registerStorageUnitBackendHandler.execute("test_db", createRegisterStorageUnitStatement());
     }
     
@@ -152,10 +130,6 @@ public final class RegisterStorageUnitBackendHandlerTest extends ProxyContextRes
         registerStorageUnitBackendHandler.checkSQLStatement("test_db", registerStorageUnitStatementWithIfNotExists);
     }
     
-    private ReadwriteSplittingRuleConfiguration createReadwriteSplittingRuleConfiguration(final String ruleName) {
-        return new ReadwriteSplittingRuleConfiguration(Collections.singleton(new ReadwriteSplittingDataSourceRuleConfiguration(ruleName, null, null, null)), Collections.emptyMap());
-    }
-    
     private RegisterStorageUnitStatement createRegisterStorageUnitStatement() {
         return new RegisterStorageUnitStatement(false, Collections.singleton(new URLBasedDataSourceSegment("ds_0", "jdbc:mysql://127.0.0.1:3306/test0", "root", "", new Properties())));
     }