This is an automated email from the ASF dual-hosted git repository.
panjuan 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 4098502 Refactor DatabaseDiscoveryRule (#12225)
4098502 is described below
commit 40985027228e50418fb4d06cc09054ea55e05332
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Sep 5 14:20:37 2021 +0800
Refactor DatabaseDiscoveryRule (#12225)
---
.../dbdiscovery/rule/DatabaseDiscoveryRule.java | 95 ++++++++++------------
...orithmProvidedDatabaseDiscoveryRuleBuilder.java | 2 +-
.../rule/builder/DatabaseDiscoveryRuleBuilder.java | 2 +-
.../route/DatabaseDiscoverySQLRouterTest.java | 2 +-
.../rule/DatabaseDiscoveryRuleTest.java | 5 +-
5 files changed, 50 insertions(+), 56 deletions(-)
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 d738d3c..cedf26d 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
@@ -25,6 +25,7 @@ import
org.apache.shardingsphere.dbdiscovery.api.config.rule.DatabaseDiscoveryDa
import org.apache.shardingsphere.dbdiscovery.spi.DatabaseDiscoveryType;
import org.apache.shardingsphere.infra.aware.DataSourceNameAware;
import org.apache.shardingsphere.infra.aware.DataSourceNameAwareFactory;
+import
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmConfiguration;
import
org.apache.shardingsphere.infra.config.algorithm.ShardingSphereAlgorithmFactory;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.exception.ShardingSphereException;
@@ -55,53 +56,57 @@ public final class DatabaseDiscoveryRule implements
SchemaRule, DataSourceContai
ShardingSphereServiceLoader.register(DataSourceNameAware.class);
}
- private final Map<String, DatabaseDiscoveryType> discoveryTypes = new
LinkedHashMap<>();
+ private final Map<String, DatabaseDiscoveryType> discoveryTypes;
@Getter
private final Map<String, DatabaseDiscoveryDataSourceRule> dataSourceRules;
- public DatabaseDiscoveryRule(final DatabaseDiscoveryRuleConfiguration
config, final DatabaseType databaseType, final Map<String, DataSource>
dataSourceMap, final String schemaName) {
- Preconditions.checkArgument(!config.getDataSources().isEmpty(),
"database discovery rules can not be empty.");
- Preconditions.checkArgument(null != dataSourceMap &&
!dataSourceMap.isEmpty(), "Data sources of cannot be empty.");
- Preconditions.checkNotNull(databaseType, "Database type cannot be
null.");
- config.getDiscoveryTypes().forEach((key, value) ->
discoveryTypes.put(key, ShardingSphereAlgorithmFactory.createAlgorithm(value,
DatabaseDiscoveryType.class)));
- dataSourceRules = new HashMap<>(config.getDataSources().size(), 1);
- for (DatabaseDiscoveryDataSourceRuleConfiguration each :
config.getDataSources()) {
- Preconditions.checkNotNull(each.getDiscoveryTypeName(), "Discovery
type cannot be null of rule name `%s`.", each.getName());
-
Preconditions.checkArgument(discoveryTypes.containsKey(each.getDiscoveryTypeName()),
"Can not find discovery type of rule name `%s`.", each.getName());
- dataSourceRules.put(each.getName(), new
DatabaseDiscoveryDataSourceRule(each,
discoveryTypes.get(each.getDiscoveryTypeName())));
- }
- for (Entry<String, DatabaseDiscoveryDataSourceRule> entry :
dataSourceRules.entrySet()) {
- String groupName = entry.getKey();
- DatabaseDiscoveryDataSourceRule dbDiscoveryDataSourceRule =
entry.getValue();
- DatabaseDiscoveryType databaseDiscoveryType =
dbDiscoveryDataSourceRule.getDatabaseDiscoveryType();
- Map<String, DataSource> originalDataSourceMap = new
HashMap<>(dataSourceMap);
- Collection<String> disabledDataSourceNames =
dbDiscoveryDataSourceRule.getDisabledDataSourceNames();
- String primaryDataSourceName =
dbDiscoveryDataSourceRule.getPrimaryDataSourceName();
-
databaseDiscoveryType.updatePrimaryDataSource(originalDataSourceMap,
schemaName, disabledDataSourceNames, groupName, primaryDataSourceName);
-
dbDiscoveryDataSourceRule.updatePrimaryDataSourceName(databaseDiscoveryType.getPrimaryDataSource());
- databaseDiscoveryType.updateMemberState(originalDataSourceMap,
schemaName, disabledDataSourceNames);
- try {
-
databaseDiscoveryType.checkDatabaseDiscoveryConfig(dataSourceMap, schemaName);
-
databaseDiscoveryType.startPeriodicalUpdate(originalDataSourceMap, schemaName,
disabledDataSourceNames, groupName, primaryDataSourceName);
- } catch (final SQLException ex) {
- throw new ShardingSphereException(ex);
- }
- }
+ public DatabaseDiscoveryRule(final DatabaseDiscoveryRuleConfiguration
config, final String schemaName, final DatabaseType databaseType, final
Map<String, DataSource> dataSourceMap) {
+ checkDataSourcesArguments(config.getDataSources(), databaseType,
dataSourceMap);
+ discoveryTypes = getDiscoveryTypes(config.getDiscoveryTypes());
+ dataSourceRules = getDataSourceRules(config.getDataSources());
+ startMonitor(schemaName, dataSourceMap);
+ initAware();
+ }
+
+ public DatabaseDiscoveryRule(final
AlgorithmProvidedDatabaseDiscoveryRuleConfiguration config,
+ final String schemaName, final DatabaseType
databaseType, final Map<String, DataSource> dataSourceMap) {
+ checkDataSourcesArguments(config.getDataSources(), databaseType,
dataSourceMap);
+ discoveryTypes = config.getDiscoveryTypes();
+ dataSourceRules = getDataSourceRules(config.getDataSources());
+ startMonitor(schemaName, dataSourceMap);
initAware();
}
- public DatabaseDiscoveryRule(final
AlgorithmProvidedDatabaseDiscoveryRuleConfiguration config, final DatabaseType
databaseType,
- final Map<String, DataSource> dataSourceMap,
final String schemaName) {
- Preconditions.checkArgument(!config.getDataSources().isEmpty(), "HA
data source rules can not be empty.");
+ private void checkDataSourcesArguments(final
Collection<DatabaseDiscoveryDataSourceRuleConfiguration> dataSources, final
DatabaseType databaseType, final Map<String, DataSource> dataSourceMap) {
+ Preconditions.checkArgument(!dataSources.isEmpty(), "Database
discovery rules can not be empty.");
Preconditions.checkArgument(null != dataSourceMap &&
!dataSourceMap.isEmpty(), "Data sources cannot be empty.");
- Preconditions.checkArgument(null != databaseType, "Database type
cannot be null.");
- dataSourceRules = new HashMap<>(config.getDataSources().size(), 1);
- for (DatabaseDiscoveryDataSourceRuleConfiguration each :
config.getDataSources()) {
- Preconditions.checkNotNull(each.getDiscoveryTypeName(), "Discovery
type cannot be null of rule name `%s`.", each.getName());
-
Preconditions.checkArgument(discoveryTypes.containsKey(each.getDiscoveryTypeName()),
"Can not find discovery type of rule name `%s`.", each.getName());
- dataSourceRules.put(each.getName(), new
DatabaseDiscoveryDataSourceRule(each,
discoveryTypes.get(each.getDiscoveryTypeName())));
+ Preconditions.checkNotNull(databaseType, "Database type cannot be
null.");
+ }
+
+ private Map<String, DatabaseDiscoveryType> getDiscoveryTypes(final
Map<String, ShardingSphereAlgorithmConfiguration> discoveryTypesConfig) {
+ Map<String, DatabaseDiscoveryType> result = new LinkedHashMap<>();
+ for (Entry<String, ShardingSphereAlgorithmConfiguration> entry :
discoveryTypesConfig.entrySet()) {
+ result.put(entry.getKey(),
ShardingSphereAlgorithmFactory.createAlgorithm(entry.getValue(),
DatabaseDiscoveryType.class));
}
+ return result;
+ }
+
+ private Map<String, DatabaseDiscoveryDataSourceRule>
getDataSourceRules(final
Collection<DatabaseDiscoveryDataSourceRuleConfiguration> dataSources) {
+ Map<String, DatabaseDiscoveryDataSourceRule> result = new
HashMap<>(dataSources.size(), 1);
+ for (DatabaseDiscoveryDataSourceRuleConfiguration each : dataSources) {
+ checkDatabaseDiscoveryDataSourceRuleConfigurationArguments(each);
+ result.put(each.getName(), new
DatabaseDiscoveryDataSourceRule(each,
discoveryTypes.get(each.getDiscoveryTypeName())));
+ }
+ return result;
+ }
+
+ private void
checkDatabaseDiscoveryDataSourceRuleConfigurationArguments(final
DatabaseDiscoveryDataSourceRuleConfiguration dataSourceRuleConfig) {
+
Preconditions.checkNotNull(dataSourceRuleConfig.getDiscoveryTypeName(),
"Discovery type cannot be null of rule name `%s`.",
dataSourceRuleConfig.getName());
+
Preconditions.checkArgument(discoveryTypes.containsKey(dataSourceRuleConfig.getDiscoveryTypeName()),
"Can not find discovery type of rule name `%s`.",
dataSourceRuleConfig.getName());
+ }
+
+ private void startMonitor(final String schemaName, final Map<String,
DataSource> dataSourceMap) {
for (Entry<String, DatabaseDiscoveryDataSourceRule> entry :
dataSourceRules.entrySet()) {
String groupName = entry.getKey();
DatabaseDiscoveryDataSourceRule dbDiscoveryDataSourceRule =
entry.getValue();
@@ -119,7 +124,6 @@ public final class DatabaseDiscoveryRule implements
SchemaRule, DataSourceContai
throw new ShardingSphereException(ex);
}
}
- initAware();
}
private void initAware() {
@@ -127,18 +131,9 @@ public final class DatabaseDiscoveryRule implements
SchemaRule, DataSourceContai
}
/**
- * Get all logic data source names.
- *
- * @return all logic data source names
- */
- public Collection<String> getAllLogicDataSourceNames() {
- return dataSourceRules.keySet();
- }
-
- /**
* Get single data source rule.
*
- * @return HA data source rule
+ * @return data source rule
*/
public DatabaseDiscoveryDataSourceRule getSingleDataSourceRule() {
return dataSourceRules.values().iterator().next();
@@ -148,7 +143,7 @@ public final class DatabaseDiscoveryRule implements
SchemaRule, DataSourceContai
* Find data source rule.
*
* @param dataSourceName data source name
- * @return HA data source rule
+ * @return found data source rule
*/
public Optional<DatabaseDiscoveryDataSourceRule> findDataSourceRule(final
String dataSourceName) {
return Optional.ofNullable(dataSourceRules.get(dataSourceName));
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/builder/AlgorithmProvidedDatabaseDiscoveryRuleBuilder.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/builder/AlgorithmProvidedDatabaseDiscoveryRuleBuilder.java
index f673bbf..85b6d3d 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/builder/AlgorithmProvidedDatabaseDiscoveryRuleBuilder.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/builder/AlgorithmProvidedDatabaseDiscoveryRuleBuilder.java
@@ -34,7 +34,7 @@ public final class
AlgorithmProvidedDatabaseDiscoveryRuleBuilder implements Sche
@Override
public DatabaseDiscoveryRule build(final SchemaRulesBuilderMaterials
materials, final AlgorithmProvidedDatabaseDiscoveryRuleConfiguration config,
final Collection<ShardingSphereRule>
rules) {
- return new DatabaseDiscoveryRule(config, materials.getDatabaseType(),
materials.getDataSourceMap(), materials.getSchemaName());
+ return new DatabaseDiscoveryRule(config, materials.getSchemaName(),
materials.getDatabaseType(), materials.getDataSourceMap());
}
@Override
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/builder/DatabaseDiscoveryRuleBuilder.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/builder/DatabaseDiscoveryRuleBuilder.java
index dbf1928..f3da959 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/builder/DatabaseDiscoveryRuleBuilder.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/builder/DatabaseDiscoveryRuleBuilder.java
@@ -43,7 +43,7 @@ public final class DatabaseDiscoveryRuleBuilder implements
SchemaRuleBuilder<Dat
realDataSourceMap.put(datasourceName,
materials.getDataSourceMap().get(datasourceName));
}
}
- return new DatabaseDiscoveryRule(config, materials.getDatabaseType(),
realDataSourceMap, materials.getSchemaName());
+ return new DatabaseDiscoveryRule(config, materials.getSchemaName(),
materials.getDatabaseType(), realDataSourceMap);
}
@Override
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/route/DatabaseDiscoverySQLRouterTest.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/route/DatabaseDiscoverySQLRouterTest.java
index ec69fc8..1d8a48b 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/route/DatabaseDiscoverySQLRouterTest.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/route/DatabaseDiscoverySQLRouterTest.java
@@ -78,7 +78,7 @@ public final class DatabaseDiscoverySQLRouterTest {
= new
DatabaseDiscoveryDataSourceRuleConfiguration(DATA_SOURCE_NAME,
Collections.singletonList(PRIMARY_DATA_SOURCE), "TEST");
ShardingSphereAlgorithmConfiguration algorithmConfig = new
ShardingSphereAlgorithmConfiguration("TEST", new Properties());
DatabaseDiscoveryRuleConfiguration config = new
DatabaseDiscoveryRuleConfiguration(Collections.singleton(dataSourceConfig),
Collections.singletonMap("TEST", algorithmConfig));
- rule = new DatabaseDiscoveryRule(config, mock(DatabaseType.class),
Collections.singletonMap("ds", mock(DataSource.class)), "TEST");
+ rule = new DatabaseDiscoveryRule(config, "TEST",
mock(DatabaseType.class), Collections.singletonMap("ds",
mock(DataSource.class)));
sqlRouter = (DatabaseDiscoverySQLRouter)
OrderedSPIRegistry.getRegisteredServices(SQLRouter.class,
Collections.singleton(rule)).get(rule);
}
diff --git
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRuleTest.java
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRuleTest.java
index 9d72fb3..6d64d27 100644
---
a/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRuleTest.java
+++
b/shardingsphere-features/shardingsphere-db-discovery/shardingsphere-db-discovery-core/src/test/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRuleTest.java
@@ -44,7 +44,7 @@ public final class DatabaseDiscoveryRuleTest {
@Test(expected = IllegalArgumentException.class)
public void assertNewWithEmptyDataSourceRule() {
- new DatabaseDiscoveryRule(new
DatabaseDiscoveryRuleConfiguration(Collections.emptyList(),
Collections.emptyMap()), mock(DatabaseType.class), dataSourceMap, "ha_db");
+ new DatabaseDiscoveryRule(new
DatabaseDiscoveryRuleConfiguration(Collections.emptyList(),
Collections.emptyMap()), "ha_db", mock(DatabaseType.class), dataSourceMap);
}
@Test
@@ -98,7 +98,6 @@ public final class DatabaseDiscoveryRuleTest {
private DatabaseDiscoveryRule createRule() {
DatabaseDiscoveryDataSourceRuleConfiguration config = new
DatabaseDiscoveryDataSourceRuleConfiguration("test_pr", Arrays.asList("ds_0",
"ds_1"), "TEST");
return new DatabaseDiscoveryRule(new
DatabaseDiscoveryRuleConfiguration(
- Collections.singleton(config), ImmutableMap.of("TEST", new
ShardingSphereAlgorithmConfiguration("TEST", new Properties()))),
- mock(DatabaseType.class), dataSourceMap, "ha_db");
+ Collections.singleton(config), ImmutableMap.of("TEST", new
ShardingSphereAlgorithmConfiguration("TEST", new Properties()))), "ha_db",
mock(DatabaseType.class), dataSourceMap);
}
}