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 1b4a52a7796 Add
ImportRuleConfigurationProvider.getRequiredDataSourceNames() (#30623)
1b4a52a7796 is described below
commit 1b4a52a7796a1fd4f3fac9c4ef2b9705d4366e59
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Mar 24 13:45:46 2024 +0800
Add ImportRuleConfigurationProvider.getRequiredDataSourceNames() (#30623)
* Add ImportRuleConfigurationProvider.getRequiredDataSourceNames()
* Add ImportRuleConfigurationProvider.getRequiredDataSourceNames()
---
...teSplittingImportRuleConfigurationProvider.java | 31 ++++-------
...littingImportRuleConfigurationProviderTest.java | 3 +-
.../ShadowImportRuleConfigurationProvider.java | 40 ++++----------
.../ShardingImportRuleConfigurationProvider.java | 39 ++++---------
...hardingImportRuleConfigurationProviderTest.java | 3 +-
.../database/ImportRuleConfigurationChecker.java | 64 ++++++++++++++++++++++
.../database/ImportRuleConfigurationProvider.java | 13 +++++
.../YamlDatabaseConfigurationImportExecutor.java | 6 +-
8 files changed, 114 insertions(+), 85 deletions(-)
diff --git
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProvider.java
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProvider.java
index 9be7a390639..aeeac9b6298 100644
---
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProvider.java
+++
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProvider.java
@@ -18,18 +18,14 @@
package org.apache.shardingsphere.readwritesplitting.distsql.handler.provider;
import
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
-import
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
import
org.apache.shardingsphere.infra.algorithm.loadbalancer.core.LoadBalanceAlgorithm;
-import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
import java.util.Collection;
import java.util.LinkedHashSet;
-import java.util.stream.Collectors;
/**
* Readwrite-splitting import rule configuration provider.
@@ -38,32 +34,25 @@ public final class
ReadwriteSplittingImportRuleConfigurationProvider implements
@Override
public void check(final ShardingSphereDatabase database, final
ReadwriteSplittingRuleConfiguration ruleConfig) {
- checkDataSources(database, ruleConfig);
checkLoadBalancers(ruleConfig);
}
- private void checkDataSources(final ShardingSphereDatabase database, final
ReadwriteSplittingRuleConfiguration ruleConfig) {
- Collection<String> requiredDataSources = new LinkedHashSet<>();
+ private void checkLoadBalancers(final ReadwriteSplittingRuleConfiguration
ruleConfig) {
+ ruleConfig.getLoadBalancers().values().forEach(each ->
TypedSPILoader.checkService(LoadBalanceAlgorithm.class, each.getType(),
each.getProps()));
+ }
+
+ @Override
+ public Collection<String> getRequiredDataSourceNames(final
ReadwriteSplittingRuleConfiguration ruleConfig) {
+ Collection<String> result = new LinkedHashSet<>();
for (ReadwriteSplittingDataSourceRuleConfiguration each :
ruleConfig.getDataSources()) {
if (null != each.getWriteDataSourceName()) {
- requiredDataSources.add(each.getWriteDataSourceName());
+ result.add(each.getWriteDataSourceName());
}
if (!each.getReadDataSourceNames().isEmpty()) {
- requiredDataSources.addAll(each.getReadDataSourceNames());
+ result.addAll(each.getReadDataSourceNames());
}
}
- Collection<String> notExistedDataSources =
database.getResourceMetaData().getNotExistedDataSources(requiredDataSources);
- Collection<String> logicalDataSources = getLogicDataSources(database);
- notExistedDataSources.removeIf(logicalDataSources::contains);
-
ShardingSpherePreconditions.checkState(notExistedDataSources.isEmpty(), () ->
new MissingRequiredStorageUnitsException(database.getName(),
notExistedDataSources));
- }
-
- private Collection<String> getLogicDataSources(final
ShardingSphereDatabase database) {
- return
database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class).stream().flatMap(each
-> each.getDataSourceMapper().keySet().stream()).collect(Collectors.toSet());
- }
-
- private void checkLoadBalancers(final ReadwriteSplittingRuleConfiguration
ruleConfig) {
- ruleConfig.getLoadBalancers().values().forEach(each ->
TypedSPILoader.checkService(LoadBalanceAlgorithm.class, each.getType(),
each.getProps()));
+ return result;
}
@Override
diff --git
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProviderTest.java
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProviderTest.java
index 13275211ec5..f9d20a89a22 100644
---
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProviderTest.java
+++
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/provider/ReadwriteSplittingImportRuleConfigurationProviderTest.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.readwritesplitting.distsql.handler.provider;
+import
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationChecker;
import
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
import
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -46,7 +47,7 @@ class ReadwriteSplittingImportRuleConfigurationProviderTest {
void assertCheckDataSources() {
ShardingSphereDatabase database = mockDatabaseWithDataSource();
ReadwriteSplittingRuleConfiguration currentRuleConfig =
getRuleConfigWithNotExistedDataSources();
- assertThrows(MissingRequiredStorageUnitsException.class, () ->
importRuleConfigProvider.check(database, currentRuleConfig));
+ assertThrows(MissingRequiredStorageUnitsException.class, () ->
ImportRuleConfigurationChecker.checkRule(currentRuleConfig, database));
}
@Test
diff --git
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/provider/ShadowImportRuleConfigurationProvider.java
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/provider/ShadowImportRuleConfigurationProvider.java
index da3bab54f63..b9ebb241217 100644
---
a/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/provider/ShadowImportRuleConfigurationProvider.java
+++
b/features/shadow/distsql/handler/src/main/java/org/apache/shardingsphere/shadow/distsql/handler/provider/ShadowImportRuleConfigurationProvider.java
@@ -19,10 +19,8 @@ package
org.apache.shardingsphere.shadow.distsql.handler.provider;
import
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
import
org.apache.shardingsphere.distsql.handler.exception.rule.DuplicateRuleException;
-import
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.shadow.api.config.ShadowRuleConfiguration;
import org.apache.shardingsphere.shadow.spi.ShadowAlgorithm;
@@ -39,20 +37,23 @@ public final class ShadowImportRuleConfigurationProvider
implements ImportRuleCo
@Override
public void check(final ShardingSphereDatabase database, final
ShadowRuleConfiguration ruleConfig) {
- checkDataSources(database, ruleConfig);
checkTables(database.getName(), ruleConfig);
checkShadowAlgorithms(ruleConfig);
}
- private void checkDataSources(final ShardingSphereDatabase database, final
ShadowRuleConfiguration ruleConfig) {
- Collection<String> requiredResource = getRequiredResources(ruleConfig);
- Collection<String> notExistedResources =
database.getResourceMetaData().getNotExistedDataSources(requiredResource);
- Collection<String> logicResources = getLogicDataSources(database);
- notExistedResources.removeIf(logicResources::contains);
- ShardingSpherePreconditions.checkState(notExistedResources.isEmpty(),
() -> new MissingRequiredStorageUnitsException(database.getName(),
notExistedResources));
+ private void checkTables(final String databaseName, final
ShadowRuleConfiguration ruleConfig) {
+ Collection<String> tableNames = ruleConfig.getTables().keySet();
+ Collection<String> duplicatedTables =
tableNames.stream().collect(Collectors.groupingBy(each -> each,
Collectors.counting())).entrySet().stream()
+ .filter(each -> each.getValue() >
1).map(Entry::getKey).collect(Collectors.toSet());
+ ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), ()
-> new DuplicateRuleException("SHADOW", databaseName, duplicatedTables));
}
- private Collection<String> getRequiredResources(final
ShadowRuleConfiguration ruleConfig) {
+ private void checkShadowAlgorithms(final ShadowRuleConfiguration
ruleConfig) {
+ ruleConfig.getShadowAlgorithms().values().forEach(each ->
TypedSPILoader.checkService(ShadowAlgorithm.class, each.getType(),
each.getProps()));
+ }
+
+ @Override
+ public Collection<String> getRequiredDataSourceNames(final
ShadowRuleConfiguration ruleConfig) {
Collection<String> result = new LinkedHashSet<>();
ruleConfig.getDataSources().forEach(each -> {
if (null != each.getShadowDataSourceName()) {
@@ -65,25 +66,6 @@ public final class ShadowImportRuleConfigurationProvider
implements ImportRuleCo
return result;
}
- private Collection<String> getLogicDataSources(final
ShardingSphereDatabase database) {
- Collection<String> result = new LinkedHashSet<>();
- for (DataSourceMapperRuleAttribute each :
database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class)) {
- result.addAll(each.getDataSourceMapper().keySet());
- }
- return result;
- }
-
- private void checkTables(final String databaseName, final
ShadowRuleConfiguration ruleConfig) {
- Collection<String> tableNames = ruleConfig.getTables().keySet();
- Collection<String> duplicatedTables =
tableNames.stream().collect(Collectors.groupingBy(each -> each,
Collectors.counting())).entrySet().stream()
- .filter(each -> each.getValue() >
1).map(Entry::getKey).collect(Collectors.toSet());
- ShardingSpherePreconditions.checkState(duplicatedTables.isEmpty(), ()
-> new DuplicateRuleException("SHADOW", databaseName, duplicatedTables));
- }
-
- private void checkShadowAlgorithms(final ShadowRuleConfiguration
ruleConfig) {
- ruleConfig.getShadowAlgorithms().values().forEach(each ->
TypedSPILoader.checkService(ShadowAlgorithm.class, each.getType(),
each.getProps()));
- }
-
@Override
public Class<ShadowRuleConfiguration> getType() {
return ShadowRuleConfiguration.class;
diff --git
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingImportRuleConfigurationProvider.java
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingImportRuleConfigurationProvider.java
index 83e6a199f74..2099e919c68 100644
---
a/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingImportRuleConfigurationProvider.java
+++
b/features/sharding/distsql/handler/src/main/java/org/apache/shardingsphere/sharding/distsql/handler/provider/ShardingImportRuleConfigurationProvider.java
@@ -19,14 +19,12 @@ package
org.apache.shardingsphere.sharding.distsql.handler.provider;
import
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
import
org.apache.shardingsphere.distsql.handler.exception.rule.DuplicateRuleException;
-import
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
import
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
import
org.apache.shardingsphere.infra.algorithm.keygen.core.KeyGenerateAlgorithm;
import org.apache.shardingsphere.infra.datanode.DataNode;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.expr.core.InlineExpressionParserFactory;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
-import
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.sharding.api.config.ShardingRuleConfiguration;
import
org.apache.shardingsphere.sharding.api.config.rule.ShardingAutoTableRuleConfiguration;
@@ -49,7 +47,6 @@ public final class ShardingImportRuleConfigurationProvider
implements ImportRule
@Override
public void check(final ShardingSphereDatabase database, final
ShardingRuleConfiguration ruleConfig) {
checkLogicTables(database.getName(), ruleConfig);
- checkDataSources(database, ruleConfig);
checkShardingAlgorithms(ruleConfig.getShardingAlgorithms().values());
checkKeyGeneratorAlgorithms(ruleConfig.getKeyGenerators().values());
}
@@ -62,45 +59,29 @@ public final class ShardingImportRuleConfigurationProvider
implements ImportRule
ShardingSpherePreconditions.checkState(duplicatedLogicTables.isEmpty(), () ->
new DuplicateRuleException("sharding", databaseName, duplicatedLogicTables));
}
- private void checkDataSources(final ShardingSphereDatabase database, final
ShardingRuleConfiguration ruleConfig) {
- Collection<String> requiredDataSources =
getRequiredDataSources(ruleConfig);
- Collection<String> notExistedDataSources =
database.getResourceMetaData().getNotExistedDataSources(requiredDataSources);
- Collection<String> logicDataSources = getLogicDataSources(database);
- notExistedDataSources.removeIf(logicDataSources::contains);
-
ShardingSpherePreconditions.checkState(notExistedDataSources.isEmpty(), () ->
new MissingRequiredStorageUnitsException(database.getName(),
notExistedDataSources));
+ private void checkShardingAlgorithms(final
Collection<AlgorithmConfiguration> algorithmConfigs) {
+ algorithmConfigs.forEach(each ->
TypedSPILoader.checkService(ShardingAlgorithm.class, each.getType(),
each.getProps()));
+ }
+
+ private void checkKeyGeneratorAlgorithms(final
Collection<AlgorithmConfiguration> algorithmConfigs) {
+ algorithmConfigs.stream().filter(Objects::nonNull).forEach(each ->
TypedSPILoader.checkService(KeyGenerateAlgorithm.class, each.getType(),
each.getProps()));
}
- private Collection<String> getRequiredDataSources(final
ShardingRuleConfiguration ruleConfig) {
+ @Override
+ public Collection<String> getRequiredDataSourceNames(final
ShardingRuleConfiguration ruleConfig) {
Collection<String> result = new LinkedHashSet<>();
ruleConfig.getTables().forEach(each ->
result.addAll(getDataSourceNames(each)));
ruleConfig.getAutoTables().forEach(each ->
result.addAll(getDataSourceNames(each)));
return result;
}
- private Collection<String> getDataSourceNames(final
ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfig) {
- Collection<String> actualDataSources =
InlineExpressionParserFactory.newInstance(shardingAutoTableRuleConfig.getActualDataSources()).splitAndEvaluate();
- return new HashSet<>(actualDataSources);
- }
-
private Collection<String> getDataSourceNames(final
ShardingTableRuleConfiguration shardingTableRuleConfig) {
Collection<String> actualDataNodes =
InlineExpressionParserFactory.newInstance(shardingTableRuleConfig.getActualDataNodes()).splitAndEvaluate();
return actualDataNodes.stream().map(each -> new
DataNode(each).getDataSourceName()).collect(Collectors.toList());
}
- private Collection<String> getLogicDataSources(final
ShardingSphereDatabase database) {
- Collection<String> result = new LinkedHashSet<>();
- for (DataSourceMapperRuleAttribute each :
database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class)) {
- result.addAll(each.getDataSourceMapper().keySet());
- }
- return result;
- }
-
- private void checkShardingAlgorithms(final
Collection<AlgorithmConfiguration> algorithmConfigs) {
- algorithmConfigs.forEach(each ->
TypedSPILoader.checkService(ShardingAlgorithm.class, each.getType(),
each.getProps()));
- }
-
- private void checkKeyGeneratorAlgorithms(final
Collection<AlgorithmConfiguration> algorithmConfigs) {
- algorithmConfigs.stream().filter(Objects::nonNull).forEach(each ->
TypedSPILoader.checkService(KeyGenerateAlgorithm.class, each.getType(),
each.getProps()));
+ private Collection<String> getDataSourceNames(final
ShardingAutoTableRuleConfiguration shardingAutoTableRuleConfig) {
+ return new
HashSet<>(InlineExpressionParserFactory.newInstance(shardingAutoTableRuleConfig.getActualDataSources()).splitAndEvaluate());
}
@Override
diff --git
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/provider/ShardingImportRuleConfigurationProviderTest.java
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/provider/ShardingImportRuleConfigurationProviderTest.java
index 2a7daf22128..fe3da7f9a1e 100644
---
a/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/provider/ShardingImportRuleConfigurationProviderTest.java
+++
b/features/sharding/distsql/handler/src/test/java/org/apache/shardingsphere/sharding/distsql/provider/ShardingImportRuleConfigurationProviderTest.java
@@ -17,6 +17,7 @@
package org.apache.shardingsphere.sharding.distsql.provider;
+import
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationChecker;
import
org.apache.shardingsphere.distsql.handler.exception.rule.DuplicateRuleException;
import
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
import
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
@@ -49,7 +50,7 @@ class ShardingImportRuleConfigurationProviderTest {
void assertCheckDataSources() {
ShardingRuleConfiguration currentRuleConfig = new
ShardingRuleConfiguration();
currentRuleConfig.getTables().add(new
ShardingTableRuleConfiguration("t_order", "ds_${0..2}.t_order_${0..2}"));
- assertThrows(MissingRequiredStorageUnitsException.class, () -> new
ShardingImportRuleConfigurationProvider().check(mockDatabaseWithDataSource(),
currentRuleConfig));
+ assertThrows(MissingRequiredStorageUnitsException.class, () ->
ImportRuleConfigurationChecker.checkRule(currentRuleConfig,
mockDatabaseWithDataSource()));
}
@Test
diff --git
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java
new file mode 100644
index 00000000000..d24d9db9fa3
--- /dev/null
+++
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationChecker.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database;
+
+import lombok.AccessLevel;
+import lombok.NoArgsConstructor;
+import
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
+import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
+import
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMapperRuleAttribute;
+import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
+
+import java.util.Collection;
+import java.util.Optional;
+import java.util.stream.Collectors;
+
+/**
+ * Import rule configuration checker.
+ */
+@NoArgsConstructor(access = AccessLevel.PRIVATE)
+public final class ImportRuleConfigurationChecker {
+
+ /**
+ * Check rule.
+ *
+ * @param ruleConfig rule configuration
+ * @param database database
+ */
+ @SuppressWarnings({"unchecked", "rawtypes"})
+ public static void checkRule(final RuleConfiguration ruleConfig, final
ShardingSphereDatabase database) {
+ Optional<ImportRuleConfigurationProvider> importProvider =
TypedSPILoader.findService(ImportRuleConfigurationProvider.class,
ruleConfig.getClass());
+ if (importProvider.isPresent()) {
+ Collection<String> requiredDataSourceNames =
importProvider.get().getRequiredDataSourceNames(ruleConfig);
+ if (!requiredDataSourceNames.isEmpty()) {
+ checkDataSourcesExisted(database, requiredDataSourceNames);
+ }
+ importProvider.get().check(database, ruleConfig);
+ }
+ }
+
+ private static void checkDataSourcesExisted(final ShardingSphereDatabase
database, final Collection<String> requiredDataSourceNames) {
+ Collection<String> notExistedDataSources =
database.getResourceMetaData().getNotExistedDataSources(requiredDataSourceNames);
+ Collection<String> logicDataSources =
database.getRuleMetaData().getAttributes(DataSourceMapperRuleAttribute.class).stream()
+ .flatMap(each ->
each.getDataSourceMapper().keySet().stream()).collect(Collectors.toSet());
+ notExistedDataSources.removeIf(logicDataSources::contains);
+
ShardingSpherePreconditions.checkState(notExistedDataSources.isEmpty(), () ->
new MissingRequiredStorageUnitsException(database.getName(),
notExistedDataSources));
+ }
+}
diff --git
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationProvider.java
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationProvider.java
index 61195f43e5c..f428b6cfc92 100644
---
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationProvider.java
+++
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/ral/rule/spi/database/ImportRuleConfigurationProvider.java
@@ -22,6 +22,9 @@ import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI;
+import java.util.Collection;
+import java.util.Collections;
+
/**
* Import rule configuration provider.
*
@@ -38,6 +41,16 @@ public interface ImportRuleConfigurationProvider<T extends
RuleConfiguration> ex
*/
void check(ShardingSphereDatabase database, T ruleConfig);
+ /**
+ * Get required data source names.
+ *
+ * @param ruleConfig rule configuration
+ * @return required data source names
+ */
+ default Collection<String> getRequiredDataSourceNames(T ruleConfig) {
+ return Collections.emptyList();
+ }
+
@Override
Class<T> getType();
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
index 622af678883..cc232ad03bd 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
@@ -17,7 +17,7 @@
package org.apache.shardingsphere.proxy.backend.util;
-import
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationProvider;
+import
org.apache.shardingsphere.distsql.handler.engine.update.ral.rule.spi.database.ImportRuleConfigurationChecker;
import
org.apache.shardingsphere.distsql.handler.exception.datasource.MissingRequiredDataSourcesException;
import
org.apache.shardingsphere.distsql.handler.exception.storageunit.InvalidStorageUnitsException;
import
org.apache.shardingsphere.distsql.handler.validate.DataSourcePoolPropertiesValidator;
@@ -39,7 +39,6 @@ import
org.apache.shardingsphere.infra.metadata.database.resource.unit.StorageUn
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRuleBuilder;
import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
-import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import
org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapper;
import org.apache.shardingsphere.mode.manager.ContextManager;
@@ -140,9 +139,8 @@ public final class YamlDatabaseConfigurationImportExecutor {
metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(metaDataContexts.getMetaData().getDatabase(databaseName).getName(),
ruleConfigs);
}
- @SuppressWarnings("unchecked")
private void addRule(final Collection<RuleConfiguration> ruleConfigs,
final RuleConfiguration ruleConfig, final ShardingSphereDatabase database) {
- TypedSPILoader.findService(ImportRuleConfigurationProvider.class,
ruleConfig.getClass()).ifPresent(optional -> optional.check(database,
ruleConfig));
+ ImportRuleConfigurationChecker.checkRule(ruleConfig, database);
ruleConfigs.add(ruleConfig);
database.getRuleMetaData().getRules().add(buildRule(ruleConfig,
database));
}