This is an automated email from the ASF dual-hosted git repository.
totalo 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 e2986888ee8 Add HighlyAvailableStatus (#17022)
e2986888ee8 is described below
commit e2986888ee8fef8f2e935ed5fd351322d96bee64
Author: Liang Zhang <[email protected]>
AuthorDate: Sat Apr 23 01:37:35 2022 +0800
Add HighlyAvailableStatus (#17022)
* Refactor DatabaseDiscoveryType
* Add HighlyAvailableStatus
* Add HighlyAvailableStatus
* Fix checkstyle
* Fix test case
---
.../dbdiscovery/spi/DatabaseDiscoveryType.java | 10 +--
.../dbdiscovery/spi/HighlyAvailableStatus.java | 39 +++++++++
.../algorithm/DatabaseDiscoveryEngine.java | 16 +++-
.../dbdiscovery/rule/DatabaseDiscoveryRule.java | 2 +-
.../fixture/CoreFixtureDatabaseDiscoveryType.java | 6 +-
.../DistSQLFixtureDatabaseDiscoveryType.java | 6 +-
.../mysql/AbstractDatabaseDiscoveryType.java | 2 +-
.../mysql/type/MGRDatabaseDiscoveryType.java | 94 ++++++----------------
.../mysql/type/MGRHighlyAvailableStatus.java | 73 +++++++++++++++++
.../type/ShowSlaveStatusDatabaseDiscoveryType.java | 24 +-----
.../type/ShowSlaveStatusHighlyAvailableStatus.java | 44 ++++++++++
.../mysql/type/MGRDatabaseDiscoveryTypeTest.java | 64 ++++++---------
.../ShowSlaveStatusDatabaseDiscoveryTypeTest.java | 16 ++--
.../opengauss/OpenGaussDatabaseDiscoveryType.java | 7 +-
.../opengauss/OpenGaussHighlyAvailableStatus.java | 36 +++++++++
.../OpenGaussDatabaseDiscoveryTypeTest.java | 29 ++-----
16 files changed, 292 insertions(+), 176 deletions(-)
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-api/src/main/java/org/apache/shardingsphere/dbdiscovery/spi/DatabaseDiscoveryType.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-api/src/main/java/org/apache/shardingsphere/dbdiscovery/spi/DatabaseDiscoveryType.java
index b704cc285cc..3f0cb68dcbd 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-api/src/main/java/org/apache/shardingsphere/dbdiscovery/spi/DatabaseDiscoveryType.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-api/src/main/java/org/apache/shardingsphere/dbdiscovery/spi/DatabaseDiscoveryType.java
@@ -30,13 +30,13 @@ import java.util.Optional;
public interface DatabaseDiscoveryType extends ShardingSphereAlgorithm {
/**
- * Check database discovery configuration.
- *
- * @param databaseName database name
- * @param dataSourceMap data source map
+ * Load highly available status.
+ *
+ * @param dataSource data source
+ * @return loaded highly available status
* @throws SQLException SQL exception
*/
- void checkDatabaseDiscoveryConfiguration(String databaseName, Map<String,
DataSource> dataSourceMap) throws SQLException;
+ HighlyAvailableStatus loadHighlyAvailableStatus(DataSource dataSource)
throws SQLException;
/**
* Determine primary data source.
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-api/src/main/java/org/apache/shardingsphere/dbdiscovery/spi/HighlyAvailableStatus.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-api/src/main/java/org/apache/shardingsphere/dbdiscovery/spi/HighlyAvailableStatus.java
new file mode 100644
index 00000000000..58755a0f4df
--- /dev/null
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-api/src/main/java/org/apache/shardingsphere/dbdiscovery/spi/HighlyAvailableStatus.java
@@ -0,0 +1,39 @@
+/*
+ * 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.dbdiscovery.spi;
+
+import javax.sql.DataSource;
+import java.sql.SQLException;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Highly available status for database cluster.
+ */
+public interface HighlyAvailableStatus {
+
+ /**
+ * Validate highly available status.
+ *
+ * @param databaseName database name
+ * @param dataSourceMap data source map
+ * @param props properties of database discovery type
+ * @throws SQLException SQL exception
+ */
+ void validate(String databaseName, Map<String, DataSource> dataSourceMap,
Properties props) throws SQLException;
+}
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/algorithm/DatabaseDiscoveryEngine.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/algorithm/DatabaseDiscoveryEngine.java
index d9996417e3d..a1904fe4d86 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/algorithm/DatabaseDiscoveryEngine.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/algorithm/DatabaseDiscoveryEngine.java
@@ -17,8 +17,10 @@
package org.apache.shardingsphere.dbdiscovery.algorithm;
+import com.google.common.base.Preconditions;
import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.dbdiscovery.spi.DatabaseDiscoveryType;
+import org.apache.shardingsphere.dbdiscovery.spi.HighlyAvailableStatus;
import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
import org.apache.shardingsphere.infra.metadata.schema.QualifiedDatabase;
import
org.apache.shardingsphere.infra.rule.event.impl.PrimaryDataSourceChangedEvent;
@@ -27,7 +29,9 @@ import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.Collection;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Optional;
/**
@@ -39,14 +43,20 @@ public final class DatabaseDiscoveryEngine {
private final DatabaseDiscoveryType databaseDiscoveryType;
/**
- * Check database discovery configuration.
+ * Check highly available status of database cluster.
*
* @param databaseName database name
* @param dataSourceMap data source map
* @throws SQLException SQL exception
*/
- public void checkDatabaseDiscoveryConfiguration(final String databaseName,
final Map<String, DataSource> dataSourceMap) throws SQLException {
-
databaseDiscoveryType.checkDatabaseDiscoveryConfiguration(databaseName,
dataSourceMap);
+ public void checkHighlyAvailableStatus(final String databaseName, final
Map<String, DataSource> dataSourceMap) throws SQLException {
+ Collection<HighlyAvailableStatus> statuses = new HashSet<>();
+ for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
+ // TODO query with multiple threads
+
statuses.add(databaseDiscoveryType.loadHighlyAvailableStatus(entry.getValue()));
+ }
+ Preconditions.checkState(1 == statuses.size(), "Different status in
highly available cluster in database `%s`.", databaseName);
+ statuses.iterator().next().validate(databaseName, dataSourceMap,
databaseDiscoveryType.getProps());
}
/**
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java
index 56ab36c2062..3539328f05b 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java
@@ -112,7 +112,7 @@ public final class DatabaseDiscoveryRule implements
SchemaRule, DataSourceContai
Map<String, DataSource> originalDataSourceMap = new
HashMap<>(dataSourceMap);
Collection<String> disabledDataSourceNames =
dataSourceRule.getDisabledDataSourceNames();
try {
- engine.checkDatabaseDiscoveryConfiguration(databaseName,
originalDataSourceMap);
+ engine.checkHighlyAvailableStatus(databaseName,
originalDataSourceMap);
} catch (final SQLException ex) {
throw new ShardingSphereException(ex);
}
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/fixture/CoreFixtureDatabaseDiscoveryType.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/fixture/CoreFixtureDatabaseDiscoveryType.java
index d1367c73fc0..20ee5ae091c 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/fixture/CoreFixtureDatabaseDiscoveryType.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/fixture/CoreFixtureDatabaseDiscoveryType.java
@@ -18,15 +18,19 @@
package org.apache.shardingsphere.dbdiscovery.fixture;
import org.apache.shardingsphere.dbdiscovery.spi.DatabaseDiscoveryType;
+import org.apache.shardingsphere.dbdiscovery.spi.HighlyAvailableStatus;
import javax.sql.DataSource;
import java.util.Map;
import java.util.Optional;
+import static org.mockito.Mockito.mock;
+
public final class CoreFixtureDatabaseDiscoveryType implements
DatabaseDiscoveryType {
@Override
- public void checkDatabaseDiscoveryConfiguration(final String databaseName,
final Map<String, DataSource> dataSourceMap) {
+ public HighlyAvailableStatus loadHighlyAvailableStatus(final DataSource
dataSource) {
+ return mock(HighlyAvailableStatus.class);
}
@Override
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/fixture/DistSQLFixtureDatabaseDiscoveryType.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/fixture/DistSQLFixtureDatabas
[...]
index 947baace8f9..fe9a00ce9ae 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/fixture/DistSQLFixtureDatabaseDiscoveryType.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-distsql/shardingsphere-db-discovery-distsql-handler/src/test/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/fixture/DistSQLFixtureDatabaseDiscoveryType.java
@@ -18,15 +18,19 @@
package org.apache.shardingsphere.dbdiscovery.distsql.handler.fixture;
import org.apache.shardingsphere.dbdiscovery.spi.DatabaseDiscoveryType;
+import org.apache.shardingsphere.dbdiscovery.spi.HighlyAvailableStatus;
import javax.sql.DataSource;
import java.util.Map;
import java.util.Optional;
+import static org.mockito.Mockito.mock;
+
public final class DistSQLFixtureDatabaseDiscoveryType implements
DatabaseDiscoveryType {
@Override
- public void checkDatabaseDiscoveryConfiguration(final String databaseName,
final Map<String, DataSource> dataSourceMap) {
+ public HighlyAvailableStatus loadHighlyAvailableStatus(final DataSource
dataSource) {
+ return mock(HighlyAvailableStatus.class);
}
@Override
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/AbstractDatabaseDiscoveryType.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/AbstractDatabaseDiscoveryType.java
index c827cdcb54f..6a546b3f697 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/AbstractDatabaseDiscoveryType.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/AbstractDatabaseDiscoveryType.java
@@ -62,7 +62,7 @@ public abstract class AbstractDatabaseDiscoveryType
implements DatabaseDiscovery
protected abstract Optional<String> loadPrimaryDataSourceURL(Statement
statement) throws SQLException;
- private Optional<String> findPrimaryDataSourceName(final String
primaryDataSourceURL, final Map<String, DataSource> dataSourceMap) {
+ private Optional<String> findPrimaryDataSourceName(final String
primaryDataSourceURL, final Map<String, DataSource> dataSourceMap) {
for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
try (Connection connection = entry.getValue().getConnection()) {
String url = connection.getMetaData().getURL();
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/MGRDatabaseDiscoveryType.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/MGRDatabaseDiscoveryType.java
index f950d08f8b0..31e9814e76c 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/MGRDatabaseDiscoveryType.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/MGRDatabaseDiscoveryType.java
@@ -21,7 +21,6 @@ import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import
org.apache.shardingsphere.dbdiscovery.mysql.AbstractDatabaseDiscoveryType;
-import
org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurationException;
import org.apache.shardingsphere.infra.eventbus.ShardingSphereEventBus;
import org.apache.shardingsphere.infra.rule.event.impl.DataSourceDisabledEvent;
import org.apache.shardingsphere.infra.storage.StorageNodeDataSource;
@@ -47,17 +46,15 @@ import java.util.Properties;
@Slf4j
public final class MGRDatabaseDiscoveryType extends
AbstractDatabaseDiscoveryType {
- private static final String PLUGIN_STATUS = "SELECT * FROM
information_schema.PLUGINS WHERE PLUGIN_NAME='group_replication'";
+ private static final String QUERY_PLUGIN_STATUS = "SELECT PLUGIN_STATUS
FROM information_schema.PLUGINS WHERE PLUGIN_NAME='group_replication'";
- private static final String MEMBER_COUNT = "SELECT count(*) FROM
performance_schema.replication_group_members";
+ private static final String QUERY_GROUP_NAME = "SELECT VARIABLE_VALUE FROM
performance_schema.global_variables WHERE
VARIABLE_NAME='group_replication_group_name'";
- private static final String GROUP_NAME = "SELECT * FROM
performance_schema.global_variables WHERE
VARIABLE_NAME='group_replication_group_name'";
+ private static final String QUERY_SINGLE_PRIMARY_MODE = "SELECT
VARIABLE_VALUE FROM performance_schema.global_variables WHERE
VARIABLE_NAME='group_replication_single_primary_mode'";
- private static final String SINGLE_PRIMARY = "SELECT * FROM
performance_schema.global_variables WHERE
VARIABLE_NAME='group_replication_single_primary_mode'";
+ private static final String QUERY_MEMBER_LIST = "SELECT MEMBER_HOST,
MEMBER_PORT, MEMBER_STATE FROM performance_schema.replication_group_members";
- private static final String MEMBER_LIST = "SELECT MEMBER_HOST,
MEMBER_PORT, MEMBER_STATE FROM performance_schema.replication_group_members";
-
- private static final String PRIMARY_DATA_SOURCE = "SELECT MEMBER_HOST,
MEMBER_PORT FROM performance_schema.replication_group_members WHERE MEMBER_ID =
"
+ private static final String QUERY_PRIMARY_DATA_SOURCE = "SELECT
MEMBER_HOST, MEMBER_PORT FROM performance_schema.replication_group_members
WHERE MEMBER_ID = "
+ "(SELECT VARIABLE_VALUE FROM performance_schema.global_status
WHERE VARIABLE_NAME = 'group_replication_primary_member')";
@Getter
@@ -65,87 +62,44 @@ public final class MGRDatabaseDiscoveryType extends
AbstractDatabaseDiscoveryTyp
private Properties props = new Properties();
@Override
- public void checkDatabaseDiscoveryConfiguration(final String databaseName,
final Map<String, DataSource> dataSourceMap) throws SQLException {
- try (Connection connection =
dataSourceMap.values().iterator().next().getConnection();
+ public MGRHighlyAvailableStatus loadHighlyAvailableStatus(final DataSource
dataSource) throws SQLException {
+ try (Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement()) {
- checkPluginIsActive(statement);
- checkMemberCount(statement);
- checkServerGroupName(statement);
- checkIsSinglePrimaryMode(statement);
- checkDataSourceInReplicationGroup(statement, dataSourceMap);
+ return new
MGRHighlyAvailableStatus(queryIsPluginActive(statement),
queryIsSinglePrimaryMode(statement), queryGroupName(statement),
queryMemberInstanceURLs(statement));
}
}
- private void checkPluginIsActive(final Statement statement) throws
SQLException {
- try (ResultSet resultSet = statement.executeQuery(PLUGIN_STATUS)) {
- while (resultSet.next()) {
- if (!"ACTIVE".equals(resultSet.getString("PLUGIN_STATUS"))) {
- throw new ShardingSphereConfigurationException("MGR plugin
is not active.");
- }
- }
+ private boolean queryIsPluginActive(final Statement statement) throws
SQLException {
+ try (ResultSet resultSet =
statement.executeQuery(QUERY_PLUGIN_STATUS)) {
+ return resultSet.next() &&
"ACTIVE".equals(resultSet.getString("PLUGIN_STATUS"));
}
}
- private void checkMemberCount(final Statement statement) throws
SQLException {
- try (ResultSet resultSet = statement.executeQuery(MEMBER_COUNT)) {
- while (resultSet.next()) {
- if (resultSet.getInt(1) < 1) {
- throw new ShardingSphereConfigurationException("MGR member
count < 1");
- }
- }
+ private boolean queryIsSinglePrimaryMode(final Statement statement) throws
SQLException {
+ try (ResultSet resultSet =
statement.executeQuery(QUERY_SINGLE_PRIMARY_MODE)) {
+ return resultSet.next() &&
"ON".equals(resultSet.getString("VARIABLE_VALUE"));
}
}
- private void checkServerGroupName(final Statement statement) throws
SQLException {
- try (ResultSet resultSet = statement.executeQuery(GROUP_NAME)) {
- while (resultSet.next()) {
- String serverGroupName = resultSet.getString("VARIABLE_VALUE");
- String ruleGroupName = props.getProperty("group-name");
- if (!serverGroupName.equals(ruleGroupName)) {
- throw new ShardingSphereConfigurationException("MGR group
name is not consistent\n" + "serverGroupName: %s\nruleGroupName: %s",
serverGroupName, ruleGroupName);
- }
- }
+ private String queryGroupName(final Statement statement) throws
SQLException {
+ try (ResultSet resultSet = statement.executeQuery(QUERY_GROUP_NAME)) {
+ return resultSet.next() ? resultSet.getString("VARIABLE_VALUE") :
"";
}
}
- private void checkIsSinglePrimaryMode(final Statement statement) throws
SQLException {
- try (ResultSet resultSet = statement.executeQuery(SINGLE_PRIMARY)) {
+ private Collection<String> queryMemberInstanceURLs(final Statement
statement) throws SQLException {
+ Collection<String> result = new LinkedList<>();
+ try (ResultSet resultSet = statement.executeQuery(QUERY_MEMBER_LIST)) {
while (resultSet.next()) {
- if (!"ON".equals(resultSet.getString("VARIABLE_VALUE"))) {
- throw new ShardingSphereConfigurationException("MGR is not
in single primary mode");
- }
- }
- }
- }
-
- private void checkDataSourceInReplicationGroup(final Statement statement,
final Map<String, DataSource> dataSourceMap) throws SQLException {
- Collection<String> memberDataSourceURLs = new LinkedList<>();
- try (ResultSet resultSet = statement.executeQuery(MEMBER_LIST)) {
- while (resultSet.next()) {
- memberDataSourceURLs.add(String.format("%s:%s",
resultSet.getString("MEMBER_HOST"), resultSet.getString("MEMBER_PORT")));
- }
- }
- for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
- checkDataSourceExistedWithGroupMember(entry.getKey(),
entry.getValue(), memberDataSourceURLs);
- }
- }
-
- private void checkDataSourceExistedWithGroupMember(final String
datasourceName, final DataSource dataSource, final Collection<String>
memberDataSourceURLs) throws SQLException {
- boolean isExisted = false;
- for (String each : memberDataSourceURLs) {
- if
(dataSource.getConnection().getMetaData().getURL().contains(each)) {
- isExisted = true;
- break;
+ result.add(String.format("%s:%s",
resultSet.getString("MEMBER_HOST"), resultSet.getString("MEMBER_PORT")));
}
}
- if (!isExisted) {
- throw new ShardingSphereConfigurationException("%s is not MGR
replication group member", datasourceName);
- }
+ return result;
}
@Override
protected Optional<String> loadPrimaryDataSourceURL(final Statement
statement) throws SQLException {
- try (ResultSet resultSet =
statement.executeQuery(PRIMARY_DATA_SOURCE)) {
+ try (ResultSet resultSet =
statement.executeQuery(QUERY_PRIMARY_DATA_SOURCE)) {
if (resultSet.next()) {
return Optional.of(String.format("%s:%s",
resultSet.getString("MEMBER_HOST"), resultSet.getString("MEMBER_PORT")));
}
@@ -166,7 +120,7 @@ public final class MGRDatabaseDiscoveryType extends
AbstractDatabaseDiscoveryTyp
List<String> result = new LinkedList<>();
try (Connection connection =
dataSourceMap.get(getPrimaryDataSource()).getConnection();
Statement statement = connection.createStatement()) {
- ResultSet resultSet = statement.executeQuery(MEMBER_LIST);
+ ResultSet resultSet = statement.executeQuery(QUERY_MEMBER_LIST);
while (resultSet.next()) {
if (!"ONLINE".equals(resultSet.getString("MEMBER_STATE"))) {
continue;
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/MGRHighlyAvailableStatus.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/MGRHighlyAvailableStatus.java
new file mode 100644
index 00000000000..5fdfaec259a
--- /dev/null
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/MGRHighlyAvailableStatus.java
@@ -0,0 +1,73 @@
+/*
+ * 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.dbdiscovery.mysql.type;
+
+import com.google.common.base.Preconditions;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.dbdiscovery.spi.HighlyAvailableStatus;
+import
org.apache.shardingsphere.infra.config.exception.ShardingSphereConfigurationException;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+import java.util.Collection;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Properties;
+
+/**
+ * Highly available status of MySQL MGR cluster.
+ */
+@RequiredArgsConstructor
+@Getter
+@EqualsAndHashCode
+public final class MGRHighlyAvailableStatus implements HighlyAvailableStatus {
+
+ private final boolean pluginActive;
+
+ private final boolean singlePrimaryMode;
+
+ private final String groupName;
+
+ private final Collection<String> memberInstanceURLs;
+
+ @Override
+ public void validate(final String databaseName, final Map<String,
DataSource> dataSourceMap, final Properties props) throws SQLException {
+ Preconditions.checkState(pluginActive, "MGR plugin is not active in
database `%s`.", databaseName);
+ Preconditions.checkState(singlePrimaryMode, "MGR is not in single
primary mode in database `%s`.", databaseName);
+ Preconditions.checkState(props.getProperty("group-name",
"").equals(groupName),
+ "Group name `%s` in MGR is not same with configured one `%s`
in database `%s`.", groupName, props.getProperty("group-name"), databaseName);
+ Preconditions.checkState(!memberInstanceURLs.isEmpty(), "MGR member is
empty in database `%s`.", databaseName);
+ for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
+ checkDataSourceInReplicationGroup(databaseName, entry.getKey(),
entry.getValue());
+ }
+ }
+
+ private void checkDataSourceInReplicationGroup(final String databaseName,
final String dataSourceName, final DataSource dataSource) throws SQLException {
+ for (String each : memberInstanceURLs) {
+ try (Connection connection = dataSource.getConnection()) {
+ if (connection.getMetaData().getURL().contains(each)) {
+ return;
+ }
+ }
+ }
+ throw new ShardingSphereConfigurationException("%s is not in MGR
replication group member in database `%s`.", dataSourceName, databaseName);
+ }
+}
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/ShowSlaveStatusDatabaseDiscoveryType.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/ShowSlaveStatusDatabaseDiscoveryType.java
index 933fb22ac3f..b9a5d79e54b 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/ShowSlaveStatusDatabaseDiscoveryType.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/ShowSlaveStatusDatabaseDiscoveryType.java
@@ -17,7 +17,6 @@
package org.apache.shardingsphere.dbdiscovery.mysql.type;
-import com.google.common.base.Preconditions;
import lombok.Getter;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
@@ -33,8 +32,6 @@ import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
-import java.util.ArrayList;
-import java.util.Collection;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Optional;
@@ -53,24 +50,11 @@ public final class ShowSlaveStatusDatabaseDiscoveryType
extends AbstractDatabase
private Properties props = new Properties();
@Override
- public void checkDatabaseDiscoveryConfiguration(final String databaseName,
final Map<String, DataSource> dataSourceMap) throws SQLException {
- Collection<String> result = getPrimaryDataSourceURLS(dataSourceMap);
- Preconditions.checkState(!result.isEmpty(), "Not found primary data
source for databaseName `%s`", databaseName);
- Preconditions.checkState(1 == result.size(), "More than one primary
data source for databaseName `%s`", databaseName);
- }
-
- private Collection<String> getPrimaryDataSourceURLS(final Map<String,
DataSource> dataSourceMap) throws SQLException {
- Collection<String> result = new ArrayList<>();
- for (Entry<String, DataSource> entry : dataSourceMap.entrySet()) {
- try (Connection connection = entry.getValue().getConnection();
- Statement statement = connection.createStatement()) {
- Optional<String> url = loadPrimaryDataSourceURL(statement);
- if (url.isPresent() && !result.contains(url.get())) {
- result.add(url.get());
- }
- }
+ public ShowSlaveStatusHighlyAvailableStatus
loadHighlyAvailableStatus(final DataSource dataSource) throws SQLException {
+ try (Connection connection = dataSource.getConnection();
+ Statement statement = connection.createStatement()) {
+ return new
ShowSlaveStatusHighlyAvailableStatus(loadPrimaryDataSourceURL(statement).orElse(null));
}
- return result;
}
@Override
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/ShowSlaveStatusHighlyAvailableStatus.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/ShowSlaveStatusHighlyAvailableStatus.java
new file mode 100644
index 00000000000..b250ff14141
--- /dev/null
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/main/java/org/apache/shardingsphere/dbdiscovery/mysql/type/ShowSlaveStatusHighlyAvailableStatus.java
@@ -0,0 +1,44 @@
+/*
+ * 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.dbdiscovery.mysql.type;
+
+import com.google.common.base.Preconditions;
+import lombok.EqualsAndHashCode;
+import lombok.Getter;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.dbdiscovery.spi.HighlyAvailableStatus;
+
+import javax.sql.DataSource;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Highly available status of MySQL show slave status cluster.
+ */
+@RequiredArgsConstructor
+@Getter
+@EqualsAndHashCode
+public final class ShowSlaveStatusHighlyAvailableStatus implements
HighlyAvailableStatus {
+
+ private final String primaryInstanceURL;
+
+ @Override
+ public void validate(final String databaseName, final Map<String,
DataSource> dataSourceMap, final Properties props) {
+ Preconditions.checkState(null != primaryInstanceURL, "Can not load
primary data source URL in database `%s`.", databaseName);
+ }
+}
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/test/java/org/apache/shardingsphere/dbdiscovery/mysql/type/MGRDatabaseDiscoveryTypeTest.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/test/java/org/apache/shardingsphere/dbdiscovery/mysql/type/MGRDatabaseDiscoveryTypeTest.java
index a9b1967fe1d..91be6586f0b 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/test/java/org/apache/shardingsphere/dbdiscovery/mysql/type/MGRDatabaseDiscoveryTypeTest.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/test/java/org/apache/shardingsphere/dbdiscovery/mysql/type/MGRDatabaseDiscoveryTypeTest.java
@@ -35,13 +35,18 @@ import java.sql.DatabaseMetaData;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
+import java.util.Arrays;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.mockStatic;
import static org.mockito.Mockito.verify;
@@ -49,45 +54,26 @@ import static org.mockito.Mockito.when;
public final class MGRDatabaseDiscoveryTypeTest {
- private static final String PLUGIN_STATUS = "SELECT * FROM
information_schema.PLUGINS WHERE PLUGIN_NAME='group_replication'";
-
- private static final String MEMBER_COUNT = "SELECT count(*) FROM
performance_schema.replication_group_members";
-
- private static final String GROUP_NAME = "SELECT * FROM
performance_schema.global_variables WHERE
VARIABLE_NAME='group_replication_group_name'";
-
- private static final String SINGLE_PRIMARY = "SELECT * FROM
performance_schema.global_variables WHERE
VARIABLE_NAME='group_replication_single_primary_mode'";
-
- private static final String GROUP_MEMBER = "SELECT MEMBER_HOST,
MEMBER_PORT, MEMBER_STATE FROM performance_schema.replication_group_members";
-
- private final MGRDatabaseDiscoveryType mgrDatabaseDiscoveryType = new
MGRDatabaseDiscoveryType();
+ private final MGRDatabaseDiscoveryType databaseDiscoveryType = new
MGRDatabaseDiscoveryType();
@Test
- public void assertCheckMGRConfig() throws SQLException {
- DataSource dataSource = mock(DataSource.class);
- Connection connection = mock(Connection.class);
- Statement statement = mock(Statement.class);
+ public void assertLoadHighlyAvailableStatus() throws SQLException {
+ DataSource dataSource = mock(DataSource.class, RETURNS_DEEP_STUBS);
ResultSet resultSet = mock(ResultSet.class);
- DatabaseMetaData databaseMetaData = mock(DatabaseMetaData.class);
- when(dataSource.getConnection()).thenReturn(connection);
- when(connection.createStatement()).thenReturn(statement);
- when(statement.executeQuery(PLUGIN_STATUS)).thenReturn(resultSet);
- when(statement.executeQuery(MEMBER_COUNT)).thenReturn(resultSet);
- when(statement.executeQuery(GROUP_NAME)).thenReturn(resultSet);
- when(statement.executeQuery(SINGLE_PRIMARY)).thenReturn(resultSet);
- when(statement.executeQuery(GROUP_MEMBER)).thenReturn(resultSet);
- when(resultSet.next()).thenReturn(true, false, true, false, true,
false, true, false, true, false);
+
when(dataSource.getConnection().createStatement().executeQuery(any())).thenReturn(resultSet);
+ when(resultSet.next()).thenReturn(true, true, true, true, true, false);
when(resultSet.getString("PLUGIN_STATUS")).thenReturn("ACTIVE");
- when(resultSet.getInt(1)).thenReturn(3);
- when(resultSet.getString("VARIABLE_VALUE")).thenReturn("group_name",
"ON");
- when(resultSet.getString("MEMBER_HOST")).thenReturn("127.0.0.1");
-
when(resultSet.getString("MEMBER_PORT")).thenReturn(Integer.toString(3306));
+ when(resultSet.getString("VARIABLE_VALUE")).thenReturn("ON",
"group_name");
+ when(resultSet.getString("MEMBER_HOST")).thenReturn("127.0.0.1",
"127.0.0.1");
+ when(resultSet.getString("MEMBER_PORT")).thenReturn("3306", "3307");
when(resultSet.getString("MEMBER_STATE")).thenReturn("ONLINE");
- when(connection.getMetaData()).thenReturn(databaseMetaData);
-
when(databaseMetaData.getURL()).thenReturn("jdbc:mysql://127.0.0.1:3306/ds_0?serverTimezone=UTC&useSSL=false");
- mgrDatabaseDiscoveryType.getProps().setProperty("group-name",
"group_name");
- Map<String, DataSource> dataSourceMap = new HashMap<>(1, 1);
- dataSourceMap.put("ds_0", dataSource);
-
mgrDatabaseDiscoveryType.checkDatabaseDiscoveryConfiguration("discovery_db",
dataSourceMap);
+
when(dataSource.getConnection().getMetaData().getURL()).thenReturn("jdbc:mysql://127.0.0.1:3306/ds_0?serverTimezone=UTC&useSSL=false");
+ databaseDiscoveryType.getProps().setProperty("group-name",
"group_name");
+ MGRHighlyAvailableStatus actual =
databaseDiscoveryType.loadHighlyAvailableStatus(dataSource);
+ assertTrue(actual.isPluginActive());
+ assertTrue(actual.isSinglePrimaryMode());
+ assertThat(actual.getGroupName(), is("group_name"));
+ assertThat(actual.getMemberInstanceURLs(),
is(Arrays.asList("127.0.0.1:3306", "127.0.0.1:3307")));
}
@Test
@@ -120,8 +106,10 @@ public final class MGRDatabaseDiscoveryTypeTest {
for (int i = 0; i < 3; i++) {
dataSourceMap.put(String.format("ds_%s", i), dataSources.get(i));
}
- mgrDatabaseDiscoveryType.getProps().setProperty("group-name",
"group_name");
-
assertThat(mgrDatabaseDiscoveryType.determinePrimaryDataSource(dataSourceMap),
is("ds_2"));
+ databaseDiscoveryType.getProps().setProperty("group-name",
"group_name");
+ Optional<String> actual =
databaseDiscoveryType.determinePrimaryDataSource(dataSourceMap);
+ assertTrue(actual.isPresent());
+ assertThat(actual.get(), is("ds_2"));
}
// TODO Fix me
@@ -130,7 +118,7 @@ public final class MGRDatabaseDiscoveryTypeTest {
public void assertUpdateMemberState() throws SQLException,
IllegalAccessException, NoSuchFieldException {
Field declaredField =
AbstractDatabaseDiscoveryType.class.getDeclaredField("oldPrimaryDataSource");
declaredField.setAccessible(true);
- declaredField.set(mgrDatabaseDiscoveryType, "ds_0");
+ declaredField.set(databaseDiscoveryType, "ds_0");
EventBus eventBus = mock(EventBus.class);
mockStatic(ShardingSphereEventBus.class);
when(ShardingSphereEventBus.getInstance()).thenReturn(eventBus);
@@ -162,7 +150,7 @@ public final class MGRDatabaseDiscoveryTypeTest {
for (int i = 0; i < 3; i++) {
dataSourceMap.put(String.format("ds_%s", i), dataSources.get(i));
}
- mgrDatabaseDiscoveryType.updateMemberState("discovery_db",
dataSourceMap, "readwrite_ds");
+ databaseDiscoveryType.updateMemberState("discovery_db", dataSourceMap,
"readwrite_ds");
verify(eventBus).post(Mockito.refEq(new
DataSourceDisabledEvent("discovery_db", "readwrite_ds", "ds_2",
new StorageNodeDataSource(StorageNodeRole.MEMBER,
StorageNodeStatus.DISABLED))));
}
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/test/java/org/apache/shardingsphere/dbdiscovery/mysql/type/ShowSlaveStatusDatabaseDiscoveryTypeTest.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/test/java/org/apache/shardingsphere/dbdiscovery/mysql/type/ShowSlaveStatusDatabaseDiscoveryTypeTest.java
index 3ae250027ef..c67bf7df960 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/test/java/org/apache/shardingsphere/dbdiscovery/mysql/type/ShowSlaveStatusDatabaseDiscoveryTypeTest.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-mysql/src/test/java/org/apache/shardingsphere/dbdiscovery/mysql/type/ShowSlaveStatusDatabaseDiscoveryTypeTest.java
@@ -27,22 +27,20 @@ import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;
+import java.util.Optional;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
public final class ShowSlaveStatusDatabaseDiscoveryTypeTest {
- private final ShowSlaveStatusDatabaseDiscoveryType
showSlaveStatusDatabaseDiscoveryType = new
ShowSlaveStatusDatabaseDiscoveryType();
-
@Test
- public void assertCheckShowSlaveStatusConfig() throws SQLException {
- Map<String, DataSource> dataSourceMap = new HashMap<>(2, 1);
- dataSourceMap.put("ds_0", getDataSource(false, 3306));
- dataSourceMap.put("ds_1", getDataSource(true, 3307));
-
showSlaveStatusDatabaseDiscoveryType.checkDatabaseDiscoveryConfiguration("discovery_db",
dataSourceMap);
+ public void assertLoadHighlyAvailableStatus() throws SQLException {
+ ShowSlaveStatusHighlyAvailableStatus actual = new
ShowSlaveStatusDatabaseDiscoveryType().loadHighlyAvailableStatus(getDataSource(true,
3306));
+ assertThat(actual.getPrimaryInstanceURL(), is("127.0.0.1:3306"));
}
@Test
@@ -50,7 +48,9 @@ public final class ShowSlaveStatusDatabaseDiscoveryTypeTest {
Map<String, DataSource> dataSourceMap = new HashMap<>(2, 1);
dataSourceMap.put("ds_0", getDataSource(false, 3306));
dataSourceMap.put("ds_1", getDataSource(true, 3307));
-
assertThat(showSlaveStatusDatabaseDiscoveryType.determinePrimaryDataSource(dataSourceMap),
is("ds_0"));
+ Optional<String> actual = new
ShowSlaveStatusDatabaseDiscoveryType().determinePrimaryDataSource(dataSourceMap);
+ assertTrue(actual.isPresent());
+ assertThat(actual.get(), is("ds_0"));
}
private DataSource getDataSource(final boolean slave, final int port)
throws SQLException {
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-opengauss/src/main/java/org/apache/shardingsphere/dbdiscovery/opengauss/OpenGaussDatabaseDiscoveryType.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-opengauss/src/main/java/org/apache/shardingsphere/dbdiscovery/opengauss/OpenGaussDatabaseDiscoveryType.java
index 7462394cb7c..2d95c1acc1e 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-opengauss/src/main/java/org/apache/shardingsphere/dbdiscovery/opengauss/OpenGaussDatabaseDiscoveryType.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-opengauss/src/main/java/org/apache/shardingsphere/dbdiscovery/opengauss/OpenGaussDatabaseDiscoveryType.java
@@ -49,13 +49,12 @@ public final class OpenGaussDatabaseDiscoveryType
implements DatabaseDiscoveryTy
private String oldPrimaryDataSource;
- @Getter
- @Setter
private Properties props = new Properties();
@Override
- public void checkDatabaseDiscoveryConfiguration(final String databaseName,
final Map<String, DataSource> dataSourceMap) {
- // TODO Check openGauss configuration
+ public OpenGaussHighlyAvailableStatus loadHighlyAvailableStatus(final
DataSource dataSource) {
+ // TODO Load OpenGaussHighlyAvailableStatus
+ return new OpenGaussHighlyAvailableStatus();
}
@Override
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-opengauss/src/main/java/org/apache/shardingsphere/dbdiscovery/opengauss/OpenGaussHighlyAvailableStatus.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-opengauss/src/main/java/org/apache/shardingsphere/dbdiscovery/opengauss/OpenGaussHighlyAvailableStatus.java
new file mode 100644
index 00000000000..70f8256d2ef
--- /dev/null
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-opengauss/src/main/java/org/apache/shardingsphere/dbdiscovery/opengauss/OpenGaussHighlyAvailableStatus.java
@@ -0,0 +1,36 @@
+/*
+ * 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.dbdiscovery.opengauss;
+
+import lombok.EqualsAndHashCode;
+import org.apache.shardingsphere.dbdiscovery.spi.HighlyAvailableStatus;
+
+import javax.sql.DataSource;
+import java.util.Map;
+import java.util.Properties;
+
+/**
+ * Highly available status of openGauss cluster.
+ */
+@EqualsAndHashCode
+public final class OpenGaussHighlyAvailableStatus implements
HighlyAvailableStatus {
+
+ @Override
+ public void validate(final String databaseName, final Map<String,
DataSource> dataSourceMap, final Properties props) {
+ }
+}
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-opengauss/src/test/java/org/apache/shardingsphere/dbdiscovery/opengauss/OpenGaussDatabaseDiscoveryTypeTest.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-opengauss/src/test/java/org/apache/shardingsphere/dbdiscovery/opengauss/OpenGaussDatabaseDiscoveryTypeTest.java
index 488ac0f1483..b3c2f88ed77 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-opengauss/src/test/java/org/apache/shardingsphere/dbdiscovery/opengauss/OpenGaussDatabaseDiscoveryTypeTest.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-provider/shardingsphere-db-discovery-opengauss/src/test/java/org/apache/shardingsphere/dbdiscovery/opengauss/OpenGaussDatabaseDiscoveryTypeTest.java
@@ -29,9 +29,11 @@ import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
+import java.util.Optional;
import static org.hamcrest.CoreMatchers.is;
import static org.junit.Assert.assertThat;
+import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
@@ -39,29 +41,6 @@ public final class OpenGaussDatabaseDiscoveryTypeTest {
private static final String DB_ROLE = "SELECT local_role,db_state FROM
pg_stat_get_stream_replications()";
- private static final String STANDBYS = "SELECT client_addr,sync_state FROM
pg_stat_replication";
-
- private final OpenGaussDatabaseDiscoveryType ogHaType = new
OpenGaussDatabaseDiscoveryType();
-
- @Test
- public void assertCheckHAConfig() throws SQLException {
- DataSource dataSource = mock(DataSource.class);
- Connection connection = mock(Connection.class);
- Statement statement = mock(Statement.class);
- ResultSet resultSet = mock(ResultSet.class);
- when(dataSource.getConnection()).thenReturn(connection);
- when(connection.createStatement()).thenReturn(statement);
- when(statement.executeQuery(DB_ROLE)).thenReturn(resultSet);
- when(statement.executeQuery(STANDBYS)).thenReturn(resultSet);
- when(resultSet.next()).thenReturn(true, false, true, false, true,
false, true, false);
- when(resultSet.getString("local_role")).thenReturn("Primary");
- when(resultSet.getString("db_state")).thenReturn("Normal");
- when(resultSet.getString("db_state")).thenReturn("Sync");
- Map<String, DataSource> dataSourceMap = new HashMap<>(1, 1);
- dataSourceMap.put("ds_0", dataSource);
- ogHaType.checkDatabaseDiscoveryConfiguration("discovery_db",
dataSourceMap);
- }
-
@Test
public void assertDeterminePrimaryDataSource() throws SQLException {
List<DataSource> dataSources = new LinkedList<>();
@@ -90,6 +69,8 @@ public final class OpenGaussDatabaseDiscoveryTypeTest {
for (int i = 0; i < 3; i++) {
dataSourceMap.put(String.format("ds_%s", i), dataSources.get(i));
}
- assertThat(ogHaType.determinePrimaryDataSource(dataSourceMap),
is("ds_2"));
+ Optional<String> actual = new
OpenGaussDatabaseDiscoveryType().determinePrimaryDataSource(dataSourceMap);
+ assertTrue(actual.isPresent());
+ assertThat(actual.get(), is("ds_2"));
}
}