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

chengzhang 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 8f9516f6bbd Refactor close resource when alter transaction rule 
(#30872)
8f9516f6bbd is described below

commit 8f9516f6bbd14dd217cc94401a3d2495638bf69d
Author: zhaojinchao <[email protected]>
AuthorDate: Sat Apr 13 11:06:11 2024 +0800

    Refactor close resource when alter transaction rule (#30872)
    
    * Refactor close resource when alter transaction rule
    
    * Fix close state
    
    * Fix checkstyle
---
 .../database/DatabaseMetaDataPersistService.java   | 11 ++-
 .../schema/SchemaMetaDataPersistService.java       | 14 ----
 .../schema/TableMetaDataPersistService.java        | 23 ++-----
 .../service/schema/ViewMetaDataPersistService.java | 23 ++-----
 .../context/ConfigurationContextManager.java       | 79 +++++++---------------
 .../mode/manager/ContextManagerTest.java           |  9 ---
 .../manager/cluster/ClusterModeContextManager.java |  6 +-
 .../subscriber/ConfigurationChangedSubscriber.java |  3 +-
 8 files changed, 45 insertions(+), 123 deletions(-)

diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
index 1115177ad4b..351629379eb 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/database/DatabaseMetaDataPersistService.java
@@ -47,9 +47,9 @@ public final class DatabaseMetaDataPersistService implements 
DatabaseMetaDataBas
     
     public DatabaseMetaDataPersistService(final PersistRepository repository, 
final MetaDataVersionPersistService metaDataVersionPersistService) {
         this.repository = repository;
-        this.tableMetaDataPersistService = new 
TableMetaDataPersistService(repository);
-        this.viewMetaDataPersistService = new 
ViewMetaDataPersistService(repository);
         this.metaDataVersionPersistService = metaDataVersionPersistService;
+        this.tableMetaDataPersistService = new 
TableMetaDataPersistService(repository, metaDataVersionPersistService);
+        this.viewMetaDataPersistService = new 
ViewMetaDataPersistService(repository, metaDataVersionPersistService);
     }
     
     @Override
@@ -83,8 +83,7 @@ public final class DatabaseMetaDataPersistService implements 
DatabaseMetaDataBas
             addSchema(databaseName, schemaName);
         }
         Map<String, ShardingSphereTable> currentTables = 
tableMetaDataPersistService.load(databaseName, schemaName);
-        
metaDataVersionPersistService.switchActiveVersion(tableMetaDataPersistService
-                .persistSchemaMetaData(databaseName, schemaName, 
GenericSchemaManager.getToBeAddedTables(schema.getTables(), currentTables)));
+        tableMetaDataPersistService.persist(databaseName, schemaName, 
GenericSchemaManager.getToBeAddedTables(schema.getTables(), currentTables));
         GenericSchemaManager.getToBeDeletedTables(schema.getTables(), 
currentTables).forEach((key, value) -> 
tableMetaDataPersistService.delete(databaseName, schemaName, key));
     }
     
@@ -93,12 +92,12 @@ public final class DatabaseMetaDataPersistService 
implements DatabaseMetaDataBas
         if (schema.getTables().isEmpty() && schema.getViews().isEmpty()) {
             addSchema(databaseName, schemaName);
         }
-        
metaDataVersionPersistService.switchActiveVersion(tableMetaDataPersistService.persistSchemaMetaData(databaseName,
 schemaName, schema.getTables()));
+        tableMetaDataPersistService.persist(databaseName, schemaName, 
schema.getTables());
     }
     
     @Override
     public void persistByDropConfiguration(final String databaseName, final 
String schemaName, final ShardingSphereSchema schema) {
-        
metaDataVersionPersistService.switchActiveVersion(tableMetaDataPersistService.persistSchemaMetaData(databaseName,
 schemaName, schema.getTables()));
+        tableMetaDataPersistService.persist(databaseName, schemaName, 
schema.getTables());
     }
     
     @Override
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/SchemaMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/SchemaMetaDataPersistService.java
index 0b38b6114eb..f4730264307 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/SchemaMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/SchemaMetaDataPersistService.java
@@ -17,10 +17,6 @@
 
 package org.apache.shardingsphere.metadata.persist.service.schema;
 
-import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
-
-import java.util.Collection;
-
 /**
  * Schema meta data persist service.
  *
@@ -37,16 +33,6 @@ public interface SchemaMetaDataPersistService<T> {
      */
     void persist(String databaseName, String schemaName, T schema);
     
-    /**
-     * Persist schema meta data.
-     *
-     * @param databaseName database name
-     * @param schemaName schema name
-     * @param schema schema meta data
-     * @return meta data versions
-     */
-    Collection<MetaDataVersion> persistSchemaMetaData(String databaseName, 
String schemaName, T schema);
-    
     /**
      * Load schema meta data.
      *
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
index caa12fd28a0..c3147767122 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/TableMetaDataPersistService.java
@@ -25,6 +25,7 @@ import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import 
org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereTable;
 import org.apache.shardingsphere.infra.yaml.schema.swapper.YamlTableSwapper;
 import 
org.apache.shardingsphere.metadata.persist.node.metadata.TableMetaDataNode;
+import 
org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 
 import java.util.Collection;
@@ -45,23 +46,11 @@ public final class TableMetaDataPersistService implements 
SchemaMetaDataPersistS
     
     private final PersistRepository repository;
     
-    @Override
-    public void persist(final String databaseName, final String schemaName, 
final Map<String, ShardingSphereTable> tables) {
-        for (Entry<String, ShardingSphereTable> entry : tables.entrySet()) {
-            String tableName = entry.getKey().toLowerCase();
-            List<String> versions = 
repository.getChildrenKeys(TableMetaDataNode.getTableVersionsNode(databaseName, 
schemaName, tableName));
-            
repository.persist(TableMetaDataNode.getTableVersionNode(databaseName, 
schemaName, tableName, versions.isEmpty()
-                    ? DEFAULT_VERSION
-                    : String.valueOf(Integer.parseInt(versions.get(0)) + 1)), 
YamlEngine.marshal(new 
YamlTableSwapper().swapToYamlConfiguration(entry.getValue())));
-            if 
(Strings.isNullOrEmpty(repository.getDirectly(TableMetaDataNode.getTableActiveVersionNode(databaseName,
 schemaName, tableName)))) {
-                
repository.persist(TableMetaDataNode.getTableActiveVersionNode(databaseName, 
schemaName, tableName), DEFAULT_VERSION);
-            }
-        }
-    }
+    private final MetaDataVersionPersistService metaDataVersionPersistService;
     
     @Override
-    public Collection<MetaDataVersion> persistSchemaMetaData(final String 
databaseName, final String schemaName, final Map<String, ShardingSphereTable> 
tables) {
-        Collection<MetaDataVersion> result = new LinkedList<>();
+    public void persist(final String databaseName, final String schemaName, 
final Map<String, ShardingSphereTable> tables) {
+        Collection<MetaDataVersion> metaDataVersions = new LinkedList<>();
         for (Entry<String, ShardingSphereTable> entry : tables.entrySet()) {
             String tableName = entry.getKey().toLowerCase();
             List<String> versions = 
repository.getChildrenKeys(TableMetaDataNode.getTableVersionsNode(databaseName, 
schemaName, tableName));
@@ -71,9 +60,9 @@ public final class TableMetaDataPersistService implements 
SchemaMetaDataPersistS
             if (Strings.isNullOrEmpty(getActiveVersion(databaseName, 
schemaName, tableName))) {
                 
repository.persist(TableMetaDataNode.getTableActiveVersionNode(databaseName, 
schemaName, tableName), DEFAULT_VERSION);
             }
-            result.add(new 
MetaDataVersion(TableMetaDataNode.getTableNode(databaseName, schemaName, 
tableName), getActiveVersion(databaseName, schemaName, tableName), 
nextActiveVersion));
+            metaDataVersions.add(new 
MetaDataVersion(TableMetaDataNode.getTableNode(databaseName, schemaName, 
tableName), getActiveVersion(databaseName, schemaName, tableName), 
nextActiveVersion));
         }
-        return result;
+        metaDataVersionPersistService.switchActiveVersion(metaDataVersions);
     }
     
     private String getActiveVersion(final String databaseName, final String 
schemaName, final String tableName) {
diff --git 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
index 65eb5fb9717..e97fbde82ea 100644
--- 
a/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
+++ 
b/kernel/metadata/core/src/main/java/org/apache/shardingsphere/metadata/persist/service/schema/ViewMetaDataPersistService.java
@@ -25,6 +25,7 @@ import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import org.apache.shardingsphere.infra.yaml.schema.pojo.YamlShardingSphereView;
 import org.apache.shardingsphere.infra.yaml.schema.swapper.YamlViewSwapper;
 import 
org.apache.shardingsphere.metadata.persist.node.metadata.ViewMetaDataNode;
+import 
org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionPersistService;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
 
 import java.util.Collection;
@@ -45,23 +46,11 @@ public final class ViewMetaDataPersistService implements 
SchemaMetaDataPersistSe
     
     private final PersistRepository repository;
     
-    @Override
-    public void persist(final String databaseName, final String schemaName, 
final Map<String, ShardingSphereView> views) {
-        for (Entry<String, ShardingSphereView> entry : views.entrySet()) {
-            String viewName = entry.getKey().toLowerCase();
-            List<String> versions = 
repository.getChildrenKeys(ViewMetaDataNode.getViewVersionsNode(databaseName, 
schemaName, viewName));
-            
repository.persist(ViewMetaDataNode.getViewVersionNode(databaseName, 
schemaName, viewName, versions.isEmpty()
-                    ? DEFAULT_VERSION
-                    : String.valueOf(Integer.parseInt(versions.get(0)) + 1)), 
YamlEngine.marshal(new 
YamlViewSwapper().swapToYamlConfiguration(entry.getValue())));
-            if 
(Strings.isNullOrEmpty(repository.getDirectly(ViewMetaDataNode.getViewActiveVersionNode(databaseName,
 schemaName, viewName)))) {
-                
repository.persist(ViewMetaDataNode.getViewActiveVersionNode(databaseName, 
schemaName, viewName), DEFAULT_VERSION);
-            }
-        }
-    }
+    private final MetaDataVersionPersistService metaDataVersionPersistService;
     
     @Override
-    public Collection<MetaDataVersion> persistSchemaMetaData(final String 
databaseName, final String schemaName, final Map<String, ShardingSphereView> 
views) {
-        Collection<MetaDataVersion> result = new LinkedList<>();
+    public void persist(final String databaseName, final String schemaName, 
final Map<String, ShardingSphereView> views) {
+        Collection<MetaDataVersion> metaDataVersions = new LinkedList<>();
         for (Entry<String, ShardingSphereView> entry : views.entrySet()) {
             String viewName = entry.getKey().toLowerCase();
             List<String> versions = 
repository.getChildrenKeys(ViewMetaDataNode.getViewVersionsNode(databaseName, 
schemaName, viewName));
@@ -71,9 +60,9 @@ public final class ViewMetaDataPersistService implements 
SchemaMetaDataPersistSe
             if (Strings.isNullOrEmpty(getActiveVersion(databaseName, 
schemaName, viewName))) {
                 
repository.persist(ViewMetaDataNode.getViewActiveVersionNode(databaseName, 
schemaName, viewName), DEFAULT_VERSION);
             }
-            result.add(new 
MetaDataVersion(ViewMetaDataNode.getViewNode(databaseName, schemaName, 
viewName), getActiveVersion(databaseName, schemaName, viewName), 
nextActiveVersion));
+            metaDataVersions.add(new 
MetaDataVersion(ViewMetaDataNode.getViewNode(databaseName, schemaName, 
viewName), getActiveVersion(databaseName, schemaName, viewName), 
nextActiveVersion));
         }
-        return result;
+        metaDataVersionPersistService.switchActiveVersion(metaDataVersions);
     }
     
     private String getActiveVersion(final String databaseName, final String 
schemaName, final String viewName) {
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
index 55fdb0aede1..8f281988218 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/context/ConfigurationContextManager.java
@@ -38,12 +38,15 @@ import 
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSp
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
+import 
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlDataNodeGlobalRuleConfigurationSwapper;
+import 
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlDataNodeGlobalRuleConfigurationSwapperEngine;
 import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
 import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
 import org.apache.shardingsphere.metadata.persist.MetaDataBasedPersistService;
 import org.apache.shardingsphere.mode.manager.switcher.ResourceSwitchManager;
 import org.apache.shardingsphere.mode.manager.switcher.SwitchingResource;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
+import org.apache.shardingsphere.transaction.rule.TransactionRule;
 
 import javax.sql.DataSource;
 import java.sql.SQLException;
@@ -175,7 +178,7 @@ public final class ConfigurationContextManager {
             ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
             Collection<ShardingSphereRule> rules = new 
LinkedList<>(database.getRuleMetaData().getRules());
             rules.removeIf(each -> 
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
-            if (isNotEmptyConfig(ruleConfig)) {
+            if (!((DatabaseRuleConfiguration) ruleConfig).isEmpty()) {
                 rules.addAll(DatabaseRulesBuilder.build(databaseName, 
database.getProtocolType(),
                         
database.getResourceMetaData().getStorageUnits().entrySet().stream()
                                 .collect(Collectors.toMap(Entry::getKey, entry 
-> entry.getValue().getDataSource(), (oldValue, currentValue) -> oldValue, 
LinkedHashMap::new)),
@@ -187,10 +190,6 @@ public final class ConfigurationContextManager {
         }
     }
     
-    private static boolean isNotEmptyConfig(final RuleConfiguration 
ruleConfig) {
-        return !((DatabaseRuleConfiguration) ruleConfig).isEmpty();
-    }
-    
     private void refreshMetadata(final String databaseName, final 
ShardingSphereDatabase database, final Collection<ShardingSphereRule> rules, 
final boolean isDropConfig) throws SQLException {
         database.getRuleMetaData().getRules().clear();
         database.getRuleMetaData().getRules().addAll(rules);
@@ -233,13 +232,13 @@ public final class ConfigurationContextManager {
      * @return ShardingSphere databases
      */
     public Map<String, ShardingSphereDatabase> renewDatabase(final 
ShardingSphereDatabase database, final SwitchingResource resource) {
-        Map<StorageNode, DataSource> newStorageNodes = 
getNewStorageNodes(database.getResourceMetaData().getDataSources(), resource);
-        Map<String, StorageUnit> newStorageUnits = 
getNewStorageUnits(database.getResourceMetaData().getStorageUnits(), resource);
+        Map<StorageNode, DataSource> storageNodes = 
getStorageNodes(database.getResourceMetaData().getDataSources(), resource);
+        Map<String, StorageUnit> storageUnits = 
getStorageUnits(database.getResourceMetaData().getStorageUnits(), resource);
         return Collections.singletonMap(database.getName().toLowerCase(), new 
ShardingSphereDatabase(database.getName(), database.getProtocolType(),
-                new ResourceMetaData(newStorageNodes, newStorageUnits), 
database.getRuleMetaData(), database.getSchemas()));
+                new ResourceMetaData(storageNodes, storageUnits), 
database.getRuleMetaData(), database.getSchemas()));
     }
     
-    private Map<StorageNode, DataSource> getNewStorageNodes(final 
Map<StorageNode, DataSource> currentStorageNodes, final SwitchingResource 
resource) {
+    private Map<StorageNode, DataSource> getStorageNodes(final 
Map<StorageNode, DataSource> currentStorageNodes, final SwitchingResource 
resource) {
         Map<StorageNode, DataSource> result = new 
LinkedHashMap<>(currentStorageNodes.size(), 1F);
         for (Entry<StorageNode, DataSource> entry : 
currentStorageNodes.entrySet()) {
             if (!resource.getStaleDataSources().containsKey(entry.getKey())) {
@@ -249,7 +248,7 @@ public final class ConfigurationContextManager {
         return result;
     }
     
-    private Map<String, StorageUnit> getNewStorageUnits(final Map<String, 
StorageUnit> currentStorageUnits, final SwitchingResource resource) {
+    private Map<String, StorageUnit> getStorageUnits(final Map<String, 
StorageUnit> currentStorageUnits, final SwitchingResource resource) {
         Map<String, StorageUnit> result = new 
LinkedHashMap<>(currentStorageUnits.size(), 1F);
         for (Entry<String, StorageUnit> entry : 
currentStorageUnits.entrySet()) {
             if (!resource.getStaleStorageUnitNames().contains(entry.getKey())) 
{
@@ -268,23 +267,6 @@ public final class ConfigurationContextManager {
         }
     }
     
-    /**
-     * Create meta data contexts when rule configuration changed.
-     *
-     * @param databaseName database name
-     * @param internalLoadMetaData internal load meta data
-     * @param switchingResource switching resource
-     * @param ruleConfigs rule configs
-     * @return MetaDataContexts meta data contexts
-     * @throws SQLException SQL exception
-     */
-    public MetaDataContexts createMetaDataContextsWhenRuleChanged(final String 
databaseName, final boolean internalLoadMetaData, final SwitchingResource 
switchingResource,
-                                                                  final 
Collection<RuleConfiguration> ruleConfigs) throws SQLException {
-        return newMetaDataContexts(new 
ShardingSphereMetaData(createChangedDatabases(databaseName, 
internalLoadMetaData, switchingResource, ruleConfigs),
-                
metaDataContexts.get().getMetaData().getGlobalResourceMetaData(), 
metaDataContexts.get().getMetaData().getGlobalRuleMetaData(),
-                metaDataContexts.get().getMetaData().getProps()));
-    }
-    
     /**
      * Create meta data contexts.
      *
@@ -370,23 +352,6 @@ public final class ConfigurationContextManager {
                 
metaDataContexts.get().getPersistService().getDatabaseMetaDataService().loadSchemas(originalDatabase.getName())));
     }
     
-    /**
-     * Alter global rule configuration.
-     *
-     * @param ruleConfigs global rule configuration
-     */
-    public synchronized void alterGlobalRuleConfiguration(final 
Collection<RuleConfiguration> ruleConfigs) {
-        if (ruleConfigs.isEmpty()) {
-            return;
-        }
-        closeStaleGlobalRules();
-        RuleMetaData toBeChangedGlobalRuleMetaData = new RuleMetaData(
-                GlobalRulesBuilder.buildRules(ruleConfigs, 
metaDataContexts.get().getMetaData().getDatabases(), 
metaDataContexts.get().getMetaData().getProps()));
-        ShardingSphereMetaData toBeChangedMetaData = new 
ShardingSphereMetaData(metaDataContexts.get().getMetaData().getDatabases(), 
metaDataContexts.get().getMetaData().getGlobalResourceMetaData(),
-                toBeChangedGlobalRuleMetaData, 
metaDataContexts.get().getMetaData().getProps());
-        metaDataContexts.set(newMetaDataContexts(toBeChangedMetaData));
-    }
-    
     /**
      * Alter global rule configuration.
      *
@@ -396,7 +361,9 @@ public final class ConfigurationContextManager {
         if (null == ruleConfig) {
             return;
         }
-        Collection<ShardingSphereRule> rules = 
removeSingleGlobalRule(ruleConfig);
+        closeStaleTransactionRule(ruleConfig);
+        Collection<ShardingSphereRule> rules = new 
LinkedList<>(metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules());
+        rules.removeIf(each -> 
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
         rules.addAll(GlobalRulesBuilder.buildSingleRules(ruleConfig, 
metaDataContexts.get().getMetaData().getDatabases(), 
metaDataContexts.get().getMetaData().getProps()));
         
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules().clear();
         
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules().addAll(rules);
@@ -405,17 +372,19 @@ public final class ConfigurationContextManager {
         metaDataContexts.set(newMetaDataContexts(toBeChangedMetaData));
     }
     
-    private Collection<ShardingSphereRule> removeSingleGlobalRule(final 
RuleConfiguration ruleConfig) {
-        Collection<ShardingSphereRule> result = new 
LinkedList<>(metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules());
-        result.removeIf(each -> 
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
-        return result;
-    }
-    
+    // Optimize string comparison rule type.
+    @SuppressWarnings("rawtypes")
     @SneakyThrows(Exception.class)
-    private void closeStaleGlobalRules() {
-        for (ShardingSphereRule each : 
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().getRules()) {
-            if (each instanceof AutoCloseable) {
-                ((AutoCloseable) each).close();
+    private void closeStaleTransactionRule(final RuleConfiguration ruleConfig) 
{
+        Map<RuleConfiguration, YamlDataNodeGlobalRuleConfigurationSwapper> 
yamlConfigs =
+                new 
YamlDataNodeGlobalRuleConfigurationSwapperEngine().swapToYamlRuleConfigurations(Collections.singletonList(ruleConfig));
+        for (Entry<RuleConfiguration, 
YamlDataNodeGlobalRuleConfigurationSwapper> entry : yamlConfigs.entrySet()) {
+            if 
("transaction".equalsIgnoreCase(entry.getValue().getRuleTagName())) {
+                Optional<TransactionRule> transactionRule = 
metaDataContexts.get().getMetaData().getGlobalRuleMetaData().findSingleRule(TransactionRule.class);
+                if (!transactionRule.isPresent()) {
+                    return;
+                }
+                ((AutoCloseable) transactionRule.get()).close();
             }
         }
     }
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 1f8f9176636..07df29308c8 100644
--- 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -19,7 +19,6 @@ package org.apache.shardingsphere.mode.manager;
 
 import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
 import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
-import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
 import org.apache.shardingsphere.infra.database.core.DefaultDatabase;
 import org.apache.shardingsphere.infra.database.core.type.DatabaseType;
 import org.apache.shardingsphere.infra.datanode.DataNode;
@@ -48,7 +47,6 @@ import 
org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource;
 import org.apache.shardingsphere.test.util.PropertiesBuilder;
 import org.apache.shardingsphere.test.util.PropertiesBuilder.Property;
-import 
org.apache.shardingsphere.transaction.config.TransactionRuleConfiguration;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
@@ -236,13 +234,6 @@ class ContextManagerTest {
         assertNotNull(contextManager.getDatabase("foo_db"));
     }
     
-    @Test
-    void assertAlterGlobalRuleConfiguration() {
-        RuleConfiguration ruleConfig = new 
TransactionRuleConfiguration("LOCAL", null, new Properties());
-        
contextManager.getConfigurationContextManager().alterGlobalRuleConfiguration(Collections.singleton(ruleConfig));
-        
assertTrue(contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getConfigurations().contains(ruleConfig));
-    }
-    
     @Test
     void assertAlterProperties() {
         
contextManager.getConfigurationContextManager().alterProperties(PropertiesBuilder.build(new
 Property("foo", "foo_value")));
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
index 930e89c4cec..05d76eee5a0 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java
@@ -29,7 +29,6 @@ import 
org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
 import 
org.apache.shardingsphere.metadata.persist.service.config.database.DatabaseBasedPersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.config.global.GlobalPersistService;
 import 
org.apache.shardingsphere.metadata.persist.service.database.DatabaseMetaDataBasedPersistService;
-import 
org.apache.shardingsphere.metadata.persist.service.version.MetaDataVersionBasedPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManager;
 import org.apache.shardingsphere.mode.manager.ContextManagerAware;
 import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
@@ -87,9 +86,8 @@ public final class ClusterModeContextManager implements 
ModeContextManager, Cont
         Map<String, ShardingSphereTable> tables = 
alterSchemaMetaDataPOJO.getAlteredTables().stream().collect(Collectors.toMap(ShardingSphereTable::getName,
 table -> table));
         Map<String, ShardingSphereView> views = 
alterSchemaMetaDataPOJO.getAlteredViews().stream().collect(Collectors.toMap(ShardingSphereView::getName,
 view -> view));
         DatabaseMetaDataBasedPersistService databaseMetaDataService = 
contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService();
-        MetaDataVersionBasedPersistService metaDataVersionBasedPersistService 
= 
contextManager.getMetaDataContexts().getPersistService().getMetaDataVersionPersistService();
-        
metaDataVersionBasedPersistService.switchActiveVersion(databaseMetaDataService.getTableMetaDataPersistService().persistSchemaMetaData(databaseName,
 schemaName, tables));
-        
metaDataVersionBasedPersistService.switchActiveVersion(databaseMetaDataService.getViewMetaDataPersistService().persistSchemaMetaData(databaseName,
 schemaName, views));
+        
databaseMetaDataService.getTableMetaDataPersistService().persist(databaseName, 
schemaName, tables);
+        
databaseMetaDataService.getViewMetaDataPersistService().persist(databaseName, 
schemaName, views);
         alterSchemaMetaDataPOJO.getDroppedTables().forEach(each -> 
databaseMetaDataService.getTableMetaDataPersistService().delete(databaseName, 
schemaName, each));
         alterSchemaMetaDataPOJO.getDroppedViews().forEach(each -> 
databaseMetaDataService.getViewMetaDataPersistService().delete(databaseName, 
schemaName, each));
     }
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 e5eb35fe22f..562e469ab91 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
@@ -117,7 +117,8 @@ public final class ConfigurationChangedSubscriber {
         if 
(!event.getActiveVersion().equals(contextManager.getMetaDataContexts().getPersistService().getMetaDataVersionPersistService().getActiveVersionByFullPath(event.getActiveVersionKey())))
 {
             return;
         }
-        
contextManager.getConfigurationContextManager().alterGlobalRuleConfiguration(contextManager.getMetaDataContexts().getPersistService().getGlobalRuleService().load(event.getRuleSimpleName()));
+        contextManager.getConfigurationContextManager()
+                
.alterGlobalRuleConfiguration(contextManager.getMetaDataContexts().getPersistService().getGlobalRuleService().load(event.getRuleSimpleName()));
     }
     
     /**

Reply via email to