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 f994f77f7ea Close heartbeat job when drop discovery rule (#23239)
f994f77f7ea is described below

commit f994f77f7ea1a661d8562b87b9db873dc5fd4be0
Author: zhaojinchao <[email protected]>
AuthorDate: Sun Jan 1 21:50:35 2023 +0800

    Close heartbeat job when drop discovery rule (#23239)
    
    * Close heartbeat job when drop discovery rule
    
    * Add sleep
    
    * Adjustment it
    
    * Fix IT
---
 .../dbdiscovery/rule/DatabaseDiscoveryRule.java               |  9 ++++++++-
 .../update/DropDatabaseDiscoveryRuleStatementUpdater.java     |  6 ++++++
 .../shardingsphere/infra/metadata/ShardingSphereMetaData.java |  2 +-
 .../rule/identifier/type/DynamicDataSourceContainedRule.java  | 11 +++++++++--
 .../distsql/rdl/rule/RuleDefinitionBackendHandler.java        |  1 -
 .../shardingsphere/test/e2e/engine/rdl/BaseRDLE2EIT.java      |  3 ++-
 6 files changed, 26 insertions(+), 6 deletions(-)

diff --git 
a/features/db-discovery/core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java
 
b/features/db-discovery/core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java
index 918ac66c561..56418c75861 100644
--- 
a/features/db-discovery/core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java
+++ 
b/features/db-discovery/core/src/main/java/org/apache/shardingsphere/dbdiscovery/rule/DatabaseDiscoveryRule.java
@@ -156,7 +156,14 @@ public final class DatabaseDiscoveryRule implements 
DatabaseRule, DataSourceCont
     }
     
     @Override
-    public void closeHeartBeatJob() {
+    public void closeSingleHeartBeatJob(final String groupName) {
+        DatabaseDiscoveryDataSourceRule dataSourceRule = 
dataSourceRules.get(groupName);
+        Preconditions.checkNotNull(dataSourceRule, "Can not find database 
discovery data source rule in database `%s`", databaseName);
+        
scheduleContext.closeSchedule(dataSourceRule.getDatabaseDiscoveryProviderAlgorithm().getType()
 + "-" + databaseName + "-" + dataSourceRule.getGroupName());
+    }
+    
+    @Override
+    public void closeAllHeartBeatJob() {
         for (Entry<String, DatabaseDiscoveryDataSourceRule> entry : 
dataSourceRules.entrySet()) {
             DatabaseDiscoveryDataSourceRule rule = entry.getValue();
             
scheduleContext.closeSchedule(rule.getDatabaseDiscoveryProviderAlgorithm().getType()
 + "-" + databaseName + "-" + rule.getGroupName());
diff --git 
a/features/db-discovery/distsql/handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/DropDatabaseDiscoveryRuleStatementUpdater.java
 
b/features/db-discovery/distsql/handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/DropDatabaseDiscoveryRuleStatementUpdater.java
index feb538fd2c4..8708c833893 100644
--- 
a/features/db-discovery/distsql/handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/DropDatabaseDiscoveryRuleStatementUpdater.java
+++ 
b/features/db-discovery/distsql/handler/src/main/java/org/apache/shardingsphere/dbdiscovery/distsql/handler/update/DropDatabaseDiscoveryRuleStatementUpdater.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.dbdiscovery.distsql.handler.update;
 import 
org.apache.shardingsphere.dbdiscovery.api.config.DatabaseDiscoveryRuleConfiguration;
 import 
org.apache.shardingsphere.dbdiscovery.api.config.rule.DatabaseDiscoveryDataSourceRuleConfiguration;
 import 
org.apache.shardingsphere.dbdiscovery.distsql.parser.statement.DropDatabaseDiscoveryRuleStatement;
+import 
org.apache.shardingsphere.infra.rule.identifier.type.DynamicDataSourceContainedRule;
 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.distsql.handler.exception.rule.MissingRequiredRuleException;
@@ -50,6 +51,7 @@ public final class DropDatabaseDiscoveryRuleStatementUpdater 
implements RuleDefi
         String databaseName = database.getName();
         checkCurrentRuleConfiguration(databaseName, sqlStatement, 
currentRuleConfig);
         checkIsInUse(databaseName, sqlStatement, database);
+        closeHeartbeatJob(database, sqlStatement);
     }
     
     private void checkCurrentRuleConfiguration(final String databaseName, 
final DropDatabaseDiscoveryRuleStatement sqlStatement, final 
DatabaseDiscoveryRuleConfiguration currentRuleConfig) {
@@ -79,6 +81,10 @@ public final class DropDatabaseDiscoveryRuleStatementUpdater 
implements RuleDefi
         ShardingSpherePreconditions.checkState(invalid.isEmpty(), () -> new 
RuleInUsedException(RULE_TYPE, databaseName, invalid));
     }
     
+    private void closeHeartbeatJob(final ShardingSphereDatabase database, 
final DropDatabaseDiscoveryRuleStatement sqlStatement) {
+        sqlStatement.getNames().forEach(each -> 
database.getRuleMetaData().findSingleRule(DynamicDataSourceContainedRule.class).ifPresent(optional
 -> optional.closeSingleHeartBeatJob(each)));
+    }
+    
     @Override
     public boolean updateCurrentRuleConfiguration(final 
DropDatabaseDiscoveryRuleStatement sqlStatement, final 
DatabaseDiscoveryRuleConfiguration currentRuleConfig) {
         sqlStatement.getNames().forEach(each -> dropRule(currentRuleConfig, 
each));
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 32c52518512..14102a6fe16 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
@@ -124,7 +124,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().findSingleRule(DynamicDataSourceContainedRule.class).ifPresent(DynamicDataSourceContainedRule::closeHeartBeatJob);
+        
database.getRuleMetaData().findSingleRule(DynamicDataSourceContainedRule.class).ifPresent(DynamicDataSourceContainedRule::closeAllHeartBeatJob);
         Optional.ofNullable(database.getResourceMetaData()).ifPresent(optional 
-> optional.getDataSources().values().forEach(each -> 
database.getResourceMetaData().close(each)));
     }
 }
diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/DynamicDataSourceContainedRule.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/DynamicDataSourceContainedRule.java
index c30efdc001f..76f93fc1618 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/DynamicDataSourceContainedRule.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/rule/identifier/type/DynamicDataSourceContainedRule.java
@@ -58,7 +58,14 @@ public interface DynamicDataSourceContainedRule extends 
ShardingSphereRule {
     void restartHeartBeatJob(DataSourceStatusChangedEvent event);
     
     /**
-     * Close heart beat.
+     * Close single heart beat job.
+     *
+     * @param groupName group name
+     */
+    void closeSingleHeartBeatJob(String groupName);
+    
+    /**
+     * Close all heart beat job.
      */
-    void closeHeartBeatJob();
+    void closeAllHeartBeatJob();
 }
diff --git 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java
 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java
index c3dc5a8ab8f..8e14e641eab 100644
--- 
a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java
+++ 
b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java
@@ -89,7 +89,6 @@ public final class RuleDefinitionBackendHandler<T extends 
RuleDefinitionStatemen
         } else {
             throw new UnsupportedSQLOperationException(String.format("Cannot 
support RDL updater type `%s`", updater.getClass().getCanonicalName()));
         }
-        
ProxyContext.getInstance().getContextManager().alterRuleConfiguration(database.getName(),
 result);
         return result;
     }
     
diff --git 
a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/rdl/BaseRDLE2EIT.java
 
b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/rdl/BaseRDLE2EIT.java
index efe540e0f8c..580dc8a5c45 100644
--- 
a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/rdl/BaseRDLE2EIT.java
+++ 
b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/rdl/BaseRDLE2EIT.java
@@ -51,7 +51,6 @@ public abstract class BaseRDLE2EIT extends SingleE2EIT {
         try (Connection connection = getTargetDataSource().getConnection()) {
             executeInitSQLs(connection);
         }
-        sleep();
     }
     
     @After
@@ -71,6 +70,7 @@ public abstract class BaseRDLE2EIT extends SingleE2EIT {
         for (String each : 
Splitter.on(";").trimResults().splitToList(getAssertion().getInitialSQL().getSql()))
 {
             try (PreparedStatement preparedStatement = 
connection.prepareStatement(each)) {
                 preparedStatement.executeUpdate();
+                sleep();
             }
         }
     }
@@ -82,6 +82,7 @@ public abstract class BaseRDLE2EIT extends SingleE2EIT {
         for (String each : 
Splitter.on(";").trimResults().splitToList(getAssertion().getDestroySQL().getSql()))
 {
             try (PreparedStatement preparedStatement = 
connection.prepareStatement(each)) {
                 preparedStatement.executeUpdate();
+                sleep();
             }
         }
     }

Reply via email to