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 7cc8846c8e9 Refactor MetaDataContextsFactory (#32353)
7cc8846c8e9 is described below

commit 7cc8846c8e9e1a785551e40be06eaeedffbbe277
Author: Liang Zhang <[email protected]>
AuthorDate: Thu Aug 1 16:05:00 2024 +0800

    Refactor MetaDataContextsFactory (#32353)
    
    * Refactor MetaDataContextsFactory
    
    * Refactor MetaDataContextsFactory
---
 .../mode/spi/RulePersistDecorator.java             |  8 +++++++
 .../mode/metadata/MetaDataContextsFactory.java     | 26 +++++++++++++++++++++-
 2 files changed, 33 insertions(+), 1 deletion(-)

diff --git 
a/mode/api/src/main/java/org/apache/shardingsphere/mode/spi/RulePersistDecorator.java
 
b/mode/api/src/main/java/org/apache/shardingsphere/mode/spi/RulePersistDecorator.java
index e9a248c7a22..f77ef058135 100644
--- 
a/mode/api/src/main/java/org/apache/shardingsphere/mode/spi/RulePersistDecorator.java
+++ 
b/mode/api/src/main/java/org/apache/shardingsphere/mode/spi/RulePersistDecorator.java
@@ -18,6 +18,7 @@
 package org.apache.shardingsphere.mode.spi;
 
 import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.spi.annotation.SingletonSPI;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPI;
 
@@ -35,6 +36,13 @@ public interface RulePersistDecorator extends TypedSPI {
      */
     RuleConfiguration restore(RuleConfiguration ruleConfig);
     
+    /**
+     * Get rule type.
+     *
+     * @return rule type
+     */
+    Class<? extends ShardingSphereRule> getRuleType();
+    
     @Override
     Class<? extends RuleConfiguration> getType();
 }
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
index 94262ac18ae..1079e8a2bf6 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextsFactory.java
@@ -44,17 +44,22 @@ import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereSchemaD
 import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereStatistics;
 import 
org.apache.shardingsphere.infra.metadata.statistics.ShardingSphereTableData;
 import 
org.apache.shardingsphere.infra.metadata.statistics.builder.ShardingSphereStatisticsBuilder;
+import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import org.apache.shardingsphere.infra.rule.builder.global.GlobalRulesBuilder;
+import org.apache.shardingsphere.infra.rule.scope.GlobalRule;
+import org.apache.shardingsphere.infra.spi.ShardingSphereServiceLoader;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.metadata.factory.ExternalMetaDataFactory;
 import org.apache.shardingsphere.metadata.factory.InternalMetaDataFactory;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
 import org.apache.shardingsphere.mode.manager.ContextManagerBuilderParameter;
 import org.apache.shardingsphere.mode.metadata.manager.SwitchingResource;
+import org.apache.shardingsphere.mode.spi.RulePersistDecorator;
 
 import javax.sql.DataSource;
 import java.sql.SQLException;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -94,7 +99,9 @@ public final class MetaDataContextsFactory {
         ShardingSphereMetaData shardingSphereMetaData = new 
ShardingSphereMetaData(databases, globalResourceMetaData, globalRuleMetaData, 
props);
         ShardingSphereStatistics shardingSphereStatistics = 
initStatistics(persistService, shardingSphereMetaData);
         MetaDataContexts result = new MetaDataContexts(shardingSphereMetaData, 
shardingSphereStatistics);
-        if (!isDatabaseMetaDataExisted) {
+        if (isDatabaseMetaDataExisted) {
+            restoreRules(result, computeNodeInstanceContext);
+        } else {
             persistDatabaseConfigurations(result, param, persistService);
             persistMetaData(result, persistService);
         }
@@ -178,6 +185,23 @@ public final class MetaDataContextsFactory {
         }
     }
     
+    private static void restoreRules(final MetaDataContexts metaDataContexts, 
final ComputeNodeInstanceContext computeNodeInstanceContext) {
+        if (!computeNodeInstanceContext.isCluster()) {
+            return;
+        }
+        for (RulePersistDecorator each : 
ShardingSphereServiceLoader.getServiceInstances(RulePersistDecorator.class)) {
+            ShardingSphereRule rule = 
metaDataContexts.getMetaData().getGlobalRuleMetaData().getSingleRule(each.getRuleType());
+            if (!(rule instanceof GlobalRule)) {
+                continue;
+            }
+            
metaDataContexts.getMetaData().getGlobalRuleMetaData().getRules().removeIf(eachRule
 -> each.getRuleType().isAssignableFrom(rule.getClass()));
+            RuleConfiguration restoredRuleConfig = 
each.restore(rule.getConfiguration());
+            ShardingSphereRule rebuiltRule = GlobalRulesBuilder.buildRules(
+                    Collections.singleton(restoredRuleConfig), 
metaDataContexts.getMetaData().getDatabases(), 
metaDataContexts.getMetaData().getProps()).iterator().next();
+            
metaDataContexts.getMetaData().getGlobalRuleMetaData().getRules().add(rebuiltRule);
+        }
+    }
+    
     private static void persistDatabaseConfigurations(final MetaDataContexts 
metadataContexts, final ContextManagerBuilderParameter param, final 
MetaDataPersistService persistService) {
         Collection<RuleConfiguration> globalRuleConfigs = 
param.getGlobalRuleConfigs();
         persistService.persistGlobalRuleConfiguration(globalRuleConfigs, 
param.getProps());

Reply via email to