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

sunnianjun 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 3d54cdd4335 Move persist schema meta data to 
MetaDataManagerPersistService after rule configuration altered (#32067)
3d54cdd4335 is described below

commit 3d54cdd433572d48338bd8ac45693f803bc213f6
Author: Haoran Meng <[email protected]>
AuthorDate: Thu Jul 11 18:52:46 2024 +0800

    Move persist schema meta data to MetaDataManagerPersistService after rule 
configuration altered (#32067)
    
    * add afterRuleConfigurationAltered in MetaDataManagerPersistService
    
    * Move persist schema meta data to MetaDataManagerPersistService after rule 
configuration altered
---
 .../rule/engine/database/type/AlterDatabaseRuleOperator.java  |  6 +++++-
 .../rule/engine/database/type/CreateDatabaseRuleOperator.java |  6 +++++-
 .../rule/engine/database/type/DropDatabaseRuleOperator.java   |  7 ++++++-
 .../mode/metadata/manager/ConfigurationManager.java           | 11 +++++------
 .../mode/persist/service/MetaDataManagerPersistService.java   | 10 ++++++++++
 .../cluster/persist/ClusterMetaDataManagerPersistService.java |  7 +++++++
 6 files changed, 38 insertions(+), 9 deletions(-)

diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java
index f929913169d..e76262bcadf 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/AlterDatabaseRuleOperator.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import 
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
 
 import java.util.Collection;
@@ -51,8 +52,11 @@ public final class AlterDatabaseRuleOperator implements 
DatabaseRuleOperator {
         RuleConfiguration toBeAlteredRuleConfig = 
executor.buildToBeAlteredRuleConfiguration(sqlStatement);
         MetaDataManagerPersistService metaDataManagerPersistService = 
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService();
         RuleConfiguration toBeDroppedRuleConfig = 
executor.buildToBeDroppedRuleConfiguration(toBeAlteredRuleConfig);
+        MetaDataContexts originalMetaDataContexts = 
contextManager.getMetaDataContexts();
         
metaDataManagerPersistService.removeRuleConfigurationItem(database.getName(), 
toBeDroppedRuleConfig);
-        return 
metaDataManagerPersistService.alterRuleConfiguration(database.getName(), 
decorateRuleConfiguration(database, toBeAlteredRuleConfig));
+        Collection<MetaDataVersion> result = 
metaDataManagerPersistService.alterRuleConfiguration(database.getName(), 
decorateRuleConfiguration(database, toBeAlteredRuleConfig));
+        
metaDataManagerPersistService.afterRuleConfigurationAltered(database.getName(), 
originalMetaDataContexts, false);
+        return result;
     }
     
     @SuppressWarnings("unchecked")
diff --git 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java
 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java
index 54e5449ebfe..4afde93767c 100644
--- 
a/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java
+++ 
b/infra/distsql-handler/src/main/java/org/apache/shardingsphere/distsql/handler/engine/update/rdl/rule/engine/database/type/CreateDatabaseRuleOperator.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.mode.manager.ContextManager;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import 
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
 
 import java.util.Collection;
@@ -49,8 +50,11 @@ public final class CreateDatabaseRuleOperator implements 
DatabaseRuleOperator {
     @SuppressWarnings("unchecked")
     public Collection<MetaDataVersion> operate(final 
DatabaseRuleDefinitionStatement sqlStatement, final ShardingSphereDatabase 
database, final RuleConfiguration currentRuleConfig) {
         RuleConfiguration toBeCreatedRuleConfig = 
executor.buildToBeCreatedRuleConfiguration(sqlStatement);
+        MetaDataContexts originalMetaDataContexts = 
contextManager.getMetaDataContexts();
         MetaDataManagerPersistService metaDataManagerPersistService = 
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService();
-        return 
metaDataManagerPersistService.alterRuleConfiguration(database.getName(), 
decorateRuleConfiguration(database, toBeCreatedRuleConfig));
+        Collection<MetaDataVersion> result = 
metaDataManagerPersistService.alterRuleConfiguration(database.getName(), 
decorateRuleConfiguration(database, toBeCreatedRuleConfig));
+        
metaDataManagerPersistService.afterRuleConfigurationAltered(database.getName(), 
originalMetaDataContexts, false);
+        return result;
     }
     
     @SuppressWarnings("unchecked")
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 b0e17d2c32d..c308b9e09c0 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
@@ -28,6 +28,7 @@ import 
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.metadata.version.MetaDataVersion;
 import 
org.apache.shardingsphere.infra.rule.attribute.datasource.StaticDataSourceRuleAttribute;
 import 
org.apache.shardingsphere.infra.yaml.config.pojo.rule.YamlRuleConfiguration;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import 
org.apache.shardingsphere.mode.persist.service.MetaDataManagerPersistService;
 import org.apache.shardingsphere.mode.tuple.annotation.RepositoryTupleEntity;
 import 
org.apache.shardingsphere.infra.yaml.config.swapper.rule.YamlRuleConfigurationSwapperEngine;
@@ -60,6 +61,7 @@ public final class DropDatabaseRuleOperator implements 
DatabaseRuleOperator {
             }
             // TODO refactor to new metadata refresh way
         }
+        MetaDataContexts originalMetaDataContexts = 
contextManager.getMetaDataContexts();
         MetaDataManagerPersistService metaDataManagerPersistService = 
contextManager.getPersistServiceFacade().getMetaDataManagerPersistService();
         RuleConfiguration toBeDroppedRuleConfig = 
executor.buildToBeDroppedRuleConfiguration(sqlStatement);
         
metaDataManagerPersistService.removeRuleConfigurationItem(database.getName(), 
toBeDroppedRuleConfig);
@@ -67,8 +69,11 @@ public final class DropDatabaseRuleOperator implements 
DatabaseRuleOperator {
         if (null != toBeAlteredRuleConfig && ((DatabaseRuleConfiguration) 
toBeAlteredRuleConfig).isEmpty()) {
             YamlRuleConfiguration yamlRuleConfig = new 
YamlRuleConfigurationSwapperEngine().swapToYamlRuleConfiguration(currentRuleConfig);
             
metaDataManagerPersistService.removeRuleConfiguration(database.getName(), 
Objects.requireNonNull(yamlRuleConfig.getClass().getAnnotation(RepositoryTupleEntity.class)).value());
+            
metaDataManagerPersistService.afterRuleConfigurationAltered(database.getName(), 
originalMetaDataContexts, true);
             return Collections.emptyList();
         }
-        return 
metaDataManagerPersistService.alterRuleConfiguration(database.getName(), 
toBeAlteredRuleConfig);
+        Collection<MetaDataVersion> result = 
metaDataManagerPersistService.alterRuleConfiguration(database.getName(), 
toBeAlteredRuleConfig);
+        
metaDataManagerPersistService.afterRuleConfigurationAltered(database.getName(), 
originalMetaDataContexts, false);
+        return result;
     }
 }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
index f18e143a36f..7b42ca00e77 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/ConfigurationManager.java
@@ -173,7 +173,7 @@ public final class ConfigurationManager {
             rules.removeIf(each -> 
each.getConfiguration().getClass().isAssignableFrom(ruleConfig.getClass()));
             rules.addAll(DatabaseRulesBuilder.build(databaseName, 
database.getProtocolType(), database.getRuleMetaData().getRules(),
                     ruleConfig, computeNodeInstanceContext, 
database.getResourceMetaData()));
-            refreshMetadata(databaseName, database, rules, false);
+            refreshMetadata(databaseName, database, rules);
         } catch (final SQLException ex) {
             log.error("Alter database: {} rule configurations failed", 
databaseName, ex);
         }
@@ -200,19 +200,18 @@ public final class ConfigurationManager {
                 rules.addAll(DatabaseRulesBuilder.build(databaseName, 
database.getProtocolType(), database.getRuleMetaData().getRules(),
                         ruleConfig, computeNodeInstanceContext, 
database.getResourceMetaData()));
             }
-            refreshMetadata(databaseName, database, rules, true);
+            refreshMetadata(databaseName, database, rules);
         } catch (final SQLException ex) {
             log.error("Drop database: {} rule configurations failed", 
databaseName, ex);
         }
     }
     
-    private void refreshMetadata(final String databaseName, final 
ShardingSphereDatabase database, final Collection<ShardingSphereRule> rules, 
final boolean isDropConfig) throws SQLException {
+    private void refreshMetadata(final String databaseName, final 
ShardingSphereDatabase database, final Collection<ShardingSphereRule> rules) 
throws SQLException {
         database.getRuleMetaData().getRules().clear();
         database.getRuleMetaData().getRules().addAll(rules);
         MetaDataContexts reloadMetaDataContexts = 
createMetaDataContextsByAlterRule(databaseName, 
database.getRuleMetaData().getConfigurations());
-        alterSchemaMetaData(databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
metaDataContexts.get().getMetaData().getDatabase(databaseName), isDropConfig);
         metaDataContexts.set(reloadMetaDataContexts);
-        
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas().putAll(newShardingSphereSchemas(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
+        
metaDataContexts.get().getMetaData().getDatabase(databaseName).getSchemas().putAll(buildShardingSphereSchemas(metaDataContexts.get().getMetaData().getDatabase(databaseName)));
     }
     
     private MetaDataContexts createMetaDataContextsByAlterRule(final String 
databaseName, final Collection<RuleConfiguration> ruleConfigs) throws 
SQLException {
@@ -350,7 +349,7 @@ public final class ConfigurationManager {
                 : ExternalMetaDataFactory.create(databaseName, databaseConfig, 
props, computeNodeInstanceContext);
     }
     
-    private Map<String, ShardingSphereSchema> newShardingSphereSchemas(final 
ShardingSphereDatabase database) {
+    private Map<String, ShardingSphereSchema> buildShardingSphereSchemas(final 
ShardingSphereDatabase database) {
         Map<String, ShardingSphereSchema> result = new 
LinkedHashMap<>(database.getSchemas().size(), 1F);
         database.getSchemas().forEach((key, value) -> result.put(key, new 
ShardingSphereSchema(value.getTables(), value.getViews())));
         return result;
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
index 07ca42177a3..19a57b69fe6 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/persist/service/MetaDataManagerPersistService.java
@@ -160,4 +160,14 @@ public interface MetaDataManagerPersistService {
      */
     default void afterStorageUnitsAltered(String databaseName, 
MetaDataContexts originalMetaDataContexts, boolean isDropConfig) {
     }
+    
+    /**
+     * After rule configuration altered.
+     *
+     * @param databaseName database name
+     * @param originalMetaDataContexts original meta data contexts
+     * @param isDropConfig is drop config
+     */
+    default void afterRuleConfigurationAltered(String databaseName, 
MetaDataContexts originalMetaDataContexts, boolean isDropConfig) {
+    }
 }
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
index 2ce8c8aedc9..e46cfd663b6 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/ClusterMetaDataManagerPersistService.java
@@ -183,6 +183,13 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
                 
originalMetaDataContexts.getMetaData().getDatabase(databaseName), isDropConfig);
     }
     
+    @Override
+    public void afterRuleConfigurationAltered(final String databaseName, final 
MetaDataContexts originalMetaDataContexts, final boolean isDropConfig) {
+        MetaDataContexts reloadMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
+        
metaDataContextManager.getConfigurationManager().alterSchemaMetaData(databaseName,
 reloadMetaDataContexts.getMetaData().getDatabase(databaseName),
+                
originalMetaDataContexts.getMetaData().getDatabase(databaseName), isDropConfig);
+    }
+    
     private void persistSchemaMetaData(final String databaseName, final 
MetaDataContexts reloadMetaDataContexts, final boolean isDropConfig) {
         if (isDropConfig) {
             
reloadMetaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName,
 schema) -> metaDataPersistService.getDatabaseMetaDataService()

Reply via email to