This is an automated email from the ASF dual-hosted git repository.
jianglongtao 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 cda2164ae79 Add convert db-discovery distsql and test case (#20707)
cda2164ae79 is described below
commit cda2164ae79b4a0cf41e485464db4690c36fdfe8
Author: Xin Huang <[email protected]>
AuthorDate: Fri Sep 2 10:10:28 2022 +0800
Add convert db-discovery distsql and test case (#20707)
* rebase conflicts fixed
* rebase conflict in yaml fixed
* conflict fixed
* QueryableRALStatementAssert.java bug fixed
* indentation bug fixed
* convertyamlconfigurationhandler conflict fixed
* db-discovert constants conflict fixed
---
.../common/constant/DistSQLScriptConstants.java | 28 +++++--
.../queryable/ConvertYamlConfigurationHandler.java | 88 +++++++++++++++++++++-
.../ConvertYamlConfigurationHandlerTest.java | 16 +++-
.../conf/convert/config-database-discovery.yaml | 67 ++++++++++++++++
.../expected/convert-database-discovery.yaml | 40 ++++++++++
5 files changed, 230 insertions(+), 9 deletions(-)
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/common/constant/DistSQLScriptConstants.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/common/constant/DistSQLScriptConstants.java
index 4eb1b890eb7..164936e5896 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/common/constant/DistSQLScriptConstants.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/common/constant/DistSQLScriptConstants.java
@@ -25,13 +25,15 @@ import lombok.NoArgsConstructor;
*/
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public final class DistSQLScriptConstants {
-
+
public static final String RESOURCE_DB = "resource_db";
public static final String SHARDING_DB = "sharding_db";
public static final String READWRITE_SPLITTING_DB =
"readwrite_splitting_db";
-
+
+ public static final String DATABASE_DISCOVERY_DB = "database_discovery_db";
+
public static final String STANDARD = "standard";
public static final String COMPLEX = "complex";
@@ -134,10 +136,26 @@ public final class DistSQLScriptConstants {
+ "%s"
+ System.lineSeparator()
+ ")";
+
+ public static final String READWRITE_SPLITTING_TYPE = "TYPE(NAME=\"%s\")";
- public static final String TYPE = "TYPE(NAME=\"%s\")";
-
- public static final String TYPE_PROPERTIES = "TYPE(NAME=\"%s\",
PROPERTIES(%s))";
+ public static final String READWRITE_SPLITTING_TYPE_PROPERTIES =
"TYPE(NAME=\"%s\", PROPERTIES(%s))";
public static final String READ_RESOURCE = "%s";
+
+ public static final String CREATE_DB_DISCOVERY = "CREATE DB_DISCOVERY
RULE";
+
+ public static final String DB_DISCOVERY = " %s ("
+ + System.lineSeparator()
+ + "RESOURCES(%s),"
+ + System.lineSeparator()
+ + "%s,"
+ + System.lineSeparator()
+ + "HEARTBEAT(PROPERTIES(%s))"
+ + System.lineSeparator()
+ + ")";
+
+ public static final String DB_DISCOVERY_TYPE = "TYPE(NAME=\'%s\',
PROPERTIES(%s))";
+
+ public static final String DB_DISCOVERY_PROPERTY = "\'%s\'=\'%s\'";
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
index 29742f269ba..66938ab49b4 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandler.java
@@ -20,6 +20,8 @@ package
org.apache.shardingsphere.proxy.backend.handler.distsql.ral.queryable;
import com.google.common.base.Preconditions;
import com.zaxxer.hikari.HikariDataSource;
import org.apache.commons.lang3.StringUtils;
+import
org.apache.shardingsphere.dbdiscovery.yaml.config.rule.YamlDatabaseDiscoveryDataSourceRuleConfiguration;
+import
org.apache.shardingsphere.dbdiscovery.yaml.config.rule.YamlDatabaseDiscoveryHeartBeatConfiguration;
import
org.apache.shardingsphere.distsql.parser.statement.ral.queryable.ConvertYamlConfigurationStatement;
import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration;
import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
@@ -48,6 +50,7 @@ import
org.apache.shardingsphere.sharding.api.config.strategy.sharding.StandardS
import
org.apache.shardingsphere.sharding.yaml.config.YamlShardingRuleConfiguration;
import
org.apache.shardingsphere.sharding.yaml.swapper.YamlShardingRuleConfigurationSwapper;
import
org.apache.shardingsphere.readwritesplitting.yaml.config.YamlReadwriteSplittingRuleConfiguration;
+import
org.apache.shardingsphere.dbdiscovery.yaml.config.YamlDatabaseDiscoveryRuleConfiguration;
import java.io.File;
import java.io.IOException;
@@ -97,6 +100,9 @@ public final class ConvertYamlConfigurationHandler extends
QueryableRALBackendHa
case DistSQLScriptConstants.READWRITE_SPLITTING_DB:
addReadWriteSplittingDistSQL(yamlConfig, result);
break;
+ case DistSQLScriptConstants.DATABASE_DISCOVERY_DB:
+ addDatabaseDiscoveryDistSQL(yamlConfig, result);
+ break;
default:
break;
}
@@ -119,6 +125,12 @@ public final class ConvertYamlConfigurationHandler extends
QueryableRALBackendHa
appendResources(yamlConfig.getDataSources(), result);
appendReadWriteSplittingRules(yamlConfig.getRules(), result);
}
+
+ private void addDatabaseDiscoveryDistSQL(final
YamlProxyDatabaseConfiguration yamlConfig, final StringBuilder result) {
+ appendDatabase(yamlConfig.getDatabaseName(), result);
+ appendResources(yamlConfig.getDataSources(), result);
+ appendDatabaseDiscoveryRules(yamlConfig.getRules(), result);
+ }
private void appendDatabase(final String databaseName, final StringBuilder
result) {
result.append(String.format(DistSQLScriptConstants.CREATE_DATABASE,
databaseName)).append(System.lineSeparator());
@@ -358,7 +370,7 @@ public final class ConvertYamlConfigurationHandler extends
QueryableRALBackendHa
StringBuilder result = new StringBuilder();
String loadBalancerProperties = "";
if (loadBalancers.getValue().getProps().isEmpty()) {
- result.append(String.format(DistSQLScriptConstants.TYPE,
loadBalancers.getValue().getType()));
+
result.append(String.format(DistSQLScriptConstants.READWRITE_SPLITTING_TYPE,
loadBalancers.getValue().getType()));
} else {
Iterator<Entry<Object, Object>> iterator =
loadBalancers.getValue().getProps().entrySet().iterator();
while (iterator.hasNext()) {
@@ -367,7 +379,7 @@ public final class ConvertYamlConfigurationHandler extends
QueryableRALBackendHa
loadBalancerProperties =
appendLoadBalancerProperties(loadBalancers.getValue().getProps());
}
}
-
result.append(String.format(DistSQLScriptConstants.TYPE_PROPERTIES,
loadBalancers.getValue().getType(), loadBalancerProperties));
+
result.append(String.format(DistSQLScriptConstants.READWRITE_SPLITTING_TYPE_PROPERTIES,
loadBalancers.getValue().getType(), loadBalancerProperties));
}
return result.toString();
}
@@ -384,4 +396,76 @@ public final class ConvertYamlConfigurationHandler extends
QueryableRALBackendHa
}
return result.toString();
}
+
+ private void appendDatabaseDiscoveryRules(final
Collection<YamlRuleConfiguration> ruleConfigs, final StringBuilder result) {
+ if (ruleConfigs.isEmpty()) {
+ return;
+ }
+ result.append(DistSQLScriptConstants.CREATE_DB_DISCOVERY);
+ for (YamlRuleConfiguration ruleConfig: ruleConfigs) {
+ Iterator<Entry<String,
YamlDatabaseDiscoveryDataSourceRuleConfiguration>> dataSourcesIter =
((YamlDatabaseDiscoveryRuleConfiguration)
ruleConfig).getDataSources().entrySet().iterator();
+ while (dataSourcesIter.hasNext()) {
+ Entry<String,
YamlDatabaseDiscoveryDataSourceRuleConfiguration> entry =
dataSourcesIter.next();
+ String databaseDiscoveryName = entry.getKey();
+ String databaseSourceNames =
getDatabaseDiscoveryResources(entry.getValue().getDataSourceNames());
+ String databaseType =
getDatabaseDiscoveryType(entry.getValue().getDiscoveryTypeName(), ruleConfig);
+ String databaseHeartbeatProperty =
getDatabaseDiscoveryHeartbeat(entry.getValue().getDiscoveryHeartbeatName(),
ruleConfig);
+
result.append(String.format(DistSQLScriptConstants.DB_DISCOVERY,
databaseDiscoveryName, databaseSourceNames, databaseType,
databaseHeartbeatProperty));
+ if (dataSourcesIter.hasNext()) {
+ result.append(DistSQLScriptConstants.COMMA);
+ }
+ }
+
result.append(DistSQLScriptConstants.SEMI).append(System.lineSeparator());
+ }
+ }
+
+ private String getDatabaseDiscoveryResources(final Collection<String>
databaseDiscoveryNames) {
+ StringBuilder result = new StringBuilder();
+ Iterator<String> iterator = databaseDiscoveryNames.iterator();
+ while (iterator.hasNext()) {
+ String databaseDiscoveryName = iterator.next();
+ result.append(databaseDiscoveryName);
+ if (iterator.hasNext()) {
+ result.append(DistSQLScriptConstants.COMMA);
+ }
+ }
+ return result.toString();
+ }
+
+ private String getDatabaseDiscoveryHeartbeat(final String
discoveryHeartbeatName, final YamlRuleConfiguration ruleConfig) {
+ StringBuilder result = new StringBuilder();
+ Iterator<Entry<String, YamlDatabaseDiscoveryHeartBeatConfiguration>>
discoveryHeartbeatsIter =
+ ((YamlDatabaseDiscoveryRuleConfiguration)
ruleConfig).getDiscoveryHeartbeats().entrySet().iterator();
+ while (discoveryHeartbeatsIter.hasNext()) {
+ Entry<String, YamlDatabaseDiscoveryHeartBeatConfiguration> entry =
discoveryHeartbeatsIter.next();
+ if (entry.getKey().equals(discoveryHeartbeatName)) {
+ getDatabaseDiscoveryProperties(entry.getValue().getProps(),
result);
+ }
+ }
+ return result.toString();
+ }
+
+ private String getDatabaseDiscoveryType(final String discoveryTypeName,
final YamlRuleConfiguration ruleConfig) {
+ StringBuilder result = new StringBuilder();
+ StringBuilder properties = new StringBuilder();
+ Iterator<Entry<String, YamlAlgorithmConfiguration>> discoveryTypesIter
= ((YamlDatabaseDiscoveryRuleConfiguration)
ruleConfig).getDiscoveryTypes().entrySet().iterator();
+ while (discoveryTypesIter.hasNext()) {
+ Entry<String, YamlAlgorithmConfiguration> entry =
discoveryTypesIter.next();
+ if (entry.getKey().equals(discoveryTypeName)) {
+ getDatabaseDiscoveryProperties(entry.getValue().getProps(),
properties);
+ String typeName = entry.getValue().getType();
+ String typePros = properties.toString();
+
result.append(String.format(DistSQLScriptConstants.DB_DISCOVERY_TYPE, typeName,
typePros));
+ }
+ }
+ return result.toString();
+ }
+
+ private void getDatabaseDiscoveryProperties(final Properties
heartbeatProperties, final StringBuilder result) {
+ Iterator<Entry<Object, Object>> iterator =
heartbeatProperties.entrySet().iterator();
+ while (iterator.hasNext()) {
+ Entry<Object, Object> entry = iterator.next();
+
result.append(String.format(DistSQLScriptConstants.DB_DISCOVERY_PROPERTY,
entry.getKey(), entry.getValue()));
+ }
+ }
}
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandlerTest.java
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandlerTest.java
index 04749af37c1..bb0074b81fe 100644
---
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandlerTest.java
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/ConvertYamlConfigurationHandlerTest.java
@@ -51,26 +51,33 @@ public final class ConvertYamlConfigurationHandlerTest
extends ProxyContextResto
private final String shardingFilePath =
"/conf/convert/config-sharding.yaml";
private final String readWriteSplittingFilePath =
"/conf/convert/config-readwrite-splitting.yaml";
+
+ private final String databaseDiscoveryFilePath =
"/conf/convert/config-database-discovery.yaml";
private final String resourceExpectedFilePath =
"/expected/convert-add-resource.yaml";
private final String shardingExpectedFilePath =
"/expected/convert-create-sharding.yaml";
private final String readWriteSplittingExpectedFilePath =
"/expected/convert-readwrite-splitting.yaml";
+
+ private final String databaseDiscoveryExpectedFilePath =
"/expected/convert-database-discovery.yaml";
private final String resource = "resource";
private final String sharding = "sharding";
private final String readWriteSplitting = "readWriteSplitting";
+
+ private final String databaseDiscovery = "databaseDiscovery";
- private final Map<String, String> featureMap = new HashMap<>(3, 1);
+ private final Map<String, String> featureMap = new HashMap<>(4, 1);
@Before
public void setup() {
featureMap.put(resource, resourceFilePath);
featureMap.put(sharding, shardingFilePath);
featureMap.put(readWriteSplitting, readWriteSplittingFilePath);
+ featureMap.put(databaseDiscovery, databaseDiscoveryFilePath);
}
@Before
@@ -93,7 +100,12 @@ public final class ConvertYamlConfigurationHandlerTest
extends ProxyContextResto
public void assertExecuteWithReadWriteSplitting() throws SQLException {
assertExecute(readWriteSplitting, readWriteSplittingExpectedFilePath);
}
-
+
+ @Test
+ public void assertExecuteWithDatabaseDiscovery() throws SQLException {
+ assertExecute(databaseDiscovery, databaseDiscoveryExpectedFilePath);
+ }
+
public void assertExecute(final String type, final String
expectedFilePath) throws SQLException {
ConvertYamlConfigurationHandler handler = new
ConvertYamlConfigurationHandler();
handler.init(new
ConvertYamlConfigurationStatement(Objects.requireNonNull(ConvertYamlConfigurationHandlerTest.class.getResource(featureMap.get(type))).getPath()),
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/conf/convert/config-database-discovery.yaml
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/conf/convert/config-database-discovery.yaml
new file mode 100644
index 00000000000..dcb5417fe4b
--- /dev/null
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/conf/convert/config-database-discovery.yaml
@@ -0,0 +1,67 @@
+#
+# 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.
+#
+
+databaseName: database_discovery_db
+
+dataSources:
+ ds_0:
+ url:
jdbc:mysql://127.0.0.1:3306/demo_primary_ds?serverTimezone=UTC&useSSL=false
+ username: root
+ password: 12345678
+ connectionTimeoutMilliseconds: 3000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 50
+ minPoolSize: 1
+ ds_1:
+ url:
jdbc:mysql://127.0.0.1:3306/demo_replica_ds_0?serverTimezone=UTC&useSSL=false
+ username: root
+ password: 12345678
+ connectionTimeoutMilliseconds: 3000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 50
+ minPoolSize: 1
+ ds_2:
+ url:
jdbc:mysql://127.0.0.1:3306/demo_replica_ds_1?serverTimezone=UTC&useSSL=false
+ username: root
+ password: 12345678
+ connectionTimeoutMilliseconds: 3000
+ idleTimeoutMilliseconds: 60000
+ maxLifetimeMilliseconds: 1800000
+ maxPoolSize: 50
+ minPoolSize: 1
+
+rules:
+ - !DB_DISCOVERY
+ dataSources:
+ readwrite_ds:
+ dataSourceNames:
+ - ds_0
+ - ds_1
+ - ds_2
+ discoveryHeartbeatName: mgr-heartbeat
+ discoveryTypeName: mgr
+ discoveryHeartbeats:
+ mgr-heartbeat:
+ props:
+ keep-alive-cron: '0/5 * * * * ?'
+ discoveryTypes:
+ mgr:
+ type: MySQL.MGR
+ props:
+ group-name: 92504d5b-6dec-11e8-91ea-246e9612aaf1
diff --git
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/expected/convert-database-discovery.yaml
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/expected/convert-database-discovery.yaml
new file mode 100644
index 00000000000..aeac2b2b83d
--- /dev/null
+++
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/resources/expected/convert-database-discovery.yaml
@@ -0,0 +1,40 @@
+#
+# 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.
+#
+
+CREATE DATABASE database_discovery_db;
+USE database_discovery_db;
+ADD RESOURCE ds_0 (
+URL="jdbc:mysql://127.0.0.1:3306/demo_primary_ds?serverTimezone=UTC&useSSL=false",
+USER="root",
+PASSWORD="12345678",
+PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="3000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+), ds_1 (
+URL="jdbc:mysql://127.0.0.1:3306/demo_replica_ds_0?serverTimezone=UTC&useSSL=false",
+USER="root",
+PASSWORD="12345678",
+PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="3000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+), ds_2 (
+URL="jdbc:mysql://127.0.0.1:3306/demo_replica_ds_1?serverTimezone=UTC&useSSL=false",
+USER="root",
+PASSWORD="12345678",
+PROPERTIES("minPoolSize"="1","connectionTimeoutMilliseconds"="3000","maxLifetimeMilliseconds"="1800000","idleTimeoutMilliseconds"="60000","maxPoolSize"="50")
+);
+CREATE DB_DISCOVERY RULE readwrite_ds (
+RESOURCES(ds_0,ds_1,ds_2),
+TYPE(NAME='MySQL.MGR',
PROPERTIES('group-name'='92504d5b-6dec-11e8-91ea-246e9612aaf1')),
+HEARTBEAT(PROPERTIES('keep-alive-cron'='0/5 * * * * ?'))
+);