This is an automated email from the ASF dual-hosted git repository.
wuweijie 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 71de1b256cc Add StaticDataSourceRule (#30376)
71de1b256cc is described below
commit 71de1b256cc9ed72415bab3d0e39f9483c598d2f
Author: Liang Zhang <[email protected]>
AuthorDate: Sun Mar 3 00:13:27 2024 +0800
Add StaticDataSourceRule (#30376)
* Refactor ReadwriteSplittingDataSourceMapperRuleTest
* Add StaticDataSourceRule
---
.../rule/ReadwriteSplittingRule.java | 60 ++--------------
.../ReadwriteSplittingStaticDataSourceRule.java | 84 ++++++++++++++++++++++
.../rule/ReadwriteSplittingRuleTest.java | 8 +--
.../update/DropReadwriteSplittingRuleExecutor.java | 5 +-
.../infra/metadata/ShardingSphereMetaData.java | 4 +-
.../StaticDataSourceContainedRule.java | 33 ++-------
.../StaticDataSourceRule.java} | 7 +-
.../database/type/DropDatabaseRuleOperator.java | 6 +-
.../subscriber/ConfigurationChangedSubscriber.java | 6 +-
.../subscriber/NewStateChangedSubscriber.java | 4 +-
.../subscriber/StateChangedSubscriber.java | 4 +-
.../subscriber/StateChangedSubscriberTest.java | 7 +-
12 files changed, 121 insertions(+), 107 deletions(-)
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 bf4d48536bd..1b4647881d2 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
@@ -17,38 +17,30 @@
package org.apache.shardingsphere.readwritesplitting.rule;
-import com.google.common.base.Preconditions;
import lombok.Getter;
import
org.apache.shardingsphere.infra.algorithm.core.config.AlgorithmConfiguration;
import
org.apache.shardingsphere.infra.algorithm.load.balancer.core.LoadBalanceAlgorithm;
import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePreconditions;
import org.apache.shardingsphere.infra.expr.core.InlineExpressionParserFactory;
import org.apache.shardingsphere.infra.instance.InstanceContext;
-import
org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDatabase;
-import org.apache.shardingsphere.infra.rule.event.DataSourceStatusChangedEvent;
import org.apache.shardingsphere.infra.rule.identifier.scope.DatabaseRule;
-import
org.apache.shardingsphere.infra.rule.identifier.type.StaticDataSourceContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.StorageConnectorReusableRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.DataSourceMapperContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.DataSourceMapperRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.StaticDataSourceContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.exportable.ExportableRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.exportable.constant.ExportableConstants;
import
org.apache.shardingsphere.infra.rule.identifier.type.exportable.constant.ExportableItemConstants;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
-import org.apache.shardingsphere.infra.state.datasource.DataSourceState;
-import
org.apache.shardingsphere.mode.event.storage.StorageNodeDataSourceChangedEvent;
-import
org.apache.shardingsphere.mode.event.storage.StorageNodeDataSourceDeletedEvent;
import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.exception.rule.InvalidInlineExpressionDataSourceNameException;
import
org.apache.shardingsphere.readwritesplitting.group.type.StaticReadwriteSplittingGroup;
-import java.util.Collection;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
-import java.util.Map.Entry;
import java.util.Optional;
import java.util.stream.Collectors;
@@ -57,8 +49,6 @@ import java.util.stream.Collectors;
*/
public final class ReadwriteSplittingRule implements DatabaseRule,
DataSourceMapperContainedRule, StaticDataSourceContainedRule, ExportableRule,
StorageConnectorReusableRule {
- private final String databaseName;
-
@Getter
private final ReadwriteSplittingRuleConfiguration configuration;
@@ -67,18 +57,18 @@ public final class ReadwriteSplittingRule implements
DatabaseRule, DataSourceMap
@Getter
private final Map<String, ReadwriteSplittingDataSourceRule>
dataSourceRules;
- private final InstanceContext instanceContext;
-
@Getter
private final DataSourceMapperRule dataSourceMapperRule;
+ @Getter
+ private final ReadwriteSplittingStaticDataSourceRule staticDataSourceRule;
+
public ReadwriteSplittingRule(final String databaseName, final
ReadwriteSplittingRuleConfiguration ruleConfig, final InstanceContext
instanceContext) {
- this.databaseName = databaseName;
configuration = ruleConfig;
- this.instanceContext = instanceContext;
loadBalancers = createLoadBalancers(ruleConfig);
dataSourceRules = createDataSourceRules(ruleConfig);
dataSourceMapperRule = new
ReadwriteSplittingDataSourceMapperRule(dataSourceRules.values());
+ staticDataSourceRule = new
ReadwriteSplittingStaticDataSourceRule(databaseName, dataSourceRules,
instanceContext);
}
private Map<String, LoadBalanceAlgorithm> createLoadBalancers(final
ReadwriteSplittingRuleConfiguration ruleConfig) {
@@ -151,46 +141,6 @@ public final class ReadwriteSplittingRule implements
DatabaseRule, DataSourceMap
return Optional.ofNullable(dataSourceRules.get(dataSourceName));
}
- @Override
- public Map<String, Collection<String>> getDataSourceMapper() {
- Map<String, Collection<String>> result = new HashMap<>();
- for (Entry<String, ReadwriteSplittingDataSourceRule> entry :
dataSourceRules.entrySet()) {
- result.put(entry.getValue().getName(),
entry.getValue().getReadwriteSplittingGroup().getAllDataSources());
- }
- return result;
- }
-
- @Override
- public void updateStatus(final DataSourceStatusChangedEvent event) {
- StorageNodeDataSourceChangedEvent dataSourceEvent =
(StorageNodeDataSourceChangedEvent) event;
- QualifiedDatabase qualifiedDatabase =
dataSourceEvent.getQualifiedDatabase();
- ReadwriteSplittingDataSourceRule dataSourceRule =
dataSourceRules.get(qualifiedDatabase.getGroupName());
- Preconditions.checkNotNull(dataSourceRule, "Can not find
readwrite-splitting data source rule in database `%s`",
qualifiedDatabase.getDatabaseName());
- if (DataSourceState.DISABLED ==
dataSourceEvent.getDataSource().getStatus()) {
-
dataSourceRule.disableDataSource(dataSourceEvent.getQualifiedDatabase().getDataSourceName());
- } else {
-
dataSourceRule.enableDataSource(dataSourceEvent.getQualifiedDatabase().getDataSourceName());
- }
- }
-
- @Override
- public void cleanStorageNodeDataSource(final String groupName) {
- Preconditions.checkNotNull(dataSourceRules.get(groupName),
String.format("`%s` group name not exist in database `%s`", groupName,
databaseName));
- deleteStorageNodeDataSources(dataSourceRules.get(groupName));
- }
-
- private void deleteStorageNodeDataSources(final
ReadwriteSplittingDataSourceRule rule) {
- rule.getReadwriteSplittingGroup().getReadDataSources()
- .forEach(each -> instanceContext.getEventBusContext().post(new
StorageNodeDataSourceDeletedEvent(new QualifiedDatabase(databaseName,
rule.getName(), each))));
- }
-
- @Override
- public void cleanStorageNodeDataSources() {
- for (Entry<String, ReadwriteSplittingDataSourceRule> entry :
dataSourceRules.entrySet()) {
- deleteStorageNodeDataSources(entry.getValue());
- }
- }
-
@Override
public Map<String, Object> getExportData() {
Map<String, Object> result = new HashMap<>(2, 1F);
diff --git
a/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingStaticDataSourceRule.java
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingStaticDataSourceRule.java
new file mode 100644
index 00000000000..02c452f8e1e
--- /dev/null
+++
b/features/readwrite-splitting/core/src/main/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingStaticDataSourceRule.java
@@ -0,0 +1,84 @@
+/*
+ * 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.rule;
+
+import com.google.common.base.Preconditions;
+import lombok.RequiredArgsConstructor;
+import org.apache.shardingsphere.infra.instance.InstanceContext;
+import
org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDatabase;
+import org.apache.shardingsphere.infra.rule.event.DataSourceStatusChangedEvent;
+import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.StaticDataSourceRule;
+import org.apache.shardingsphere.infra.state.datasource.DataSourceState;
+import
org.apache.shardingsphere.mode.event.storage.StorageNodeDataSourceChangedEvent;
+import
org.apache.shardingsphere.mode.event.storage.StorageNodeDataSourceDeletedEvent;
+
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+@RequiredArgsConstructor
+public final class ReadwriteSplittingStaticDataSourceRule implements
StaticDataSourceRule {
+
+ private final String databaseName;
+
+ private final Map<String, ReadwriteSplittingDataSourceRule>
dataSourceRules;
+
+ private final InstanceContext instanceContext;
+
+ @Override
+ public Map<String, Collection<String>> getDataSourceMapper() {
+ Map<String, Collection<String>> result = new HashMap<>();
+ for (Entry<String, ReadwriteSplittingDataSourceRule> entry :
dataSourceRules.entrySet()) {
+ result.put(entry.getValue().getName(),
entry.getValue().getReadwriteSplittingGroup().getAllDataSources());
+ }
+ return result;
+ }
+
+ @Override
+ public void updateStatus(final DataSourceStatusChangedEvent event) {
+ StorageNodeDataSourceChangedEvent dataSourceEvent =
(StorageNodeDataSourceChangedEvent) event;
+ QualifiedDatabase qualifiedDatabase =
dataSourceEvent.getQualifiedDatabase();
+ ReadwriteSplittingDataSourceRule dataSourceRule =
dataSourceRules.get(qualifiedDatabase.getGroupName());
+ Preconditions.checkNotNull(dataSourceRule, "Can not find
readwrite-splitting data source rule in database `%s`",
qualifiedDatabase.getDatabaseName());
+ if (DataSourceState.DISABLED ==
dataSourceEvent.getDataSource().getStatus()) {
+
dataSourceRule.disableDataSource(dataSourceEvent.getQualifiedDatabase().getDataSourceName());
+ } else {
+
dataSourceRule.enableDataSource(dataSourceEvent.getQualifiedDatabase().getDataSourceName());
+ }
+ }
+
+ @Override
+ public void cleanStorageNodeDataSource(final String groupName) {
+ Preconditions.checkNotNull(dataSourceRules.get(groupName),
String.format("`%s` group name not exist in database `%s`", groupName,
databaseName));
+ deleteStorageNodeDataSources(dataSourceRules.get(groupName));
+ }
+
+ private void deleteStorageNodeDataSources(final
ReadwriteSplittingDataSourceRule rule) {
+ rule.getReadwriteSplittingGroup().getReadDataSources()
+ .forEach(each -> instanceContext.getEventBusContext().post(new
StorageNodeDataSourceDeletedEvent(new QualifiedDatabase(databaseName,
rule.getName(), each))));
+ }
+
+ @Override
+ public void cleanStorageNodeDataSources() {
+ for (Entry<String, ReadwriteSplittingDataSourceRule> entry :
dataSourceRules.entrySet()) {
+ deleteStorageNodeDataSources(entry.getValue());
+ }
+ }
+
+}
diff --git
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
index 5b9bed5209e..1772c42d832 100644
---
a/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
+++
b/features/readwrite-splitting/core/src/test/java/org/apache/shardingsphere/readwritesplitting/rule/ReadwriteSplittingRuleTest.java
@@ -69,7 +69,7 @@ class ReadwriteSplittingRuleTest {
@Test
void assertUpdateRuleStatusWithNotExistDataSource() {
ReadwriteSplittingRule readwriteSplittingRule =
createReadwriteSplittingRule();
- readwriteSplittingRule.updateStatus(new
StorageNodeDataSourceChangedEvent(new
QualifiedDatabase("readwrite_splitting_db.readwrite.read_ds"),
+ readwriteSplittingRule.getStaticDataSourceRule().updateStatus(new
StorageNodeDataSourceChangedEvent(new
QualifiedDatabase("readwrite_splitting_db.readwrite.read_ds"),
new StorageNodeDataSource(StorageNodeRole.MEMBER,
DataSourceState.DISABLED)));
assertThat(readwriteSplittingRule.getSingleDataSourceRule().getDisabledDataSourceNames(),
is(Collections.singleton("read_ds")));
}
@@ -77,7 +77,7 @@ class ReadwriteSplittingRuleTest {
@Test
void assertUpdateRuleStatus() {
ReadwriteSplittingRule readwriteSplittingRule =
createReadwriteSplittingRule();
- readwriteSplittingRule.updateStatus(new
StorageNodeDataSourceChangedEvent(new
QualifiedDatabase("readwrite_splitting_db.readwrite.read_ds_0"),
+ readwriteSplittingRule.getStaticDataSourceRule().updateStatus(new
StorageNodeDataSourceChangedEvent(new
QualifiedDatabase("readwrite_splitting_db.readwrite.read_ds_0"),
new StorageNodeDataSource(StorageNodeRole.MEMBER,
DataSourceState.DISABLED)));
assertThat(readwriteSplittingRule.getSingleDataSourceRule().getDisabledDataSourceNames(),
is(Collections.singleton("read_ds_0")));
}
@@ -85,10 +85,10 @@ class ReadwriteSplittingRuleTest {
@Test
void assertUpdateRuleStatusWithEnable() {
ReadwriteSplittingRule readwriteSplittingRule =
createReadwriteSplittingRule();
- readwriteSplittingRule.updateStatus(new
StorageNodeDataSourceChangedEvent(new
QualifiedDatabase("readwrite_splitting_db.readwrite.read_ds_0"),
+ readwriteSplittingRule.getStaticDataSourceRule().updateStatus(new
StorageNodeDataSourceChangedEvent(new
QualifiedDatabase("readwrite_splitting_db.readwrite.read_ds_0"),
new StorageNodeDataSource(StorageNodeRole.MEMBER,
DataSourceState.DISABLED)));
assertThat(readwriteSplittingRule.getSingleDataSourceRule().getDisabledDataSourceNames(),
is(Collections.singleton("read_ds_0")));
- readwriteSplittingRule.updateStatus(new
StorageNodeDataSourceChangedEvent(new
QualifiedDatabase("readwrite_splitting_db.readwrite.read_ds_0"),
+ readwriteSplittingRule.getStaticDataSourceRule().updateStatus(new
StorageNodeDataSourceChangedEvent(new
QualifiedDatabase("readwrite_splitting_db.readwrite.read_ds_0"),
new StorageNodeDataSource(StorageNodeRole.MEMBER,
DataSourceState.ENABLED)));
assertThat(readwriteSplittingRule.getSingleDataSourceRule().getDisabledDataSourceNames(),
is(Collections.emptySet()));
}
diff --git
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleExecutor.java
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleExecutor.java
index 2bc4db16915..c4f4d67004a 100644
---
a/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleExecutor.java
+++
b/features/readwrite-splitting/distsql/handler/src/main/java/org/apache/shardingsphere/readwritesplitting/distsql/handler/update/DropReadwriteSplittingRuleExecutor.java
@@ -28,7 +28,7 @@ import
org.apache.shardingsphere.infra.exception.core.ShardingSpherePrecondition
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.rule.identifier.type.datanode.DataNodeContainedRule;
import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.DataSourceMapperContainedRule;
-import
org.apache.shardingsphere.infra.rule.identifier.type.StaticDataSourceContainedRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.StaticDataSourceContainedRule;
import
org.apache.shardingsphere.readwritesplitting.api.ReadwriteSplittingRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.api.rule.ReadwriteSplittingDataSourceRuleConfiguration;
import
org.apache.shardingsphere.readwritesplitting.distsql.statement.DropReadwriteSplittingRuleStatement;
@@ -139,7 +139,8 @@ public final class DropReadwriteSplittingRuleExecutor
implements DatabaseRuleDro
@Override
public void operate(final DropReadwriteSplittingRuleStatement
sqlStatement, final ShardingSphereDatabase database) {
-
database.getRuleMetaData().findSingleRule(StaticDataSourceContainedRule.class).ifPresent(optional
-> sqlStatement.getNames().forEach(optional::cleanStorageNodeDataSource));
+
database.getRuleMetaData().findSingleRule(StaticDataSourceContainedRule.class)
+ .ifPresent(optional ->
sqlStatement.getNames().forEach(groupName ->
optional.getStaticDataSourceRule().cleanStorageNodeDataSource(groupName)));
}
@Override
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
index 486573a373e..d4dba5b2622 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
@@ -26,7 +26,7 @@ import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import org.apache.shardingsphere.infra.metadata.database.rule.RuleMetaData;
import org.apache.shardingsphere.infra.rule.identifier.type.ResourceHeldRule;
-import
org.apache.shardingsphere.infra.rule.identifier.type.StaticDataSourceContainedRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.StaticDataSourceContainedRule;
import java.util.Collections;
import java.util.HashMap;
@@ -111,7 +111,7 @@ public final class ShardingSphereMetaData {
String databaseName = database.getName();
globalRuleMetaData.findRules(ResourceHeldRule.class).forEach(each ->
each.closeStaleResource(databaseName));
database.getRuleMetaData().findRules(ResourceHeldRule.class).forEach(each ->
each.closeStaleResource(databaseName));
-
database.getRuleMetaData().findRules(StaticDataSourceContainedRule.class).forEach(StaticDataSourceContainedRule::cleanStorageNodeDataSources);
+
database.getRuleMetaData().findRules(StaticDataSourceContainedRule.class).forEach(each
-> each.getStaticDataSourceRule().cleanStorageNodeDataSources());
Optional.ofNullable(database.getResourceMetaData())
.ifPresent(optional ->
optional.getStorageUnits().values().forEach(each -> new
DataSourcePoolDestroyer(each.getDataSource()).asyncDestroy()));
}
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/StaticDataSourceContainedRule.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/datasource/StaticDataSourceContainedRule.java
similarity index 56%
copy from
infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/StaticDataSourceContainedRule.java
copy to
infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/datasource/StaticDataSourceContainedRule.java
index 53111980ffd..57af24978a9 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/StaticDataSourceContainedRule.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/datasource/StaticDataSourceContainedRule.java
@@ -15,13 +15,9 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.infra.rule.identifier.type;
+package org.apache.shardingsphere.infra.rule.identifier.type.datasource;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.infra.rule.event.DataSourceStatusChangedEvent;
-
-import java.util.Collection;
-import java.util.Map;
/**
* Static data source contained rule.
@@ -29,28 +25,9 @@ import java.util.Map;
public interface StaticDataSourceContainedRule extends ShardingSphereRule {
/**
- * Get data source mapper.
- *
- * @return data source mapper
- */
- Map<String, Collection<String>> getDataSourceMapper();
-
- /**
- * Update data source status.
- *
- * @param event data source status changed event
- */
- void updateStatus(DataSourceStatusChangedEvent event);
-
- /**
- * Clean single storage node data source.
- *
- * @param groupName group name
- */
- void cleanStorageNodeDataSource(String groupName);
-
- /**
- * Clean storage nodes data sources.
+ * Get static data source rule.
+ *
+ * @return static data source rule
*/
- void cleanStorageNodeDataSources();
+ StaticDataSourceRule getStaticDataSourceRule();
}
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/StaticDataSourceContainedRule.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/datasource/StaticDataSourceRule.java
similarity index 86%
rename from
infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/StaticDataSourceContainedRule.java
rename to
infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/datasource/StaticDataSourceRule.java
index 53111980ffd..8712ab4b8bc 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/StaticDataSourceContainedRule.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/datasource/StaticDataSourceRule.java
@@ -15,18 +15,17 @@
* limitations under the License.
*/
-package org.apache.shardingsphere.infra.rule.identifier.type;
+package org.apache.shardingsphere.infra.rule.identifier.type.datasource;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
import org.apache.shardingsphere.infra.rule.event.DataSourceStatusChangedEvent;
import java.util.Collection;
import java.util.Map;
/**
- * Static data source contained rule.
+ * Static data source rule.
*/
-public interface StaticDataSourceContainedRule extends ShardingSphereRule {
+public interface StaticDataSourceRule {
/**
* Get data source mapper.
diff --git
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java
index 6792265b4eb..325ec24c6cc 100644
---
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java
+++
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/DropDatabaseRuleOperator.java
@@ -27,7 +27,7 @@ import
org.apache.shardingsphere.infra.config.rule.scope.DatabaseRuleConfigurati
import org.apache.shardingsphere.infra.instance.mode.ModeContextManager;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
-import
org.apache.shardingsphere.infra.rule.identifier.type.StaticDataSourceContainedRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.StaticDataSourceContainedRule;
import
org.apache.shardingsphere.infra.yaml.config.swapper.rule.NewYamlRuleConfigurationSwapperEngine;
import org.apache.shardingsphere.mode.manager.ContextManager;
@@ -54,8 +54,10 @@ public final class DropDatabaseRuleOperator implements
DatabaseRuleOperator {
ModeContextManager modeContextManager =
contextManager.getInstanceContext().getModeContextManager();
RuleConfiguration toBeDroppedRuleConfig =
executor.buildToBeDroppedRuleConfiguration(sqlStatement);
if (sqlStatement instanceof
StaticDataSourceContainedRuleAwareStatement) {
+
database.getRuleMetaData().findSingleRule(StaticDataSourceContainedRule.class)
- .ifPresent(optional ->
((StaticDataSourceContainedRuleAwareStatement)
sqlStatement).getNames().forEach(optional::cleanStorageNodeDataSource));
+ .ifPresent(optional ->
((StaticDataSourceContainedRuleAwareStatement) sqlStatement).getNames()
+ .forEach(groupName ->
optional.getStaticDataSourceRule().cleanStorageNodeDataSource(groupName)));
// TODO refactor to new metadata refresh way
}
modeContextManager.removeRuleConfigurationItem(database.getName(),
toBeDroppedRuleConfig);
diff --git
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ConfigurationChangedSubscriber.java
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ConfigurationChangedSubscriber.java
index caef7f1760f..83e8110b182 100644
---
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ConfigurationChangedSubscriber.java
+++
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/ConfigurationChangedSubscriber.java
@@ -21,7 +21,7 @@ import com.google.common.eventbus.Subscribe;
import org.apache.shardingsphere.infra.state.datasource.DataSourceState;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDatabase;
-import
org.apache.shardingsphere.infra.rule.identifier.type.StaticDataSourceContainedRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.StaticDataSourceContainedRule;
import org.apache.shardingsphere.mode.manager.ContextManager;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.RegistryCenter;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.datasource.DataSourceUnitsChangedEvent;
@@ -113,11 +113,11 @@ public final class ConfigurationChangedSubscriber {
}
private void disableDataSources(final StorageNodeDataSource
storageNodeDataSource, final StaticDataSourceContainedRule rule, final
QualifiedDatabase database) {
- for (Entry<String, Collection<String>> entry :
rule.getDataSourceMapper().entrySet()) {
+ for (Entry<String, Collection<String>> entry :
rule.getStaticDataSourceRule().getDataSourceMapper().entrySet()) {
if (!database.getGroupName().equals(entry.getKey())) {
continue;
}
- entry.getValue().forEach(each -> rule.updateStatus(new
StorageNodeDataSourceChangedEvent(database, storageNodeDataSource)));
+ entry.getValue().forEach(each ->
rule.getStaticDataSourceRule().updateStatus(new
StorageNodeDataSourceChangedEvent(database, storageNodeDataSource)));
}
}
diff --git
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewStateChangedSubscriber.java
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewStateChangedSubscriber.java
index 642a095982f..c351d292817 100644
---
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewStateChangedSubscriber.java
+++
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewStateChangedSubscriber.java
@@ -22,7 +22,7 @@ import
org.apache.shardingsphere.infra.state.datasource.DataSourceState;
import org.apache.shardingsphere.infra.state.datasource.DataSourceStateManager;
import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
import
org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDatabase;
-import
org.apache.shardingsphere.infra.rule.identifier.type.StaticDataSourceContainedRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.StaticDataSourceContainedRule;
import
org.apache.shardingsphere.mode.event.storage.StorageNodeDataSourceChangedEvent;
import org.apache.shardingsphere.mode.manager.ContextManager;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.NewRegistryCenter;
@@ -68,7 +68,7 @@ public final class NewStateChangedSubscriber {
QualifiedDatabase qualifiedDatabase = event.getQualifiedDatabase();
Optional<StaticDataSourceContainedRule> staticDataSourceRule =
contextManager.getMetaDataContexts()
.getMetaData().getDatabase(qualifiedDatabase.getDatabaseName()).getRuleMetaData().findSingleRule(StaticDataSourceContainedRule.class);
- staticDataSourceRule.ifPresent(optional -> optional.updateStatus(new
StorageNodeDataSourceChangedEvent(qualifiedDatabase, event.getDataSource())));
+ staticDataSourceRule.ifPresent(optional ->
optional.getStaticDataSourceRule().updateStatus(new
StorageNodeDataSourceChangedEvent(qualifiedDatabase, event.getDataSource())));
DataSourceStateManager.getInstance().updateState(
qualifiedDatabase.getDatabaseName(),
qualifiedDatabase.getDataSourceName(),
DataSourceState.valueOf(event.getDataSource().getStatus().name()));
}
diff --git
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriber.java
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriber.java
index 4ed4e6b971f..fe839988ec7 100644
---
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriber.java
+++
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriber.java
@@ -22,7 +22,7 @@ import
org.apache.shardingsphere.infra.state.datasource.DataSourceState;
import org.apache.shardingsphere.infra.state.datasource.DataSourceStateManager;
import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
import
org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDatabase;
-import
org.apache.shardingsphere.infra.rule.identifier.type.StaticDataSourceContainedRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.StaticDataSourceContainedRule;
import org.apache.shardingsphere.mode.manager.ContextManager;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.RegistryCenter;
import
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.status.cluster.event.ClusterLockDeletedEvent;
@@ -66,7 +66,7 @@ public final class StateChangedSubscriber {
QualifiedDatabase qualifiedDatabase = event.getQualifiedDatabase();
Optional<StaticDataSourceContainedRule> staticDataSourceRule =
contextManager.getMetaDataContexts()
.getMetaData().getDatabase(qualifiedDatabase.getDatabaseName()).getRuleMetaData().findSingleRule(StaticDataSourceContainedRule.class);
- staticDataSourceRule.ifPresent(optional -> optional.updateStatus(new
StorageNodeDataSourceChangedEvent(qualifiedDatabase, event.getDataSource())));
+ staticDataSourceRule.ifPresent(optional ->
optional.getStaticDataSourceRule().updateStatus(new
StorageNodeDataSourceChangedEvent(qualifiedDatabase, event.getDataSource())));
DataSourceStateManager.getInstance().updateState(
qualifiedDatabase.getDatabaseName(),
qualifiedDatabase.getDataSourceName(),
DataSourceState.valueOf(event.getDataSource().getStatus().name()));
}
diff --git
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriberTest.java
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriberTest.java
index 30191e958b5..b7cde743780 100644
---
a/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriberTest.java
+++
b/mode/type/cluster/core/src/test/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/StateChangedSubscriberTest.java
@@ -28,7 +28,7 @@ import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.schema.QualifiedDatabase;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
import org.apache.shardingsphere.infra.rule.identifier.type.ResourceHeldRule;
-import
org.apache.shardingsphere.infra.rule.identifier.type.StaticDataSourceContainedRule;
+import
org.apache.shardingsphere.infra.rule.identifier.type.datasource.StaticDataSourceContainedRule;
import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
import org.apache.shardingsphere.infra.state.cluster.ClusterState;
import org.apache.shardingsphere.infra.state.datasource.DataSourceState;
@@ -74,6 +74,7 @@ import java.util.Properties;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.ArgumentMatchers.argThat;
+import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@@ -117,11 +118,11 @@ class StateChangedSubscriberTest {
@Test
void assertRenewForDisableStateChanged() {
- StaticDataSourceContainedRule staticDataSourceRule =
mock(StaticDataSourceContainedRule.class);
+ StaticDataSourceContainedRule staticDataSourceRule =
mock(StaticDataSourceContainedRule.class, RETURNS_DEEP_STUBS);
when(database.getRuleMetaData().findSingleRule(StaticDataSourceContainedRule.class)).thenReturn(Optional.of(staticDataSourceRule));
StorageNodeChangedEvent event = new StorageNodeChangedEvent(new
QualifiedDatabase("db.readwrite_ds.ds_0"), new
StorageNodeDataSource(StorageNodeRole.MEMBER, DataSourceState.DISABLED));
subscriber.renew(event);
- verify(staticDataSourceRule).updateStatus(argThat(
+
verify(staticDataSourceRule.getStaticDataSourceRule()).updateStatus(argThat(
(ArgumentMatcher<StorageNodeDataSourceChangedEvent>)
argumentEvent -> Objects.equals(event.getQualifiedDatabase(),
argumentEvent.getQualifiedDatabase())
&& Objects.equals(event.getDataSource(),
argumentEvent.getDataSource())));
}