This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 95bc6efaa3e Add Readwrite-splitting feature error code (#23478)
95bc6efaa3e is described below
commit 95bc6efaa3ea7a5a659ae190e83effaf70f859cf
Author: zhaojinchao <[email protected]>
AuthorDate: Wed Jan 11 09:17:41 2023 +0800
Add Readwrite-splitting feature error code (#23478)
* Add Readwrite-splitting feature error code
* Update error code
* Fix checkstyle
* Add more readwrite-splitting exception error code
* Fix checkstyle
---
...ReplicaWeightReadQueryLoadBalanceAlgorithm.java | 5 ++-
...sactionWeightReadQueryLoadBalanceAlgorithm.java | 5 ++-
.../WeightReadQueryLoadBalanceAlgorithm.java | 5 ++-
...ReadwriteSplittingRuleConfigurationChecker.java | 43 +++++++++++++++-------
...MissingRequiredReadDatabaseWeightException.java | 33 +++++++++++++++++
.../checker/DataSourceNameExistedException.java | 33 +++++++++++++++++
.../checker/DuplicateDataSourceException.java | 33 +++++++++++++++++
...idWeightLoadBalancerConfigurationException.java | 33 +++++++++++++++++
.../LoadBalancerAlgorithmNotFoundException.java | 33 +++++++++++++++++
...ngRequiredAutoAwareDataSourceNameException.java | 33 +++++++++++++++++
.../MissingRequiredDataSourceNameException.java | 33 +++++++++++++++++
...issingRequiredReadDataSourceNamesException.java | 33 +++++++++++++++++
...issingRequiredWriteDataSourceNameException.java | 33 +++++++++++++++++
...lidInlineExpressionDataSourceNameException.java | 33 +++++++++++++++++
.../rule/ReadwriteSplittingRule.java | 11 ++++--
...writeSplittingRuleConfigurationCheckerTest.java | 8 ++--
16 files changed, 384 insertions(+), 23 deletions(-)
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightReadQueryLoadBalanceAlgorithm.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightReadQueryLoadBalanceAlgorithm.java
index 6d5ace05a70..453952d61f9 100644
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightReadQueryLoadBalanceAlgorithm.java
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/FixedReplicaWeightReadQueryLoadBalanceAlgorithm.java
@@ -20,7 +20,9 @@ package
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import com.google.common.base.Preconditions;
import lombok.Getter;
import
org.apache.shardingsphere.infra.context.transaction.TransactionConnectionContext;
+import
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import
org.apache.shardingsphere.readwritesplitting.exception.algorithm.InvalidReadDatabaseWeightException;
+import
org.apache.shardingsphere.readwritesplitting.exception.algorithm.MissingRequiredReadDatabaseWeightException;
import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import java.util.Arrays;
@@ -106,7 +108,8 @@ public final class
FixedReplicaWeightReadQueryLoadBalanceAlgorithm implements Re
private double getWeightValue(final String readDataSourceName) {
Object weightObject = props.get(readDataSourceName);
- Preconditions.checkNotNull(weightObject, "Read database `%s` access
weight is not configured", readDataSourceName);
+ ShardingSpherePreconditions.checkNotNull(weightObject, () -> new
MissingRequiredReadDatabaseWeightException(getType(),
+ String.format("Read database `%s` access weight is not
configured", readDataSourceName)));
double result;
try {
result = Double.parseDouble(weightObject.toString());
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReadQueryLoadBalanceAlgorithm.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReadQueryLoadBalanceAlgorithm.java
index 8c6821303f5..071d315174a 100644
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReadQueryLoadBalanceAlgorithm.java
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/TransactionWeightReadQueryLoadBalanceAlgorithm.java
@@ -20,7 +20,9 @@ package
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import com.google.common.base.Preconditions;
import lombok.Getter;
import
org.apache.shardingsphere.infra.context.transaction.TransactionConnectionContext;
+import
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import
org.apache.shardingsphere.readwritesplitting.exception.algorithm.InvalidReadDatabaseWeightException;
+import
org.apache.shardingsphere.readwritesplitting.exception.algorithm.MissingRequiredReadDatabaseWeightException;
import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import java.util.Arrays;
@@ -100,7 +102,8 @@ public final class
TransactionWeightReadQueryLoadBalanceAlgorithm implements Rea
private double getWeightValue(final String readDataSourceName) {
Object weightObject = props.get(readDataSourceName);
- Preconditions.checkNotNull(weightObject, "Read database `%s` access
weight is not configured", readDataSourceName);
+ ShardingSpherePreconditions.checkNotNull(weightObject, () -> new
MissingRequiredReadDatabaseWeightException(getType(),
+ String.format("Read database `%s` access weight is not
configured", readDataSourceName)));
double result;
try {
result = Double.parseDouble(weightObject.toString());
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReadQueryLoadBalanceAlgorithm.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReadQueryLoadBalanceAlgorithm.java
index ad20cdd9081..e3add991ee2 100644
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReadQueryLoadBalanceAlgorithm.java
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/algorithm/loadbalance/WeightReadQueryLoadBalanceAlgorithm.java
@@ -20,7 +20,9 @@ package
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance;
import com.google.common.base.Preconditions;
import lombok.Getter;
import
org.apache.shardingsphere.infra.context.transaction.TransactionConnectionContext;
+import
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import
org.apache.shardingsphere.readwritesplitting.exception.algorithm.InvalidReadDatabaseWeightException;
+import
org.apache.shardingsphere.readwritesplitting.exception.algorithm.MissingRequiredReadDatabaseWeightException;
import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import java.util.Arrays;
@@ -103,7 +105,8 @@ public final class WeightReadQueryLoadBalanceAlgorithm
implements ReadQueryLoadB
private double getWeightValue(final String readDataSourceName) {
Object weightObject = props.get(readDataSourceName);
- Preconditions.checkNotNull(weightObject, "Read database `%s` access
weight is not configured", readDataSourceName);
+ ShardingSpherePreconditions.checkNotNull(weightObject, () -> new
MissingRequiredReadDatabaseWeightException(getType(),
+ String.format("Read database `%s` access weight is not
configured", readDataSourceName)));
double result;
try {
result = Double.parseDouble(weightObject.toString());
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 5cb5a06633e..77df65ef2a2 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
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.infra.config.rule.checker.RuleConfigurationChec
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.DataSourceContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.DynamicDataSourceContainedRule;
+import
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.util.expr.InlineExpressionParser;
import
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.TransactionWeightReadQueryLoadBalanceAlgorithm;
import
org.apache.shardingsphere.readwritesplitting.algorithm.loadbalance.WeightReadQueryLoadBalanceAlgorithm;
@@ -32,6 +33,15 @@ import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingD
import
org.apache.shardingsphere.readwritesplitting.api.strategy.DynamicReadwriteSplittingStrategyConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.strategy.StaticReadwriteSplittingStrategyConfiguration;
import
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingOrder;
+import
org.apache.shardingsphere.readwritesplitting.exception.algorithm.MissingRequiredReadDatabaseWeightException;
+import
org.apache.shardingsphere.readwritesplitting.exception.checker.DataSourceNameExistedException;
+import
org.apache.shardingsphere.readwritesplitting.exception.checker.MissingRequiredDataSourceNameException;
+import
org.apache.shardingsphere.readwritesplitting.exception.checker.MissingRequiredAutoAwareDataSourceNameException;
+import
org.apache.shardingsphere.readwritesplitting.exception.checker.MissingRequiredReadDataSourceNamesException;
+import
org.apache.shardingsphere.readwritesplitting.exception.checker.MissingRequiredWriteDataSourceNameException;
+import
org.apache.shardingsphere.readwritesplitting.exception.checker.DuplicateDataSourceException;
+import
org.apache.shardingsphere.readwritesplitting.exception.checker.LoadBalancerAlgorithmNotFoundException;
+import
org.apache.shardingsphere.readwritesplitting.exception.checker.InvalidWeightLoadBalancerConfigurationException;
import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import javax.sql.DataSource;
@@ -62,17 +72,17 @@ public final class
ReadwriteSplittingRuleConfigurationChecker implements RuleCon
Collection<String> addedWriteDataSourceNames = new HashSet<>();
Collection<String> addedReadDataSourceNames = new HashSet<>();
for (ReadwriteSplittingDataSourceRuleConfiguration each : configs) {
-
Preconditions.checkArgument(!Strings.isNullOrEmpty(each.getName()),
"Readwrite-splitting data source name is required.");
+
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(each.getName()),
() -> new MissingRequiredDataSourceNameException(databaseName));
Preconditions.checkState(null != each.getStaticStrategy() || null
!= each.getDynamicStrategy(), "No available readwrite-splitting rule
configuration in database `%s`.", databaseName);
Optional.ofNullable(each.getStaticStrategy()).ifPresent(optional
-> checkStaticStrategy(databaseName, dataSourceMap, addedWriteDataSourceNames,
addedReadDataSourceNames, optional, rules));
- Optional.ofNullable(each.getDynamicStrategy()).ifPresent(optional
-> checkDynamicStrategy(rules, optional));
+ Optional.ofNullable(each.getDynamicStrategy()).ifPresent(optional
-> checkDynamicStrategy(databaseName, rules, optional));
}
}
private void checkStaticStrategy(final String databaseName, final
Map<String, DataSource> dataSourceMap, final Collection<String>
addedWriteDataSourceNames,
final Collection<String>
readDataSourceNames, final StaticReadwriteSplittingStrategyConfiguration
strategyConfig, final Collection<ShardingSphereRule> rules) {
-
Preconditions.checkArgument(!Strings.isNullOrEmpty(strategyConfig.getWriteDataSourceName()),
"Write data source name is required.");
-
Preconditions.checkArgument(!strategyConfig.getReadDataSourceNames().isEmpty(),
"Read data source names are required.");
+
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(strategyConfig.getWriteDataSourceName()),
() -> new MissingRequiredWriteDataSourceNameException(databaseName));
+
ShardingSpherePreconditions.checkState(!strategyConfig.getReadDataSourceNames().isEmpty(),
() -> new MissingRequiredReadDataSourceNamesException(databaseName));
checkWriteDataSourceNames(databaseName, dataSourceMap,
addedWriteDataSourceNames, strategyConfig, rules);
for (String each : readDataSourceNames) {
checkReadeDataSourceNames(databaseName, dataSourceMap,
readDataSourceNames, each);
@@ -82,8 +92,10 @@ public final class
ReadwriteSplittingRuleConfigurationChecker implements RuleCon
private void checkWriteDataSourceNames(final String databaseName, final
Map<String, DataSource> dataSourceMap, final Collection<String>
addedWriteDataSourceNames,
final
StaticReadwriteSplittingStrategyConfiguration strategyConfig, final
Collection<ShardingSphereRule> rules) {
for (String each : new
InlineExpressionParser(strategyConfig.getWriteDataSourceName()).splitAndEvaluate())
{
- Preconditions.checkState(dataSourceMap.containsKey(each) ||
containsInOtherRules(each, rules), "Write data source name `%s` not in database
`%s`.", each, databaseName);
- Preconditions.checkState(addedWriteDataSourceNames.add(each), "Can
not config duplicate write data source `%s` in database `%s`.", each,
databaseName);
+
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each) ||
containsInOtherRules(each, rules), () ->
+ new DataSourceNameExistedException(String.format("Write
data source name `%s` not in database `%s`.", each, databaseName)));
+
ShardingSpherePreconditions.checkState(addedWriteDataSourceNames.add(each), ()
->
+ new DuplicateDataSourceException(String.format("Can not
config duplicate write data source `%s` in database `%s`.", each,
databaseName)));
}
}
@@ -99,13 +111,15 @@ public final class
ReadwriteSplittingRuleConfigurationChecker implements RuleCon
private void checkReadeDataSourceNames(final String databaseName,
final Map<String, DataSource>
dataSourceMap, final Collection<String> addedReadDataSourceNames, final String
readDataSourceName) {
for (String each : new
InlineExpressionParser(readDataSourceName).splitAndEvaluate()) {
- Preconditions.checkState(dataSourceMap.containsKey(each), "Read
data source name `%s` not in database `%s`.", each, databaseName);
- Preconditions.checkState(addedReadDataSourceNames.add(each), "Can
not config duplicate read data source `%s` in database `%s`.", each,
databaseName);
+
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each), () ->
+ new DataSourceNameExistedException(String.format("Read
data source name `%s` not in database `%s`.", each, databaseName)));
+
ShardingSpherePreconditions.checkState(addedReadDataSourceNames.add(each), () ->
+ new DuplicateDataSourceException(String.format("Can not
config duplicate read data source `%s` in database `%s`.", each,
databaseName)));
}
}
- private void checkDynamicStrategy(final Collection<ShardingSphereRule>
rules, final DynamicReadwriteSplittingStrategyConfiguration dynamicStrategy) {
-
Preconditions.checkArgument(!Strings.isNullOrEmpty(dynamicStrategy.getAutoAwareDataSourceName()),
"Auto aware data source name is required");
+ private void checkDynamicStrategy(final String databaseName, final
Collection<ShardingSphereRule> rules, final
DynamicReadwriteSplittingStrategyConfiguration dynamicStrategy) {
+
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(dynamicStrategy.getAutoAwareDataSourceName()),
() -> new MissingRequiredAutoAwareDataSourceNameException(databaseName));
Optional<ShardingSphereRule> dynamicDataSourceStrategy =
rules.stream().filter(each -> each instanceof
DynamicDataSourceContainedRule).findFirst();
Preconditions.checkArgument(dynamicDataSourceStrategy.isPresent(),
"Dynamic data source strategy is required");
}
@@ -117,12 +131,13 @@ public final class
ReadwriteSplittingRuleConfigurationChecker implements RuleCon
continue;
}
ReadQueryLoadBalanceAlgorithm loadBalancer =
loadBalancers.get(each.getLoadBalancerName());
- Preconditions.checkNotNull(loadBalancer, "Not found load balance
type in database `%s`", databaseName);
+ ShardingSpherePreconditions.checkNotNull(loadBalancer, () -> new
LoadBalancerAlgorithmNotFoundException(databaseName));
if (loadBalancer instanceof WeightReadQueryLoadBalanceAlgorithm ||
loadBalancer instanceof TransactionWeightReadQueryLoadBalanceAlgorithm) {
- Preconditions.checkState(!loadBalancer.getProps().isEmpty(),
"Readwrite-splitting data source weight config are required in database `%s`",
databaseName);
+
ShardingSpherePreconditions.checkState(!loadBalancer.getProps().isEmpty(), ()
-> new MissingRequiredReadDatabaseWeightException(loadBalancer.getType(),
+ String.format("Read data source weight config are
required in database `%s`", databaseName)));
Collection<String> dataSourceNames = getDataSourceNames(each,
rules);
-
loadBalancer.getProps().stringPropertyNames().forEach(dataSourceName ->
Preconditions.checkState(dataSourceNames.contains(dataSourceName),
- "Load Balancer datasource name config does not match
datasource in database `%s`", databaseName));
+
loadBalancer.getProps().stringPropertyNames().forEach(dataSourceName ->
ShardingSpherePreconditions.checkState(dataSourceNames.contains(dataSourceName),
+ () -> new
InvalidWeightLoadBalancerConfigurationException(databaseName)));
}
}
}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/algorithm/MissingRequiredReadDatabaseWeightException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/algorithm/MissingRequiredReadDatabaseWeightException.java
new file mode 100644
index 00000000000..5e09a6153dd
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/algorithm/MissingRequiredReadDatabaseWeightException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.readwritesplitting.exception.algorithm;
+
+import
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
+
+/**
+ * Missing required read database weight exception.
+ */
+public final class MissingRequiredReadDatabaseWeightException extends
ReadwriteSplittingSQLException {
+
+ private static final long serialVersionUID = 8006957930250488016L;
+
+ public MissingRequiredReadDatabaseWeightException(final String
loadBalancerType, final String reason) {
+ super(XOpenSQLState.CHECK_OPTION_VIOLATION, 81, "Load balancer
algorithm `%s` initialization failed, reason is: %s.", loadBalancerType,
reason);
+ }
+}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/DataSourceNameExistedException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/DataSourceNameExistedException.java
new file mode 100644
index 00000000000..407f32a9fcf
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/DataSourceNameExistedException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.readwritesplitting.exception.checker;
+
+import
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
+
+/**
+ * Data source name existed exception.
+ */
+public final class DataSourceNameExistedException extends
ReadwriteSplittingSQLException {
+
+ private static final long serialVersionUID = 1284608200400804784L;
+
+ public DataSourceNameExistedException(final String reason) {
+ super(XOpenSQLState.NOT_FOUND, 94, reason);
+ }
+}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/DuplicateDataSourceException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/DuplicateDataSourceException.java
new file mode 100644
index 00000000000..de3a32049f3
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/DuplicateDataSourceException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.readwritesplitting.exception.checker;
+
+import
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
+
+/**
+ * Duplicate write data source exception.
+ */
+public final class DuplicateDataSourceException extends
ReadwriteSplittingSQLException {
+
+ private static final long serialVersionUID = -58671655670347084L;
+
+ public DuplicateDataSourceException(final String reason) {
+ super(XOpenSQLState.DUPLICATE, 93, reason);
+ }
+}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/InvalidWeightLoadBalancerConfigurationException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/InvalidWeightLoadBalancerConfigurationException.java
new file mode 100644
index 00000000000..bfe7d8a6685
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/InvalidWeightLoadBalancerConfigurationException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.readwritesplitting.exception.checker;
+
+import
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
+
+/**
+ * Invalid weight load balancer configuration exception.
+ */
+public final class InvalidWeightLoadBalancerConfigurationException extends
ReadwriteSplittingSQLException {
+
+ private static final long serialVersionUID = 7206356551434539781L;
+
+ public InvalidWeightLoadBalancerConfigurationException(final String
databaseName) {
+ super(XOpenSQLState.CHECK_OPTION_VIOLATION, 97, "Weight load balancer
datasource name config does not match data sources in database `%s`.",
databaseName);
+ }
+}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/LoadBalancerAlgorithmNotFoundException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/LoadBalancerAlgorithmNotFoundException.java
new file mode 100644
index 00000000000..da6b2c48e89
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/LoadBalancerAlgorithmNotFoundException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.readwritesplitting.exception.checker;
+
+import
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
+
+/**
+ * Load balancer algorithm not found exception.
+ */
+public final class LoadBalancerAlgorithmNotFoundException extends
ReadwriteSplittingSQLException {
+
+ private static final long serialVersionUID = -5517443698152561344L;
+
+ public LoadBalancerAlgorithmNotFoundException(final String databaseName) {
+ super(XOpenSQLState.NOT_FOUND, 96, "Not found load balance type in
database `%s`.", databaseName);
+ }
+}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredAutoAwareDataSourceNameException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredAutoAwareDataSourceNameException.java
new file mode 100644
index 00000000000..7298a5c4763
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredAutoAwareDataSourceNameException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.readwritesplitting.exception.checker;
+
+import
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
+
+/**
+ * Missing required auto aware data source name exception.
+ */
+public final class MissingRequiredAutoAwareDataSourceNameException extends
ReadwriteSplittingSQLException {
+
+ private static final long serialVersionUID = -7921103941300062641L;
+
+ public MissingRequiredAutoAwareDataSourceNameException(final String
databaseName) {
+ super(XOpenSQLState.CHECK_OPTION_VIOLATION, 95, "Auto aware data
source name is required in database `%s`.", databaseName);
+ }
+}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredDataSourceNameException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredDataSourceNameException.java
new file mode 100644
index 00000000000..9567b9667c1
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredDataSourceNameException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.readwritesplitting.exception.checker;
+
+import
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
+
+/**
+ * Missing required data source name exception.
+ */
+public final class MissingRequiredDataSourceNameException extends
ReadwriteSplittingSQLException {
+
+ private static final long serialVersionUID = 8006957930250488016L;
+
+ public MissingRequiredDataSourceNameException(final String databaseName) {
+ super(XOpenSQLState.CHECK_OPTION_VIOLATION, 90, "Data source name is
required in database `%s`.", databaseName);
+ }
+}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredReadDataSourceNamesException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredReadDataSourceNamesException.java
new file mode 100644
index 00000000000..b39b3609d43
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredReadDataSourceNamesException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.readwritesplitting.exception.checker;
+
+import
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
+
+/**
+ * Missing required read data source names exception.
+ */
+public final class MissingRequiredReadDataSourceNamesException extends
ReadwriteSplittingSQLException {
+
+ private static final long serialVersionUID = 3795576963060485964L;
+
+ public MissingRequiredReadDataSourceNamesException(final String
databaseName) {
+ super(XOpenSQLState.CHECK_OPTION_VIOLATION, 92, "Read data source
names is required in database `%s`.", databaseName);
+ }
+}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredWriteDataSourceNameException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredWriteDataSourceNameException.java
new file mode 100644
index 00000000000..2c769bf5e7b
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/checker/MissingRequiredWriteDataSourceNameException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.readwritesplitting.exception.checker;
+
+import
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
+
+/**
+ * Missing required write data source name exception.
+ */
+public final class MissingRequiredWriteDataSourceNameException extends
ReadwriteSplittingSQLException {
+
+ private static final long serialVersionUID = -3310589272704868388L;
+
+ public MissingRequiredWriteDataSourceNameException(final String
databaseName) {
+ super(XOpenSQLState.CHECK_OPTION_VIOLATION, 91, "Write data source
name is required in database `%s`.", databaseName);
+ }
+}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/rule/InvalidInlineExpressionDataSourceNameException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/rule/InvalidInlineExpressionDataSourceNameException.java
new file mode 100644
index 00000000000..8cbe065fbf7
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/rule/InvalidInlineExpressionDataSourceNameException.java
@@ -0,0 +1,33 @@
+/*
+ * 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.readwritesplitting.exception.rule;
+
+import
org.apache.shardingsphere.infra.util.exception.external.sql.sqlstate.XOpenSQLState;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
+
+/**
+ * Invalid inline expression data source name exception.
+ */
+public final class InvalidInlineExpressionDataSourceNameException extends
ReadwriteSplittingSQLException {
+
+ private static final long serialVersionUID = 87659916563551964L;
+
+ public InvalidInlineExpressionDataSourceNameException(final String reason)
{
+ super(XOpenSQLState.CHECK_OPTION_VIOLATION, 70, reason);
+ }
+}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
index 78c00624491..256dee05cfd 100644
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRule.java
@@ -31,6 +31,7 @@ import
org.apache.shardingsphere.infra.rule.identifier.type.StorageConnectorReus
import
org.apache.shardingsphere.infra.rule.identifier.type.exportable.ExportableRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.exportable.constant.ExportableConstants;
import
org.apache.shardingsphere.infra.rule.identifier.type.exportable.constant.ExportableItemConstants;
+import
org.apache.shardingsphere.infra.util.exception.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.util.expr.InlineExpressionParser;
import
org.apache.shardingsphere.infra.util.spi.type.required.RequiredSPIRegistry;
import org.apache.shardingsphere.mode.metadata.storage.StorageNodeStatus;
@@ -39,6 +40,7 @@ import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleCo
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.strategy.DynamicReadwriteSplittingStrategyConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.strategy.StaticReadwriteSplittingStrategyConfiguration;
+import
org.apache.shardingsphere.readwritesplitting.exception.rule.InvalidInlineExpressionDataSourceNameException;
import
org.apache.shardingsphere.readwritesplitting.spi.ReadQueryLoadBalanceAlgorithm;
import
org.apache.shardingsphere.readwritesplitting.strategy.type.DynamicReadwriteSplittingStrategy;
import
org.apache.shardingsphere.readwritesplitting.strategy.type.StaticReadwriteSplittingStrategy;
@@ -92,8 +94,10 @@ public final class ReadwriteSplittingRule implements
DatabaseRule, DataSourceCon
List<String> inlineWriteDatasourceNames = new
InlineExpressionParser(config.getStaticStrategy().getWriteDataSourceName()).splitAndEvaluate();
List<List<String>> inlineReadDatasourceNames =
config.getStaticStrategy().getReadDataSourceNames().stream()
.map(each -> new
InlineExpressionParser(each).splitAndEvaluate()).collect(Collectors.toList());
- Preconditions.checkArgument(inlineWriteDatasourceNames.size() ==
inlineReadwriteDataSourceNames.size(), "Inline expression write data source
names size error");
- inlineReadDatasourceNames.forEach(each ->
Preconditions.checkArgument(each.size() ==
inlineReadwriteDataSourceNames.size(), "Inline expression read data source
names size error"));
+
ShardingSpherePreconditions.checkState(inlineWriteDatasourceNames.size() ==
inlineReadwriteDataSourceNames.size(),
+ () -> new
InvalidInlineExpressionDataSourceNameException("Inline expression write data
source names size error"));
+ inlineReadDatasourceNames.forEach(each ->
ShardingSpherePreconditions.checkState(each.size() ==
inlineReadwriteDataSourceNames.size(),
+ () -> new
InvalidInlineExpressionDataSourceNameException("Inline expression read data
source names size error")));
for (int i = 0; i < inlineReadwriteDataSourceNames.size(); i++) {
ReadwriteSplittingDataSourceRuleConfiguration staticConfig =
createStaticDataSourceRuleConfiguration(
config, i, inlineReadwriteDataSourceNames,
inlineWriteDatasourceNames, inlineReadDatasourceNames);
@@ -116,7 +120,8 @@ public final class ReadwriteSplittingRule implements
DatabaseRule, DataSourceCon
Map<String, ReadwriteSplittingDataSourceRule> result = new
LinkedHashMap<>();
List<String> inlineReadwriteDataSourceNames = new
InlineExpressionParser(config.getName()).splitAndEvaluate();
List<String> inlineAutoAwareDataSourceNames = new
InlineExpressionParser(config.getDynamicStrategy().getAutoAwareDataSourceName()).splitAndEvaluate();
- Preconditions.checkArgument(inlineAutoAwareDataSourceNames.size() ==
inlineReadwriteDataSourceNames.size(), "Inline expression auto aware data
source names size error");
+
ShardingSpherePreconditions.checkState(inlineAutoAwareDataSourceNames.size() ==
inlineReadwriteDataSourceNames.size(),
+ () -> new
InvalidInlineExpressionDataSourceNameException("Inline expression auto aware
data source names size error"));
for (int i = 0; i < inlineReadwriteDataSourceNames.size(); i++) {
ReadwriteSplittingDataSourceRuleConfiguration dynamicConfig =
createDynamicDataSourceRuleConfiguration(config, i,
inlineReadwriteDataSourceNames, inlineAutoAwareDataSourceNames);
result.put(inlineReadwriteDataSourceNames.get(i), new
ReadwriteSplittingDataSourceRule(dynamicConfig, loadBalanceAlgorithm,
builtRules));
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 37d822cfaf2..b2269956443 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
@@ -26,6 +26,8 @@ import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleCo
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.strategy.DynamicReadwriteSplittingStrategyConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.strategy.StaticReadwriteSplittingStrategyConfiguration;
+import
org.apache.shardingsphere.readwritesplitting.exception.checker.InvalidWeightLoadBalancerConfigurationException;
+import
org.apache.shardingsphere.readwritesplitting.exception.checker.LoadBalancerAlgorithmNotFoundException;
import org.apache.shardingsphere.test.util.PropertiesBuilder;
import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
import org.junit.Test;
@@ -77,7 +79,7 @@ public final class
ReadwriteSplittingRuleConfigurationCheckerTest {
}
@SuppressWarnings({"rawtypes", "unchecked"})
- @Test(expected = NullPointerException.class)
+ @Test(expected = LoadBalancerAlgorithmNotFoundException.class)
public void assertCheckWhenConfigInvalidWriteDataSource() {
ReadwriteSplittingRuleConfiguration config =
mock(ReadwriteSplittingRuleConfiguration.class);
List<ReadwriteSplittingDataSourceRuleConfiguration> configurations =
Arrays.asList(createDataSourceRuleConfig(
@@ -88,7 +90,7 @@ public final class
ReadwriteSplittingRuleConfigurationCheckerTest {
}
@SuppressWarnings({"rawtypes", "unchecked"})
- @Test(expected = NullPointerException.class)
+ @Test(expected = LoadBalancerAlgorithmNotFoundException.class)
public void assertCheckWhenConfigInvalidReadDataSource() {
ReadwriteSplittingRuleConfiguration config =
mock(ReadwriteSplittingRuleConfiguration.class);
List<ReadwriteSplittingDataSourceRuleConfiguration> configurations =
Arrays.asList(createDataSourceRuleConfig(
@@ -99,7 +101,7 @@ public final class
ReadwriteSplittingRuleConfigurationCheckerTest {
}
@SuppressWarnings({"rawtypes", "unchecked"})
- @Test(expected = IllegalStateException.class)
+ @Test(expected = InvalidWeightLoadBalancerConfigurationException.class)
public void assertCheckWeightLoadBalanceInvalidDataSourceName() {
ReadwriteSplittingRuleConfiguration config =
mock(ReadwriteSplittingRuleConfiguration.class);
List<ReadwriteSplittingDataSourceRuleConfiguration> configs =
Collections.singletonList(createDataSourceRuleConfig("write_ds_0",
Arrays.asList("read_ds_0", "read_ds_1")));