This is an automated email from the ASF dual-hosted git repository.

duanzhengqiang 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 189647b72e3 Fix miss sharding rule problem when use Standalone mode 
(#29326)
189647b72e3 is described below

commit 189647b72e3d19509921bbc7ee6d2e9693402bb5
Author: zhaojinchao <[email protected]>
AuthorDate: Sun Dec 10 09:38:07 2023 +0800

    Fix miss sharding rule problem when use Standalone mode (#29326)
    
    * Fix miss sharding rule problem when use Standalone mode
    
    * Fix spotless
---
 .../infra/metadata/version/MetaDataVersion.java    | 20 ++++++++++++++++
 .../database/DatabaseBasedPersistService.java      |  4 +++-
 .../NewDataSourceNodePersistService.java           | 11 +++++----
 .../NewDataSourceUnitPersistService.java           | 11 +++++----
 .../rule/NewDatabaseRulePersistService.java        | 18 +++++++++-----
 .../schema/NewTableMetaDataPersistService.java     |  3 +--
 .../builder}/RuleConfigurationEventBuilder.java    |  2 +-
 .../NewConfigurationChangedSubscriber.java         |  2 +-
 .../cluster/NewClusterModeContextManager.java      |  4 ++--
 .../watcher/NewMetaDataChangedWatcher.java         |  1 +
 .../NewContextManagerSubscriberFacade.java         |  1 +
 .../NewStandaloneContextManagerBuilder.java        |  8 +++++++
 .../NewStandaloneModeContextManager.java           | 28 ++++++++++++++++++----
 13 files changed, 87 insertions(+), 26 deletions(-)

diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/version/MetaDataVersion.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/version/MetaDataVersion.java
index 0dfe1c219eb..15b54c364a0 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/version/MetaDataVersion.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/version/MetaDataVersion.java
@@ -20,6 +20,9 @@ package org.apache.shardingsphere.infra.metadata.version;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 
+import java.util.Arrays;
+import java.util.Collection;
+
 /**
  * Meta data version.
  */
@@ -27,9 +30,26 @@ import lombok.RequiredArgsConstructor;
 @Getter
 public final class MetaDataVersion {
     
+    private static final String ACTIVE_VERSION = "active_version";
+    
     private final String key;
     
     private final String currentActiveVersion;
     
     private final String nextActiveVersion;
+    
+    public MetaDataVersion(final String key) {
+        this.key = key;
+        this.currentActiveVersion = "";
+        this.nextActiveVersion = "";
+    }
+    
+    /**
+     * Get active version keys.
+     *
+     * @return active version keys
+     */
+    public Collection<String> getActiveVersionKeys() {
+        return Arrays.asList(String.join("/", key, ACTIVE_VERSION), 
String.join("/", key, ACTIVE_VERSION, currentActiveVersion));
+    }
 }
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
index 03411991926..82a6ebba11a 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/DatabaseBasedPersistService.java
@@ -72,8 +72,10 @@ public interface DatabaseBasedPersistService<T> {
      *
      * @param databaseName database name
      * @param configs configurations
+     * @return meta data versions
      */
-    default void delete(String databaseName, T configs) {
+    default Collection<MetaDataVersion> deleteConfig(String databaseName, T 
configs) {
+        return Collections.emptyList();
     }
     
     /**
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/datasource/NewDataSourceNodePersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/datasource/NewDataSourceNodePersistService.java
index 03b716ffee0..3cb906cfd42 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/datasource/NewDataSourceNodePersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/datasource/NewDataSourceNodePersistService.java
@@ -60,10 +60,14 @@ public final class NewDataSourceNodePersistService 
implements DatabaseBasedPersi
     }
     
     @Override
-    public void delete(final String databaseName, final Map<String, 
DataSourcePoolProperties> dataSourceConfigs) {
+    public Collection<MetaDataVersion> deleteConfig(final String databaseName, 
final Map<String, DataSourcePoolProperties> dataSourceConfigs) {
+        Collection<MetaDataVersion> result = new LinkedList<>();
         for (Entry<String, DataSourcePoolProperties> entry : 
dataSourceConfigs.entrySet()) {
-            
repository.delete(NewDatabaseMetaDataNode.getDataSourceNode(databaseName, 
entry.getKey()));
+            String delKey = 
NewDatabaseMetaDataNode.getDataSourceNode(databaseName, entry.getKey());
+            repository.delete(delKey);
+            result.add(new MetaDataVersion(delKey));
         }
+        return result;
     }
     
     @Override
@@ -77,8 +81,7 @@ public final class NewDataSourceNodePersistService implements 
DatabaseBasedPersi
             if (Strings.isNullOrEmpty(getDataSourceActiveVersion(databaseName, 
entry.getKey()))) {
                 
repository.persist(NewDatabaseMetaDataNode.getDataSourceNodeActiveVersionNode(databaseName,
 entry.getKey()), DEFAULT_VERSION);
             }
-            result.add(new 
MetaDataVersion(NewDatabaseMetaDataNode.getDataSourceNode(databaseName, 
entry.getKey()),
-                    getDataSourceActiveVersion(databaseName, entry.getKey()), 
nextActiveVersion));
+            result.add(new 
MetaDataVersion(NewDatabaseMetaDataNode.getDataSourceNode(databaseName, 
entry.getKey()), getDataSourceActiveVersion(databaseName, entry.getKey()), 
nextActiveVersion));
         }
         return result;
     }
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/datasource/NewDataSourceUnitPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/datasource/NewDataSourceUnitPersistService.java
index eac8654fe27..98c5c6946a3 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/datasource/NewDataSourceUnitPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/datasource/NewDataSourceUnitPersistService.java
@@ -60,10 +60,14 @@ public final class NewDataSourceUnitPersistService 
implements DatabaseBasedPersi
     }
     
     @Override
-    public void delete(final String databaseName, final Map<String, 
DataSourcePoolProperties> dataSourceConfigs) {
+    public Collection<MetaDataVersion> deleteConfig(final String databaseName, 
final Map<String, DataSourcePoolProperties> dataSourceConfigs) {
+        Collection<MetaDataVersion> result = new LinkedList<>();
         for (Entry<String, DataSourcePoolProperties> entry : 
dataSourceConfigs.entrySet()) {
-            
repository.delete(NewDatabaseMetaDataNode.getDataSourceUnitNode(databaseName, 
entry.getKey()));
+            String delKey = 
NewDatabaseMetaDataNode.getDataSourceUnitNode(databaseName, entry.getKey());
+            repository.delete(delKey);
+            result.add(new MetaDataVersion(delKey));
         }
+        return result;
     }
     
     @Override
@@ -77,8 +81,7 @@ public final class NewDataSourceUnitPersistService implements 
DatabaseBasedPersi
             if (Strings.isNullOrEmpty(getDataSourceActiveVersion(databaseName, 
entry.getKey()))) {
                 
repository.persist(NewDatabaseMetaDataNode.getDataSourceUnitActiveVersionNode(databaseName,
 entry.getKey()), DEFAULT_VERSION);
             }
-            result.add(new 
MetaDataVersion(NewDatabaseMetaDataNode.getDataSourceUnitNode(databaseName, 
entry.getKey()),
-                    getDataSourceActiveVersion(databaseName, entry.getKey()), 
nextActiveVersion));
+            result.add(new 
MetaDataVersion(NewDatabaseMetaDataNode.getDataSourceUnitNode(databaseName, 
entry.getKey()), getDataSourceActiveVersion(databaseName, entry.getKey()), 
nextActiveVersion));
         }
         return result;
     }
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/rule/NewDatabaseRulePersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/rule/NewDatabaseRulePersistService.java
index d20ca2a1394..4911c473d71 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/rule/NewDatabaseRulePersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/config/database/rule/NewDatabaseRulePersistService.java
@@ -98,17 +98,19 @@ public final class NewDatabaseRulePersistService extends 
AbstractPersistService
     
     @SuppressWarnings({"unchecked", "rawtypes"})
     @Override
-    public void delete(final String databaseName, final 
Collection<RuleConfiguration> configs) {
+    public Collection<MetaDataVersion> deleteConfig(final String databaseName, 
final Collection<RuleConfiguration> configs) {
+        Collection<MetaDataVersion> result = new LinkedList<>();
         Map<RuleConfiguration, NewYamlRuleConfigurationSwapper> yamlConfigs = 
new 
NewYamlRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(configs);
         for (Entry<RuleConfiguration, NewYamlRuleConfigurationSwapper> entry : 
yamlConfigs.entrySet()) {
             Collection<YamlDataNode> dataNodes = 
entry.getValue().swapToDataNodes(entry.getKey());
             if (dataNodes.isEmpty()) {
                 continue;
             }
-            List<YamlDataNode> result = new LinkedList<>(dataNodes);
-            Collections.reverse(result);
-            deleteDataNodes(databaseName, 
entry.getValue().getRuleTagName().toLowerCase(), result);
+            List<YamlDataNode> newDataNodes = new LinkedList<>(dataNodes);
+            Collections.reverse(newDataNodes);
+            result.addAll(deleteDataNodes(databaseName, 
entry.getValue().getRuleTagName().toLowerCase(), newDataNodes));
         }
+        return result;
     }
     
     @Override
@@ -116,10 +118,14 @@ public final class NewDatabaseRulePersistService extends 
AbstractPersistService
         
repository.delete(NewDatabaseMetaDataNode.getDatabaseRuleNode(databaseName, 
ruleName));
     }
     
-    private void deleteDataNodes(final String databaseName, final String 
ruleName, final Collection<YamlDataNode> dataNodes) {
+    private Collection<MetaDataVersion> deleteDataNodes(final String 
databaseName, final String ruleName, final Collection<YamlDataNode> dataNodes) {
+        Collection<MetaDataVersion> result = new LinkedList<>();
         for (YamlDataNode each : dataNodes) {
-            
repository.delete(NewDatabaseMetaDataNode.getDatabaseRuleNode(databaseName, 
ruleName, each.getKey()));
+            String delKey = 
NewDatabaseMetaDataNode.getDatabaseRuleNode(databaseName, ruleName, 
each.getKey());
+            repository.delete(delKey);
+            result.add(new MetaDataVersion(delKey));
         }
+        return result;
     }
     
     @Override
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewTableMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewTableMetaDataPersistService.java
index ea454839797..a0911e21b55 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewTableMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/NewTableMetaDataPersistService.java
@@ -73,8 +73,7 @@ public final class NewTableMetaDataPersistService implements 
SchemaMetaDataPersi
             if (Strings.isNullOrEmpty(getActiveVersion(databaseName, 
schemaName, tableName))) {
                 
repository.persist(NewDatabaseMetaDataNode.getTableActiveVersionNode(databaseName,
 schemaName, tableName), DEFAULT_VERSION);
             }
-            result.add(new 
MetaDataVersion(NewDatabaseMetaDataNode.getTableNode(databaseName, schemaName, 
tableName),
-                    getActiveVersion(databaseName, schemaName, tableName), 
nextActiveVersion));
+            result.add(new 
MetaDataVersion(NewDatabaseMetaDataNode.getTableNode(databaseName, schemaName, 
tableName), getActiveVersion(databaseName, schemaName, tableName), 
nextActiveVersion));
         }
         return result;
     }
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/RuleConfigurationEventBuilder.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/builder/RuleConfigurationEventBuilder.java
similarity index 97%
rename from 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/RuleConfigurationEventBuilder.java
rename to 
mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/builder/RuleConfigurationEventBuilder.java
index 474d8f9cf02..a804671849d 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/RuleConfigurationEventBuilder.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/builder/RuleConfigurationEventBuilder.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.watcher;
+package org.apache.shardingsphere.mode.metadata.builder;
 
 import com.google.common.base.Strings;
 import org.apache.shardingsphere.mode.path.RuleNodePath;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewConfigurationChangedSubscriber.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/subsciber/NewConfigurationChangedSubscriber.java
similarity index 98%
rename from 
mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewConfigurationChangedSubscriber.java
rename to 
mode/core/src/main/java/org/apache/shardingsphere/mode/subsciber/NewConfigurationChangedSubscriber.java
index 349542fc3d6..bdc49618922 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewConfigurationChangedSubscriber.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/subsciber/NewConfigurationChangedSubscriber.java
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber;
+package org.apache.shardingsphere.mode.subsciber;
 
 import com.google.common.eventbus.Subscribe;
 import 
org.apache.shardingsphere.mode.event.config.AlterDatabaseRuleConfigurationEvent;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/NewClusterModeContextManager.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/NewClusterModeContextManager.java
index c5bc6037617..306730e536e 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/NewClusterModeContextManager.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/NewClusterModeContextManager.java
@@ -110,7 +110,7 @@ public final class NewClusterModeContextManager implements 
ModeContextManager, C
     
     @Override
     public void unregisterStorageUnits(final String databaseName, final 
Collection<String> toBeDroppedStorageUnitNames) {
-        
contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService().delete(databaseName,
+        
contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService().deleteConfig(databaseName,
                 
getToBeDroppedDataSourcePoolProperties(contextManager.getMetaDataContexts().getPersistService().getDataSourceUnitService().load(databaseName),
 toBeDroppedStorageUnitNames));
     }
     
@@ -142,7 +142,7 @@ public final class NewClusterModeContextManager implements 
ModeContextManager, C
     @Override
     public void removeRuleConfigurationItem(final String databaseName, final 
RuleConfiguration toBeRemovedRuleConfig) {
         if (null != toBeRemovedRuleConfig) {
-            
contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().delete(databaseName,
 Collections.singleton(toBeRemovedRuleConfig));
+            
contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().deleteConfig(databaseName,
 Collections.singleton(toBeRemovedRuleConfig));
         }
     }
     
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java
index ebb5fcbbb24..ed5c1d9e84c 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/registry/metadata/watcher/NewMetaDataChangedWatcher.java
@@ -38,6 +38,7 @@ import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metad
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.DatabaseDeletedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.SchemaAddedEvent;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.metadata.event.SchemaDeletedEvent;
+import 
org.apache.shardingsphere.mode.metadata.builder.RuleConfigurationEventBuilder;
 
 import java.util.Arrays;
 import java.util.Collection;
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewContextManagerSubscriberFacade.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewContextManagerSubscriberFacade.java
index 169b7221e15..b59bc752e4a 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewContextManagerSubscriberFacade.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/subscriber/NewContextManagerSubscriberFacade.java
@@ -20,6 +20,7 @@ package 
org.apache.shardingsphere.mode.manager.cluster.coordinator.subscriber;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.NewRegistryCenter;
 import 
org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.process.subscriber.NewProcessListChangedSubscriber;
+import 
org.apache.shardingsphere.mode.subsciber.NewConfigurationChangedSubscriber;
 
 /**
  * TODO replace the old implementation after meta data refactor completed
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneContextManagerBuilder.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneContextManagerBuilder.java
index eeb80576e06..53603441d0c 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneContextManagerBuilder.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneContextManagerBuilder.java
@@ -32,6 +32,8 @@ import 
org.apache.shardingsphere.mode.manager.standalone.workerid.generator.Stan
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.NewMetaDataContextsFactory;
 import 
org.apache.shardingsphere.mode.repository.standalone.StandalonePersistRepository;
+import 
org.apache.shardingsphere.mode.subsciber.NewConfigurationChangedSubscriber;
+import org.apache.shardingsphere.mode.subsciber.RuleItemChangedSubscriber;
 
 import java.sql.SQLException;
 import java.util.Properties;
@@ -52,6 +54,7 @@ public final class NewStandaloneContextManagerBuilder 
implements ContextManagerB
         new StandaloneProcessSubscriber(instanceContext.getEventBusContext());
         MetaDataContexts metaDataContexts = 
NewMetaDataContextsFactory.create(persistService, param, instanceContext);
         ContextManager result = new ContextManager(metaDataContexts, 
instanceContext);
+        registerSubscriber(result);
         setContextManagerAware(result);
         return result;
     }
@@ -61,6 +64,11 @@ public final class NewStandaloneContextManagerBuilder 
implements ContextManagerB
                 new StandaloneWorkerIdGenerator(), 
param.getModeConfiguration(), new NewStandaloneModeContextManager(), new 
GlobalLockContext(null), new EventBusContext());
     }
     
+    private void registerSubscriber(final ContextManager contextManager) {
+        contextManager.getInstanceContext().getEventBusContext().register(new 
RuleItemChangedSubscriber(contextManager));
+        new NewConfigurationChangedSubscriber(contextManager);
+    }
+    
     private void setContextManagerAware(final ContextManager contextManager) {
         ((NewStandaloneModeContextManager) 
contextManager.getInstanceContext().getModeContextManager()).setContextManagerAware(contextManager);
     }
diff --git 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneModeContextManager.java
 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneModeContextManager.java
index cdd94a83b68..ffe378f9550 100644
--- 
a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneModeContextManager.java
+++ 
b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/NewStandaloneModeContextManager.java
@@ -35,11 +35,14 @@ import 
org.apache.shardingsphere.infra.rule.identifier.type.TableContainedRule;
 import 
org.apache.shardingsphere.infra.spi.type.ordered.cache.OrderedServicesCache;
 import 
org.apache.shardingsphere.metadata.persist.service.config.global.GlobalPersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataBasedPersistService;
+import org.apache.shardingsphere.mode.event.DataChangedEvent;
+import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.manager.ContextManagerAware;
 import 
org.apache.shardingsphere.mode.manager.switcher.NewResourceSwitchManager;
 import org.apache.shardingsphere.mode.manager.switcher.SwitchingResource;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import 
org.apache.shardingsphere.mode.metadata.builder.RuleConfigurationEventBuilder;
 
 import java.sql.SQLException;
 import java.util.Collection;
@@ -57,6 +60,8 @@ import java.util.stream.Collectors;
  */
 public final class NewStandaloneModeContextManager implements 
ModeContextManager, ContextManagerAware {
     
+    private final RuleConfigurationEventBuilder ruleConfigurationEventBuilder 
= new RuleConfigurationEventBuilder();
+    
     private ContextManager contextManager;
     
     @Override
@@ -260,19 +265,32 @@ public final class NewStandaloneModeContextManager 
implements ModeContextManager
     @Override
     public Collection<MetaDataVersion> alterRuleConfiguration(final String 
databaseName, final RuleConfiguration toBeAlteredRuleConfig) {
         if (null != toBeAlteredRuleConfig) {
-            
contextManager.getConfigurationContextManager().alterRuleConfiguration(databaseName,
 Collections.singletonList(toBeAlteredRuleConfig));
-            contextManager.getMetaDataContexts().getPersistService()
-                    
.getDatabaseRulePersistService().persist(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
 Collections.singletonList(toBeAlteredRuleConfig));
+            sendDatabaseRuleChangedEvent(databaseName,
+                    
contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService()
+                            
.persistConfig(contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getName(),
 Collections.singletonList(toBeAlteredRuleConfig)));
             clearServiceCache();
         }
         return Collections.emptyList();
     }
     
+    private void sendDatabaseRuleChangedEvent(final String databaseName, final 
Collection<MetaDataVersion> metaDataVersions) {
+        for (MetaDataVersion each : metaDataVersions) {
+            sendDatabaseRuleChangedEvent(databaseName, each);
+        }
+    }
+    
+    private void sendDatabaseRuleChangedEvent(final String databaseName, final 
MetaDataVersion metaDataVersion) {
+        for (String each : metaDataVersion.getActiveVersionKeys()) {
+            ruleConfigurationEventBuilder.build(databaseName, new 
DataChangedEvent(each, metaDataVersion.getCurrentActiveVersion(), Type.UPDATED))
+                    .ifPresent(optional -> 
contextManager.getInstanceContext().getEventBusContext().post(optional));
+        }
+    }
+    
     @Override
     public void removeRuleConfigurationItem(final String databaseName, final 
RuleConfiguration toBeRemovedRuleConfig) {
         if (null != toBeRemovedRuleConfig) {
-            
contextManager.getConfigurationContextManager().dropRuleConfiguration(databaseName,
 toBeRemovedRuleConfig);
-            
contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().delete(databaseName,
 Collections.singleton(toBeRemovedRuleConfig));
+            sendDatabaseRuleChangedEvent(databaseName,
+                    
contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().deleteConfig(databaseName,
 Collections.singleton(toBeRemovedRuleConfig)));
             clearServiceCache();
         }
     }

Reply via email to