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());