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())));
     }


Reply via email to