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 4dfa96469f6 Refactor ReadwriteSplittingSQLException (#30884)
4dfa96469f6 is described below
commit 4dfa96469f62fae695225b7fc5b85e437da84cb8
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Apr 14 23:48:29 2024 +0800
Refactor ReadwriteSplittingSQLException (#30884)
* Rename MissingRequiredReadwriteSplittingDataSourceRuleNameException
* Remove MissingRequiredReadStorageUnitException
* Refactor MissingRequiredReadwriteSplittingDataSourceRuleNameException
* Refactor DuplicateReadwriteSplittingActualDataSourceException
* Add ReadwriteSplittingRuleExceptionIdentifier
* Refactor ReadwriteSplittingActualDataSourceNameNotFoundException
* Rename ReadwriteSplittingActualDataSourceNotFoundException
* Rename InvalidInlineExpressionDataSourcesException
* Refactor ReadwriteSplittingSQLException
---
.../user-manual/error-code/sql-error-code.cn.md | 16 ++++----
.../user-manual/error-code/sql-error-code.en.md | 16 ++++----
...ReadwriteSplittingRuleConfigurationChecker.java | 38 ++++++++++--------
.../MissingRequiredReadStorageUnitException.java | 32 ---------------
...issingRequiredWriteDataSourceNameException.java | 32 ---------------
...ReadwriteSplittingRuleExceptionIdentifier.java} | 16 +++++---
...adwriteSplittingActualDataSourceException.java} | 13 ++++---
...ActualDataSourceInlineExpressionException.java} | 13 ++++---
...iteSplittingActualDataSourceNameException.java} | 13 ++++---
...plittingActualDataSourceNotFoundException.java} | 13 ++++---
...writeSplittingDataSourceRuleNameException.java} | 14 +++----
.../rule/ReadwriteSplittingRule.java | 21 +++++-----
...writeSplittingRuleConfigurationCheckerTest.java | 12 +++---
.../ReadwriteSplittingRuleStatementChecker.java | 45 +++++++++++++---------
...eadwriteSplittingStorageUnitStatusExecutor.java | 11 ++++--
.../AlterReadwriteSplittingRuleExecutorTest.java | 10 ++---
.../CreateReadwriteSplittingRuleExecutorTest.java | 11 +++---
17 files changed, 146 insertions(+), 180 deletions(-)
diff --git a/docs/document/content/user-manual/error-code/sql-error-code.cn.md
b/docs/document/content/user-manual/error-code/sql-error-code.cn.md
index 7994f3ed0db..bfc7b29cd88 100644
--- a/docs/document/content/user-manual/error-code/sql-error-code.cn.md
+++ b/docs/document/content/user-manual/error-code/sql-error-code.cn.md
@@ -192,15 +192,13 @@ SQL 错误码以标准的 SQL State,Vendor Code 和详细错误信息提供,
### 读写分离
-| Vendor Code | SQL State | 错误信息
|
-|-------------|-----------|-------------------------------------------------------|
-| 20200 | 42S02 | Data source name is required in database '%s'.
|
-| 20201 | 42S02 | Write data source name is required in database
'%s'. |
-| 20202 | 42S02 | Read data source names is required in database
'%s'. |
-| 20203 | 44000 | Duplicated %s data source '%s' in database '%s'.
|
-| 20204 | 42S02 | %s data source name '%s' not in database '%s'.
|
-| 20205 | 44000 | %s data source names size error on inline
expression. |
-| 20210 | 42S02 | Read storage unit '%s' does not exist in rule
'%s'. |
+| Vendor Code | SQL State | 错误信息
|
+|-------------|-----------|-----------------------------------------------------------------------------|
+| 20200 | 42S02 | Readwrite-splitting data source rule name is
required in database '%s'. |
+| 20201 | 42S02 | Readwrite-splitting [READ/WRITE] data source name
is required in %s. |
+| 20202 | 42S02 | Can not find readwrite-splitting [READ/WRITE] data
source '%s' in %s. |
+| 20203 | 42S01 | Readwrite-splitting [READ/WRITE] data source '%s'
is duplicated in %s. |
+| 20204 | 44000 | Readwrite-splitting [READ/WRITE] data source
inline expression error in %s. |
### SQL 方言转换
diff --git a/docs/document/content/user-manual/error-code/sql-error-code.en.md
b/docs/document/content/user-manual/error-code/sql-error-code.en.md
index fd987707192..497cd2ff6d5 100644
--- a/docs/document/content/user-manual/error-code/sql-error-code.en.md
+++ b/docs/document/content/user-manual/error-code/sql-error-code.en.md
@@ -193,15 +193,13 @@ SQL error codes provide by standard `SQL State`, `Vendor
Code` and `Reason`, whi
### Readwrite-splitting
-| Vendor Code | SQL State | Reason
|
-|-------------|-----------|-------------------------------------------------------|
-| 20200 | 42S02 | Data source name is required in database '%s'.
|
-| 20201 | 42S02 | Write data source name is required in database
'%s'. |
-| 20202 | 42S02 | Read data source names is required in database
'%s'. |
-| 20203 | 44000 | Duplicated %s data source '%s' in database '%s'.
|
-| 20204 | 42S02 | %s data source name '%s' not in database '%s'.
|
-| 20205 | 44000 | %s data source names size error on inline
expression. |
-| 20210 | 42S02 | Read storage unit '%s' does not exist in rule
'%s'. |
+| Vendor Code | SQL State | Reason
|
+|-------------|-----------|-----------------------------------------------------------------------------|
+| 20200 | 42S02 | Readwrite-splitting data source rule name is
required in database '%s'. |
+| 20201 | 42S02 | Readwrite-splitting [READ/WRITE] data source name
is required in %s. |
+| 20202 | 42S02 | Can not find readwrite-splitting [READ/WRITE] data
source '%s' in %s. |
+| 20203 | 42S01 | Readwrite-splitting [READ/WRITE] data source '%s'
is duplicated in %s. |
+| 20204 | 44000 | Readwrite-splitting [READ/WRITE] data source
inline expression error in %s. |
### SQL Dialect Translator
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 8a2ce891dca..c1b6913184c 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
@@ -31,11 +31,11 @@ import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleCo
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
import
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingOrder;
-import
org.apache.shardingsphere.readwritesplitting.exception.DataSourceNameNotExistedException;
-import
org.apache.shardingsphere.readwritesplitting.exception.DuplicateDataSourceException;
-import
org.apache.shardingsphere.readwritesplitting.exception.MissingRequiredDataSourceNameException;
-import
org.apache.shardingsphere.readwritesplitting.exception.MissingRequiredReadDataSourceNamesException;
-import
org.apache.shardingsphere.readwritesplitting.exception.MissingRequiredWriteDataSourceNameException;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import
org.apache.shardingsphere.readwritesplitting.exception.actual.ReadwriteSplittingActualDataSourceNotFoundException;
+import
org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
+import
org.apache.shardingsphere.readwritesplitting.exception.actual.MissingRequiredReadwriteSplittingActualDataSourceNameException;
+import
org.apache.shardingsphere.readwritesplitting.exception.logic.MissingRequiredReadwriteSplittingDataSourceRuleNameException;
import javax.sql.DataSource;
import java.util.Collection;
@@ -61,27 +61,30 @@ public final class
ReadwriteSplittingRuleConfigurationChecker implements RuleCon
Collection<String> writeDataSourceNames = new HashSet<>();
Collection<String> readDataSourceNames = new HashSet<>();
for (ReadwriteSplittingDataSourceRuleConfiguration each : configs) {
-
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(each.getName()),
() -> new MissingRequiredDataSourceNameException(databaseName));
+
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(each.getName()),
() -> new
MissingRequiredReadwriteSplittingDataSourceRuleNameException(databaseName));
checkDataSources(databaseName, dataSourceMap, each,
writeDataSourceNames, readDataSourceNames, builtRules);
}
}
private void checkDataSources(final String databaseName, final Map<String,
DataSource> dataSourceMap, final ReadwriteSplittingDataSourceRuleConfiguration
config,
final Collection<String>
writeDataSourceNames, final Collection<String> readDataSourceNames, final
Collection<ShardingSphereRule> builtRules) {
-
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(config.getWriteDataSourceName()),
() -> new MissingRequiredWriteDataSourceNameException(databaseName));
-
ShardingSpherePreconditions.checkState(!config.getReadDataSourceNames().isEmpty(),
() -> new MissingRequiredReadDataSourceNamesException(databaseName));
+
ShardingSpherePreconditions.checkState(!Strings.isNullOrEmpty(config.getWriteDataSourceName()),
() -> new MissingRequiredReadwriteSplittingActualDataSourceNameException(
+ ReadwriteSplittingDataSourceType.WRITE, new
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
+
ShardingSpherePreconditions.checkState(!config.getReadDataSourceNames().isEmpty(),
() -> new MissingRequiredReadwriteSplittingActualDataSourceNameException(
+ ReadwriteSplittingDataSourceType.READ, new
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
checkWriteDataSourceNames(databaseName, dataSourceMap,
writeDataSourceNames, config, builtRules);
for (String each : config.getReadDataSourceNames()) {
- checkReadeDataSourceNames(databaseName, dataSourceMap,
readDataSourceNames, each, builtRules);
+ checkReadeDataSourceNames(databaseName, dataSourceMap,
readDataSourceNames, each, config, builtRules);
}
}
private void checkWriteDataSourceNames(final String databaseName, final
Map<String, DataSource> dataSourceMap, final Collection<String>
writeDataSourceNames,
final
ReadwriteSplittingDataSourceRuleConfiguration config, final
Collection<ShardingSphereRule> builtRules) {
for (String each :
InlineExpressionParserFactory.newInstance(config.getWriteDataSourceName()).splitAndEvaluate())
{
-
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each) ||
containsInOtherRules(each, builtRules),
- () -> new
DataSourceNameNotExistedException(ReadwriteSplittingDataSourceType.WRITE, each,
databaseName));
-
ShardingSpherePreconditions.checkState(writeDataSourceNames.add(each), () ->
new DuplicateDataSourceException(ReadwriteSplittingDataSourceType.WRITE, each,
databaseName));
+
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each) ||
containsInOtherRules(each, builtRules), () -> new
ReadwriteSplittingActualDataSourceNotFoundException(
+ ReadwriteSplittingDataSourceType.WRITE, each, new
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
+
ShardingSpherePreconditions.checkState(writeDataSourceNames.add(each), () ->
new DuplicateReadwriteSplittingActualDataSourceException(
+ ReadwriteSplittingDataSourceType.WRITE, each, new
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
}
}
@@ -90,12 +93,13 @@ public final class
ReadwriteSplittingRuleConfigurationChecker implements RuleCon
.anyMatch(optional -> optional.isPresent() &&
optional.get().getDataSourceMapper().containsKey(datasourceName));
}
- private void checkReadeDataSourceNames(final String databaseName, final
Map<String, DataSource> dataSourceMap,
- final Collection<String>
readDataSourceNames, final String readDataSourceName, final
Collection<ShardingSphereRule> builtRules) {
+ private void checkReadeDataSourceNames(final String databaseName, final
Map<String, DataSource> dataSourceMap, final Collection<String>
readDataSourceNames,
+ final String readDataSourceName,
final ReadwriteSplittingDataSourceRuleConfiguration config, final
Collection<ShardingSphereRule> builtRules) {
for (String each :
InlineExpressionParserFactory.newInstance(readDataSourceName).splitAndEvaluate())
{
-
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each) ||
containsInOtherRules(each, builtRules),
- () -> new
DataSourceNameNotExistedException(ReadwriteSplittingDataSourceType.READ, each,
databaseName));
-
ShardingSpherePreconditions.checkState(readDataSourceNames.add(each), () -> new
DuplicateDataSourceException(ReadwriteSplittingDataSourceType.READ, each,
databaseName));
+
ShardingSpherePreconditions.checkState(dataSourceMap.containsKey(each) ||
containsInOtherRules(each, builtRules), () -> new
ReadwriteSplittingActualDataSourceNotFoundException(
+ ReadwriteSplittingDataSourceType.READ, each, new
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
+
ShardingSpherePreconditions.checkState(readDataSourceNames.add(each), () -> new
DuplicateReadwriteSplittingActualDataSourceException(
+ ReadwriteSplittingDataSourceType.READ, each, new
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
}
}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadStorageUnitException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadStorageUnitException.java
deleted file mode 100644
index 2b52f1075fe..00000000000
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadStorageUnitException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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;
-
-import
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
-
-/**
- * Missing required read storage unit exception.
- */
-public final class MissingRequiredReadStorageUnitException extends
ReadwriteSplittingSQLException {
-
- private static final long serialVersionUID = -4252553422332603648L;
-
- public MissingRequiredReadStorageUnitException(final String ruleName,
final String storageUnitName) {
- super(XOpenSQLState.NOT_FOUND, 10, "Read storage unit '%s' does not
exist in rule '%s'.", storageUnitName, ruleName);
- }
-}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredWriteDataSourceNameException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredWriteDataSourceNameException.java
deleted file mode 100644
index 754cb725970..00000000000
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredWriteDataSourceNameException.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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;
-
-import
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
-
-/**
- * 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.NOT_FOUND, 1, "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/MissingRequiredDataSourceNameException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/ReadwriteSplittingRuleExceptionIdentifier.java
similarity index 64%
rename from
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredDataSourceNameException.java
rename to
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/ReadwriteSplittingRuleExceptionIdentifier.java
index 160657f491f..1dfca7c46e8 100644
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredDataSourceNameException.java
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/ReadwriteSplittingRuleExceptionIdentifier.java
@@ -17,16 +17,20 @@
package org.apache.shardingsphere.readwritesplitting.exception;
-import
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
+import lombok.RequiredArgsConstructor;
/**
- * Missing required data source name exception.
+ * Readwrite-splitting rule exception identifier.
*/
-public final class MissingRequiredDataSourceNameException extends
ReadwriteSplittingSQLException {
+@RequiredArgsConstructor
+public final class ReadwriteSplittingRuleExceptionIdentifier {
- private static final long serialVersionUID = 8006957930250488016L;
+ private final String database;
- public MissingRequiredDataSourceNameException(final String databaseName) {
- super(XOpenSQLState.NOT_FOUND, 0, "Data source name is required in
database '%s'.", databaseName);
+ private final String dataSourceRule;
+
+ @Override
+ public String toString() {
+ return String.format("database.data_source_rule: '%s'.'%s'", database,
dataSourceRule);
}
}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/DuplicateReadwriteSplittingActualDataSourceException.java
similarity index 55%
copy from
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
copy to
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/DuplicateReadwriteSplittingActualDataSourceException.java
index 252eb4c3593..dc9fafd6e53 100644
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/DuplicateReadwriteSplittingActualDataSourceException.java
@@ -15,19 +15,22 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.readwritesplitting.exception;
+package org.apache.shardingsphere.readwritesplitting.exception.actual;
import
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
import
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
/**
- * Duplicate write data source exception.
+ * Duplicate readwrite-splitting actual data source exception.
*/
-public final class DuplicateDataSourceException extends
ReadwriteSplittingSQLException {
+public final class DuplicateReadwriteSplittingActualDataSourceException
extends ReadwriteSplittingSQLException {
private static final long serialVersionUID = -58671655670347084L;
- public DuplicateDataSourceException(final ReadwriteSplittingDataSourceType
dataSourceType, final String dataSourceName, final String databaseName) {
- super(XOpenSQLState.DUPLICATE, 3, "Duplicated %s data source '%s' in
database '%s'.", dataSourceType, dataSourceName, databaseName);
+ public DuplicateReadwriteSplittingActualDataSourceException(final
ReadwriteSplittingDataSourceType dataSourceType,
+ final String
dataSourceName, final ReadwriteSplittingRuleExceptionIdentifier
exceptionIdentifier) {
+ super(XOpenSQLState.DUPLICATE, 3, "Readwrite-splitting %s data source
'%s' is duplicated in %s.", dataSourceName, dataSourceType,
exceptionIdentifier);
}
}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/InvalidInlineExpressionDataSourcesException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/InvalidReadwriteSplittingActualDataSourceInlineExpressionException.java
similarity index 54%
rename from
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/InvalidInlineExpressionDataSourcesException.java
rename to
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/InvalidReadwriteSplittingActualDataSourceInlineExpressionException.java
index cf97c84faf6..a1b562e078a 100644
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/InvalidInlineExpressionDataSourcesException.java
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/InvalidReadwriteSplittingActualDataSourceInlineExpressionException.java
@@ -15,19 +15,22 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.readwritesplitting.exception;
+package org.apache.shardingsphere.readwritesplitting.exception.actual;
import
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
import
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
/**
- * Invalid inline expression data sources exception.
+ * Invalid readwrite-splitting actual data source inline expression exception.
*/
-public final class InvalidInlineExpressionDataSourcesException extends
ReadwriteSplittingSQLException {
+public final class
InvalidReadwriteSplittingActualDataSourceInlineExpressionException extends
ReadwriteSplittingSQLException {
private static final long serialVersionUID = 87659916563551964L;
- public InvalidInlineExpressionDataSourcesException(final
ReadwriteSplittingDataSourceType dataSourceType) {
- super(XOpenSQLState.CHECK_OPTION_VIOLATION, 5, "%s data source names
size error on inline expression.", dataSourceType);
+ public
InvalidReadwriteSplittingActualDataSourceInlineExpressionException(final
ReadwriteSplittingDataSourceType dataSourceType,
+
final ReadwriteSplittingRuleExceptionIdentifier exceptionIdentifier) {
+ super(XOpenSQLState.CHECK_OPTION_VIOLATION, 4, "Readwrite-splitting %s
data source inline expression error in %s.", dataSourceType,
exceptionIdentifier);
}
}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadDataSourceNamesException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/MissingRequiredReadwriteSplittingActualDataSourceNameException.java
similarity index 52%
rename from
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadDataSourceNamesException.java
rename to
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/MissingRequiredReadwriteSplittingActualDataSourceNameException.java
index c1319048bb3..ae3372d6975 100644
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/MissingRequiredReadDataSourceNamesException.java
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/MissingRequiredReadwriteSplittingActualDataSourceNameException.java
@@ -15,18 +15,21 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.readwritesplitting.exception;
+package org.apache.shardingsphere.readwritesplitting.exception.actual;
import
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
+import
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
/**
- * Missing required read data source names exception.
+ * Missing readwrite-splitting required actual data source name exception.
*/
-public final class MissingRequiredReadDataSourceNamesException extends
ReadwriteSplittingSQLException {
+public final class
MissingRequiredReadwriteSplittingActualDataSourceNameException extends
ReadwriteSplittingSQLException {
private static final long serialVersionUID = 3795576963060485964L;
- public MissingRequiredReadDataSourceNamesException(final String
databaseName) {
- super(XOpenSQLState.NOT_FOUND, 2, "Read data source names is required
in database '%s'.", databaseName);
+ public
MissingRequiredReadwriteSplittingActualDataSourceNameException(final
ReadwriteSplittingDataSourceType dataSourceType, final
ReadwriteSplittingRuleExceptionIdentifier exceptionIdentifier) {
+ super(XOpenSQLState.NOT_FOUND, 1, "Readwrite-splitting %s data source
name is required in %s.", dataSourceType, exceptionIdentifier);
}
}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DataSourceNameNotExistedException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/ReadwriteSplittingActualDataSourceNotFoundException.java
similarity index 55%
rename from
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DataSourceNameNotExistedException.java
rename to
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/ReadwriteSplittingActualDataSourceNotFoundException.java
index 9f90523d99e..f1a85d60305 100644
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DataSourceNameNotExistedException.java
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/actual/ReadwriteSplittingActualDataSourceNotFoundException.java
@@ -15,19 +15,22 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.readwritesplitting.exception;
+package org.apache.shardingsphere.readwritesplitting.exception.actual;
import
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
import
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
/**
- * Data source name not existed exception.
+ * Readwrite-splitting actual data source not found exception.
*/
-public final class DataSourceNameNotExistedException extends
ReadwriteSplittingSQLException {
+public final class ReadwriteSplittingActualDataSourceNotFoundException extends
ReadwriteSplittingSQLException {
private static final long serialVersionUID = 1284608200400804784L;
- public DataSourceNameNotExistedException(final
ReadwriteSplittingDataSourceType dataSourceType, final String dataSourceName,
final String databaseName) {
- super(XOpenSQLState.NOT_FOUND, 4, "%s data source name '%s' not in
database '%s'.", dataSourceType, dataSourceName, databaseName);
+ public ReadwriteSplittingActualDataSourceNotFoundException(final
ReadwriteSplittingDataSourceType dataSourceType,
+ final String
dataSourceName, final ReadwriteSplittingRuleExceptionIdentifier
exceptionIdentifier) {
+ super(XOpenSQLState.NOT_FOUND, 2, "Can not find readwrite-splitting %s
data source '%s' in %s.", dataSourceType, dataSourceName, exceptionIdentifier);
}
}
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/logic/MissingRequiredReadwriteSplittingDataSourceRuleNameException.java
similarity index 58%
rename from
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
rename to
features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/logic/MissingRequiredReadwriteSplittingDataSourceRuleNameException.java
index 252eb4c3593..bb73a0aac07 100644
---
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/DuplicateDataSourceException.java
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/exception/logic/MissingRequiredReadwriteSplittingDataSourceRuleNameException.java
@@ -15,19 +15,19 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.readwritesplitting.exception;
+package org.apache.shardingsphere.readwritesplitting.exception.logic;
import
org.apache.shardingsphere.infra.exception.core.external.sql.sqlstate.XOpenSQLState;
-import
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingSQLException;
/**
- * Duplicate write data source exception.
+ * Missing required readwrite-splitting data source rule name exception.
*/
-public final class DuplicateDataSourceException extends
ReadwriteSplittingSQLException {
+public final class
MissingRequiredReadwriteSplittingDataSourceRuleNameException extends
ReadwriteSplittingSQLException {
- private static final long serialVersionUID = -58671655670347084L;
+ private static final long serialVersionUID = 8006957930250488016L;
- public DuplicateDataSourceException(final ReadwriteSplittingDataSourceType
dataSourceType, final String dataSourceName, final String databaseName) {
- super(XOpenSQLState.DUPLICATE, 3, "Duplicated %s data source '%s' in
database '%s'.", dataSourceType, dataSourceName, databaseName);
+ public MissingRequiredReadwriteSplittingDataSourceRuleNameException(final
String databaseName) {
+ super(XOpenSQLState.NOT_FOUND, 0, "Readwrite-splitting data source
rule name is required in database '%s'.", databaseName);
}
}
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 e88c0f19a9d..39071060474 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
@@ -29,7 +29,8 @@ 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
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
-import
org.apache.shardingsphere.readwritesplitting.exception.InvalidInlineExpressionDataSourcesException;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import
org.apache.shardingsphere.readwritesplitting.exception.actual.InvalidReadwriteSplittingActualDataSourceInlineExpressionException;
import
org.apache.shardingsphere.readwritesplitting.rule.attribute.ReadwriteSplittingDataSourceMapperRuleAttribute;
import
org.apache.shardingsphere.readwritesplitting.rule.attribute.ReadwriteSplittingExportableRuleAttribute;
import
org.apache.shardingsphere.readwritesplitting.rule.attribute.ReadwriteSplittingStaticDataSourceRuleAttribute;
@@ -61,7 +62,7 @@ public final class ReadwriteSplittingRule implements
DatabaseRule {
public ReadwriteSplittingRule(final String databaseName, final
ReadwriteSplittingRuleConfiguration ruleConfig, final InstanceContext
instanceContext) {
configuration = ruleConfig;
loadBalancers = createLoadBalancers(ruleConfig);
- dataSourceRules = createDataSourceRules(ruleConfig);
+ dataSourceRules = createDataSourceRules(databaseName, ruleConfig);
attributes = new RuleAttributes(
new
ReadwriteSplittingDataSourceMapperRuleAttribute(dataSourceRules.values()), new
ReadwriteSplittingStaticDataSourceRuleAttribute(databaseName, dataSourceRules,
instanceContext),
new
ReadwriteSplittingExportableRuleAttribute(dataSourceRules), new
ReadwriteSplittingStorageConnectorReusableRuleAttribute());
@@ -78,30 +79,32 @@ public final class ReadwriteSplittingRule implements
DatabaseRule {
return result;
}
- private Map<String, ReadwriteSplittingDataSourceRule>
createDataSourceRules(final ReadwriteSplittingRuleConfiguration ruleConfig) {
+ private Map<String, ReadwriteSplittingDataSourceRule>
createDataSourceRules(final String databaseName, final
ReadwriteSplittingRuleConfiguration ruleConfig) {
Map<String, ReadwriteSplittingDataSourceRule> result = new
HashMap<>(ruleConfig.getDataSources().size(), 1F);
for (ReadwriteSplittingDataSourceRuleConfiguration each :
ruleConfig.getDataSources()) {
- result.putAll(createDataSourceRules(each));
+ result.putAll(createDataSourceRules(databaseName, each));
}
return result;
}
- private Map<String, ReadwriteSplittingDataSourceRule>
createDataSourceRules(final ReadwriteSplittingDataSourceRuleConfiguration
config) {
+ private Map<String, ReadwriteSplittingDataSourceRule>
createDataSourceRules(final String databaseName, final
ReadwriteSplittingDataSourceRuleConfiguration config) {
LoadBalanceAlgorithm loadBalanceAlgorithm = loadBalancers.getOrDefault(
config.getName() + "." + config.getLoadBalancerName(),
TypedSPILoader.getService(LoadBalanceAlgorithm.class, null));
- return createStaticDataSourceRules(config, loadBalanceAlgorithm);
+ return createStaticDataSourceRules(databaseName, config,
loadBalanceAlgorithm);
}
- private Map<String, ReadwriteSplittingDataSourceRule>
createStaticDataSourceRules(final ReadwriteSplittingDataSourceRuleConfiguration
config,
+ private Map<String, ReadwriteSplittingDataSourceRule>
createStaticDataSourceRules(final String databaseName, final
ReadwriteSplittingDataSourceRuleConfiguration config,
final LoadBalanceAlgorithm loadBalanceAlgorithm) {
List<String> inlineReadwriteDataSourceNames =
InlineExpressionParserFactory.newInstance(config.getName()).splitAndEvaluate();
List<String> inlineWriteDatasourceNames =
InlineExpressionParserFactory.newInstance(config.getWriteDataSourceName()).splitAndEvaluate();
List<List<String>> inlineReadDatasourceNames =
config.getReadDataSourceNames().stream()
.map(each ->
InlineExpressionParserFactory.newInstance(each).splitAndEvaluate()).collect(Collectors.toList());
ShardingSpherePreconditions.checkState(inlineWriteDatasourceNames.size() ==
inlineReadwriteDataSourceNames.size(),
- () -> new
InvalidInlineExpressionDataSourcesException(ReadwriteSplittingDataSourceType.WRITE));
+ () -> new
InvalidReadwriteSplittingActualDataSourceInlineExpressionException(
+ ReadwriteSplittingDataSourceType.WRITE, new
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName())));
inlineReadDatasourceNames.forEach(each ->
ShardingSpherePreconditions.checkState(each.size() ==
inlineReadwriteDataSourceNames.size(),
- () -> new
InvalidInlineExpressionDataSourcesException(ReadwriteSplittingDataSourceType.READ)));
+ () -> new
InvalidReadwriteSplittingActualDataSourceInlineExpressionException(
+ ReadwriteSplittingDataSourceType.READ, new
ReadwriteSplittingRuleExceptionIdentifier(databaseName, config.getName()))));
Map<String, ReadwriteSplittingDataSourceRule> result = new
LinkedHashMap<>(inlineReadwriteDataSourceNames.size(), 1F);
for (int i = 0; i < inlineReadwriteDataSourceNames.size(); i++) {
ReadwriteSplittingDataSourceRuleConfiguration staticConfig =
createStaticDataSourceRuleConfiguration(
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 70492bd2dad..5e24dd98699 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,9 +26,9 @@ import
org.apache.shardingsphere.infra.rule.attribute.datasource.DataSourceMappe
import org.apache.shardingsphere.infra.spi.type.ordered.OrderedSPILoader;
import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
-import
org.apache.shardingsphere.readwritesplitting.exception.DataSourceNameNotExistedException;
-import
org.apache.shardingsphere.readwritesplitting.exception.DuplicateDataSourceException;
-import
org.apache.shardingsphere.readwritesplitting.exception.MissingRequiredWriteDataSourceNameException;
+import
org.apache.shardingsphere.readwritesplitting.exception.actual.ReadwriteSplittingActualDataSourceNotFoundException;
+import
org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
+import
org.apache.shardingsphere.readwritesplitting.exception.actual.MissingRequiredReadwriteSplittingActualDataSourceNameException;
import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
import org.apache.shardingsphere.test.util.PropertiesBuilder;
import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
@@ -54,7 +54,7 @@ class ReadwriteSplittingRuleConfigurationCheckerTest {
void assertInvalidCheck() {
ReadwriteSplittingRuleConfiguration config =
createInvalidConfiguration();
RuleConfigurationChecker checker =
OrderedSPILoader.getServicesByClass(RuleConfigurationChecker.class,
Collections.singleton(config.getClass())).get(config.getClass());
- assertThrows(MissingRequiredWriteDataSourceNameException.class, () ->
checker.check("test", config, Collections.emptyMap(), Collections.emptyList()));
+
assertThrows(MissingRequiredReadwriteSplittingActualDataSourceNameException.class,
() -> checker.check("test", config, Collections.emptyMap(),
Collections.emptyList()));
}
private ReadwriteSplittingRuleConfiguration createInvalidConfiguration() {
@@ -73,7 +73,7 @@ class ReadwriteSplittingRuleConfigurationCheckerTest {
"write_ds_0", Arrays.asList("read_ds_0", "read_ds_1")),
createDataSourceRuleConfiguration("write_ds_2", Arrays.asList("read_ds_0",
"read_ds_1")));
when(config.getDataSources()).thenReturn(configs);
RuleConfigurationChecker checker =
OrderedSPILoader.getServicesByClass(RuleConfigurationChecker.class,
Collections.singleton(config.getClass())).get(config.getClass());
- assertThrows(DataSourceNameNotExistedException.class, () ->
checker.check("test", config, mockDataSources(), Collections.emptyList()));
+
assertThrows(ReadwriteSplittingActualDataSourceNotFoundException.class, () ->
checker.check("test", config, mockDataSources(), Collections.emptyList()));
}
@SuppressWarnings({"rawtypes", "unchecked"})
@@ -84,7 +84,7 @@ class ReadwriteSplittingRuleConfigurationCheckerTest {
"write_ds_0", Arrays.asList("read_ds_0", "read_ds_0")),
createDataSourceRuleConfiguration("write_ds_1", Arrays.asList("read_ds_0",
"read_ds_0")));
when(config.getDataSources()).thenReturn(configs);
RuleConfigurationChecker checker =
OrderedSPILoader.getServicesByClass(RuleConfigurationChecker.class,
Collections.singleton(config.getClass())).get(config.getClass());
- assertThrows(DuplicateDataSourceException.class, () ->
checker.check("test", config, mockDataSources(), Collections.emptyList()));
+
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class, () ->
checker.check("test", config, mockDataSources(), Collections.emptyList()));
}
@SuppressWarnings({"rawtypes", "unchecked"})
diff --git
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
index 190ed3f9321..de1a4550a0a 100644
---
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
+++
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/checker/ReadwriteSplittingRuleStatementChecker.java
@@ -36,7 +36,8 @@ import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingD
import
org.apache.shardingsphere.readwritesplitting.api.transaction.TransactionalReadQueryStrategy;
import
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
import
org.apache.shardingsphere.readwritesplitting.distsql.segment.ReadwriteSplittingRuleSegment;
-import
org.apache.shardingsphere.readwritesplitting.exception.DuplicateDataSourceException;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import
org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
import java.util.Arrays;
import java.util.Collection;
@@ -161,42 +162,48 @@ public final class ReadwriteSplittingRuleStatementChecker
{
Collection<String> existedReadDataSourceNames = new HashSet<>();
if (null != currentRuleConfig) {
Collection<String> toBeAlteredRuleNames = isCreating ?
Collections.emptySet() : getToBeAlteredRuleNames(segments);
- currentRuleConfig.getDataSources().forEach(each -> {
- if (!toBeAlteredRuleNames.contains(each.getName())) {
-
existedWriteDataSourceNames.add(each.getWriteDataSourceName());
-
existedReadDataSourceNames.addAll(each.getReadDataSourceNames());
+ for (ReadwriteSplittingDataSourceRuleConfiguration each :
currentRuleConfig.getDataSources()) {
+ if (toBeAlteredRuleNames.contains(each.getName())) {
+ continue;
}
- });
+ existedWriteDataSourceNames.add(each.getWriteDataSourceName());
+
existedReadDataSourceNames.addAll(each.getReadDataSourceNames());
+ }
}
- checkDuplicateWriteDataSourceNames(databaseName, segments,
existedWriteDataSourceNames);
- checkDuplicateReadDataSourceNames(databaseName, segments,
existedReadDataSourceNames);
+ checkDuplicateWriteDataSourceNames(segments, databaseName,
existedWriteDataSourceNames);
+ checkDuplicateReadDataSourceNames(segments, databaseName,
existedReadDataSourceNames);
}
private static Collection<String> getToBeAlteredRuleNames(final
Collection<ReadwriteSplittingRuleSegment> segments) {
return
segments.stream().map(ReadwriteSplittingRuleSegment::getName).collect(Collectors.toSet());
}
- private static void checkDuplicateWriteDataSourceNames(final String
databaseName, final Collection<ReadwriteSplittingRuleSegment> segments, final
Collection<String> writeDataSourceNames) {
- segments.forEach(each -> {
- if (!Strings.isNullOrEmpty(each.getWriteDataSource())) {
- String writeDataSource = each.getWriteDataSource();
-
ShardingSpherePreconditions.checkState(writeDataSourceNames.add(writeDataSource),
- () -> new
DuplicateDataSourceException(ReadwriteSplittingDataSourceType.WRITE,
writeDataSource, databaseName));
+ private static void checkDuplicateWriteDataSourceNames(final
Collection<ReadwriteSplittingRuleSegment> segments, final String databaseName,
+ final
Collection<String> writeDataSourceNames) {
+ for (ReadwriteSplittingRuleSegment each : segments) {
+ if (Strings.isNullOrEmpty(each.getWriteDataSource())) {
+ continue;
}
- });
+ String writeDataSource = each.getWriteDataSource();
+
ShardingSpherePreconditions.checkState(writeDataSourceNames.add(writeDataSource),
() -> new DuplicateReadwriteSplittingActualDataSourceException(
+ ReadwriteSplittingDataSourceType.WRITE, writeDataSource,
new ReadwriteSplittingRuleExceptionIdentifier(databaseName, "")));
+ }
}
- private static void checkDuplicateReadDataSourceNames(final String
databaseName, final Collection<ReadwriteSplittingRuleSegment> segments, final
Collection<String> readDataSourceNames) {
+ private static void checkDuplicateReadDataSourceNames(final
Collection<ReadwriteSplittingRuleSegment> segments, final String databaseName,
+ final
Collection<String> readDataSourceNames) {
for (ReadwriteSplittingRuleSegment each : segments) {
if (null != each.getReadDataSources()) {
- checkDuplicateReadDataSourceNames(databaseName, each,
readDataSourceNames);
+ checkDuplicateReadDataSourceNames(each, databaseName,
readDataSourceNames);
}
}
}
- private static void checkDuplicateReadDataSourceNames(final String
databaseName, final ReadwriteSplittingRuleSegment segment, final
Collection<String> readDataSourceNames) {
+ private static void checkDuplicateReadDataSourceNames(final
ReadwriteSplittingRuleSegment segment, final String databaseName,
+ final
Collection<String> readDataSourceNames) {
for (String each : segment.getReadDataSources()) {
-
ShardingSpherePreconditions.checkState(readDataSourceNames.add(each), () -> new
DuplicateDataSourceException(ReadwriteSplittingDataSourceType.READ, each,
databaseName));
+
ShardingSpherePreconditions.checkState(readDataSourceNames.add(each), () -> new
DuplicateReadwriteSplittingActualDataSourceException(
+ ReadwriteSplittingDataSourceType.READ, each, new
ReadwriteSplittingRuleExceptionIdentifier(databaseName, "")));
}
}
diff --git
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingStorageUnitStatusExecutor.java
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingStorageUnitStatusExecutor.java
index 5d05e5ac455..90e26186b7c 100644
---
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingStorageUnitStatusExecutor.java
+++
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingStorageUnitStatusExecutor.java
@@ -21,16 +21,18 @@ import lombok.Setter;
import
org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorDatabaseAware;
import
org.apache.shardingsphere.distsql.handler.aware.DistSQLExecutorRuleAware;
import
org.apache.shardingsphere.distsql.handler.engine.update.DistSQLUpdateExecutor;
-import
org.apache.shardingsphere.infra.exception.kernel.metadata.rule.MissingRequiredRuleException;
import
org.apache.shardingsphere.distsql.handler.required.DistSQLExecutorClusterModeRequired;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.InvalidStorageUnitStatusException;
+import
org.apache.shardingsphere.infra.exception.kernel.metadata.rule.MissingRequiredRuleException;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.state.datasource.DataSourceState;
import org.apache.shardingsphere.mode.manager.ContextManager;
import org.apache.shardingsphere.mode.storage.service.StorageNodeStatusService;
-import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.InvalidStorageUnitStatusException;
-import
org.apache.shardingsphere.readwritesplitting.exception.MissingRequiredReadStorageUnitException;
+import
org.apache.shardingsphere.readwritesplitting.constant.ReadwriteSplittingDataSourceType;
import
org.apache.shardingsphere.readwritesplitting.distsql.statement.AlterReadwriteSplittingStorageUnitStatusStatement;
+import
org.apache.shardingsphere.readwritesplitting.exception.ReadwriteSplittingRuleExceptionIdentifier;
+import
org.apache.shardingsphere.readwritesplitting.exception.actual.ReadwriteSplittingActualDataSourceNotFoundException;
import
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingDataSourceRule;
import
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
@@ -61,7 +63,8 @@ public final class
AlterReadwriteSplittingStorageUnitStatusExecutor
Optional<ReadwriteSplittingDataSourceRule> dataSourceRule =
rule.getDataSourceRules().values().stream().filter(each ->
each.getName().equalsIgnoreCase(sqlStatement.getRuleName())).findAny();
ShardingSpherePreconditions.checkState(dataSourceRule.isPresent(), ()
-> new MissingRequiredRuleException("Readwrite-splitting", database.getName(),
sqlStatement.getRuleName()));
ShardingSpherePreconditions.checkState(dataSourceRule.get().getReadwriteSplittingGroup().getReadDataSources().contains(sqlStatement.getStorageUnitName()),
- () -> new
MissingRequiredReadStorageUnitException(dataSourceRule.get().getName(),
sqlStatement.getStorageUnitName()));
+ () -> new ReadwriteSplittingActualDataSourceNotFoundException(
+ ReadwriteSplittingDataSourceType.READ,
sqlStatement.getStorageUnitName(), new
ReadwriteSplittingRuleExceptionIdentifier(database.getName(),
dataSourceRule.get().getName())));
if (sqlStatement.isEnable()) {
ShardingSpherePreconditions.checkState(dataSourceRule.get().getDisabledDataSourceNames().contains(sqlStatement.getStorageUnitName()),
() -> new InvalidStorageUnitStatusException("storage unit
is not disabled"));
diff --git
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleExecutorTest.java
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleExecutorTest.java
index 29bf42bdaa8..75050a1ccb2 100644
---
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleExecutorTest.java
+++
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/AlterReadwriteSplittingRuleExecutorTest.java
@@ -27,7 +27,7 @@ import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleCo
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.distsql.segment.ReadwriteSplittingRuleSegment;
import
org.apache.shardingsphere.readwritesplitting.distsql.statement.AlterReadwriteSplittingRuleStatement;
-import
org.apache.shardingsphere.readwritesplitting.exception.DuplicateDataSourceException;
+import
org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
import
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
@@ -99,7 +99,7 @@ class AlterReadwriteSplittingRuleExecutorTest {
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
executor.setRule(rule);
- assertThrows(DuplicateDataSourceException.class,
+
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
() ->
executor.checkBeforeUpdate(createSQLStatementWithDuplicateWriteResourceNames("readwrite_ds_0",
"readwrite_ds_1", "TEST")));
}
@@ -110,7 +110,7 @@ class AlterReadwriteSplittingRuleExecutorTest {
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
executor.setRule(rule);
- assertThrows(DuplicateDataSourceException.class,
+
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
() -> executor.checkBeforeUpdate(
createSQLStatement("readwrite_ds_0", "ds_write_1",
Arrays.asList("read_ds_0", "read_ds_1"), "TEST")));
}
@@ -122,7 +122,7 @@ class AlterReadwriteSplittingRuleExecutorTest {
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
executor.setRule(rule);
- assertThrows(DuplicateDataSourceException.class,
+
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
() ->
executor.checkBeforeUpdate(createSQLStatementWithDuplicateReadResourceNames("readwrite_ds_0",
"readwrite_ds_1", "TEST")));
}
@@ -133,7 +133,7 @@ class AlterReadwriteSplittingRuleExecutorTest {
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfigurationWithMultipleRules());
executor.setRule(rule);
- assertThrows(DuplicateDataSourceException.class,
+
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
() ->
executor.checkBeforeUpdate(createSQLStatement("readwrite_ds_1", "write_ds_1",
Arrays.asList("read_ds_0_0", "read_ds_0_1"), "TEST")));
}
diff --git
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleExecutorTest.java
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleExecutorTest.java
index b3a4bb7b800..fad29f3bc2a 100644
---
a/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleExecutorTest.java
+++
b/features/readwrite-splitting/distsql/handler/src/test/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/CreateReadwriteSplittingRuleExecutorTest.java
@@ -29,7 +29,7 @@ import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleCo
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.distsql.segment.ReadwriteSplittingRuleSegment;
import
org.apache.shardingsphere.readwritesplitting.distsql.statement.CreateReadwriteSplittingRuleStatement;
-import
org.apache.shardingsphere.readwritesplitting.exception.DuplicateDataSourceException;
+import
org.apache.shardingsphere.readwritesplitting.exception.actual.DuplicateReadwriteSplittingActualDataSourceException;
import
org.apache.shardingsphere.readwritesplitting.rule.ReadwriteSplittingRule;
import org.apache.shardingsphere.test.mock.AutoMockExtension;
import org.apache.shardingsphere.test.mock.StaticMockSettings;
@@ -108,7 +108,7 @@ class CreateReadwriteSplittingRuleExecutorTest {
@Test
void assertCheckSQLStatementWithDuplicateWriteResourceNamesInStatement() {
- assertThrows(DuplicateDataSourceException.class,
+
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
() ->
executor.checkBeforeUpdate(createSQLStatementWithDuplicateWriteResourceNames("write_ds_0",
"write_ds_1", "TEST")));
}
@@ -117,13 +117,14 @@ class CreateReadwriteSplittingRuleExecutorTest {
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfiguration());
executor.setRule(rule);
- assertThrows(DuplicateDataSourceException.class,
+
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
() ->
executor.checkBeforeUpdate(createSQLStatement("readwrite_ds_1", "ds_write",
Arrays.asList("read_ds_0", "read_ds_1"), "TEST")));
}
@Test
void assertCheckSQLStatementWithDuplicateReadResourceNamesInStatement() {
- assertThrows(DuplicateDataSourceException.class, () ->
executor.checkBeforeUpdate(createSQLStatementWithDuplicateReadResourceNames("write_ds_0",
"write_ds_1", "TEST")));
+
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
+ () ->
executor.checkBeforeUpdate(createSQLStatementWithDuplicateReadResourceNames("write_ds_0",
"write_ds_1", "TEST")));
}
@Test
@@ -131,7 +132,7 @@ class CreateReadwriteSplittingRuleExecutorTest {
ReadwriteSplittingRule rule = mock(ReadwriteSplittingRule.class);
when(rule.getConfiguration()).thenReturn(createCurrentRuleConfiguration());
executor.setRule(rule);
- assertThrows(DuplicateDataSourceException.class,
+
assertThrows(DuplicateReadwriteSplittingActualDataSourceException.class,
() ->
executor.checkBeforeUpdate(createSQLStatement("readwrite_ds_1", "write_ds_1",
Arrays.asList("read_ds_0", "read_ds_1"), "TEST")));
}