You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by zh...@apache.org on 2023/06/24 13:13:38 UTC

[shardingsphere] branch master updated: Refactor single event & subscriber (#26480)

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

zhaojinchao 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 ffcd51c5692 Refactor single event & subscriber (#26480)
ffcd51c5692 is described below

commit ffcd51c5692e381b685f390628403b9a325df634
Author: ChenJiaHao <Pa...@163.com>
AuthorDate: Sat Jun 24 21:13:31 2023 +0800

    Refactor single event & subscriber (#26480)
---
 .../event/SingleRuleConfigurationEventBuilder.java    | 19 +++----------------
 .../single/event/config/AddSingleTableEvent.java      |  5 +++--
 .../single/event/config/AlterSingleTableEvent.java    |  5 +++--
 .../metadata/converter/SingleNodeConverter.java       |  8 +++++---
 .../subscriber/SingleConfigurationSubscriber.java     | 18 ++++++++++++++++--
 5 files changed, 30 insertions(+), 25 deletions(-)

diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleConfigurationEventBuilder.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleConfigurationEventBuilder.java
index b0a746176e4..69d9da5c3ea 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleConfigurationEventBuilder.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/SingleRuleConfigurationEventBuilder.java
@@ -19,16 +19,13 @@ package org.apache.shardingsphere.single.event;
 
 import com.google.common.base.Strings;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
-import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import org.apache.shardingsphere.mode.event.DataChangedEvent;
 import org.apache.shardingsphere.mode.event.DataChangedEvent.Type;
 import org.apache.shardingsphere.mode.spi.RuleConfigurationEventBuilder;
-import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
 import org.apache.shardingsphere.single.event.config.AddSingleTableEvent;
 import org.apache.shardingsphere.single.event.config.AlterSingleTableEvent;
 import org.apache.shardingsphere.single.event.config.DeleteSingleTableEvent;
 import org.apache.shardingsphere.single.metadata.converter.SingleNodeConverter;
-import org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfiguration;
 
 import java.util.Optional;
 
@@ -42,7 +39,7 @@ public final class SingleRuleConfigurationEventBuilder implements RuleConfigurat
         if (!SingleNodeConverter.isSinglePath(event.getKey()) || Strings.isNullOrEmpty(event.getValue())) {
             return Optional.empty();
         }
-        if (SingleNodeConverter.isTablesPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
+        if (SingleNodeConverter.isTablesActiveVersionPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
             return createSingleConfigEvent(databaseName, event);
         }
         return Optional.empty();
@@ -50,21 +47,11 @@ public final class SingleRuleConfigurationEventBuilder implements RuleConfigurat
     
     private Optional<GovernanceEvent> createSingleConfigEvent(final String databaseName, final DataChangedEvent event) {
         if (Type.ADDED == event.getType()) {
-            return Optional.of(new AddSingleTableEvent(databaseName, swapSingleTableRuleConfig(event.getValue())));
+            return Optional.of(new AddSingleTableEvent(databaseName, event.getKey(), event.getValue()));
         }
         if (Type.UPDATED == event.getType()) {
-            return Optional.of(new AlterSingleTableEvent(databaseName, swapSingleTableRuleConfig(event.getValue())));
+            return Optional.of(new AlterSingleTableEvent(databaseName, event.getKey(), event.getValue()));
         }
         return Optional.of(new DeleteSingleTableEvent(databaseName));
     }
-    
-    private SingleRuleConfiguration swapSingleTableRuleConfig(final String yamlContext) {
-        SingleRuleConfiguration result = new SingleRuleConfiguration();
-        YamlSingleRuleConfiguration yamlSingleRuleConfiguration = YamlEngine.unmarshal(yamlContext, YamlSingleRuleConfiguration.class);
-        if (null != yamlSingleRuleConfiguration.getTables()) {
-            result.getTables().addAll(yamlSingleRuleConfiguration.getTables());
-        }
-        result.setDefaultDataSource(yamlSingleRuleConfiguration.getDefaultDataSource());
-        return result;
-    }
 }
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/config/AddSingleTableEvent.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/config/AddSingleTableEvent.java
index 86591f2c0e8..9728b6663ed 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/config/AddSingleTableEvent.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/config/AddSingleTableEvent.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.single.event.config;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
-import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
 
 /**
  * Add single table event.
@@ -31,5 +30,7 @@ public final class AddSingleTableEvent implements GovernanceEvent {
     
     private final String databaseName;
     
-    private final SingleRuleConfiguration config;
+    private final String activeVersionKey;
+    
+    private final String activeVersion;
 }
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/config/AlterSingleTableEvent.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/config/AlterSingleTableEvent.java
index 19919b8decd..4241dc9ce41 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/config/AlterSingleTableEvent.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/event/config/AlterSingleTableEvent.java
@@ -20,7 +20,6 @@ package org.apache.shardingsphere.single.event.config;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
-import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
 
 /**
  * Alter single table event.
@@ -31,5 +30,7 @@ public final class AlterSingleTableEvent implements GovernanceEvent {
     
     private final String databaseName;
     
-    private final SingleRuleConfiguration config;
+    private final String activeVersionKey;
+    
+    private final String activeVersion;
 }
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/converter/SingleNodeConverter.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/converter/SingleNodeConverter.java
index 37c001a237a..32fe7c9d4aa 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/converter/SingleNodeConverter.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/metadata/converter/SingleNodeConverter.java
@@ -37,6 +37,8 @@ public final class SingleNodeConverter {
     
     private static final String VERSION_PATTERN = "/versions/\\d+";
     
+    private static final String RULE_ACTIVE_VERSION = "/active_version$";
+    
     /**
      * Get tables path.
      *
@@ -59,13 +61,13 @@ public final class SingleNodeConverter {
     }
     
     /**
-     * Is tables path.
+     * Is tables active version path.
      *
      * @param rulePath rule path
      * @return true or false
      */
-    public static boolean isTablesPath(final String rulePath) {
-        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + VERSION_PATTERN, Pattern.CASE_INSENSITIVE);
+    public static boolean isTablesActiveVersionPath(final String rulePath) {
+        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + RULE_ACTIVE_VERSION, Pattern.CASE_INSENSITIVE);
         Matcher matcher = pattern.matcher(rulePath);
         return matcher.find();
     }
diff --git a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/subscriber/SingleConfigurationSubscriber.java b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/subscriber/SingleConfigurationSubscriber.java
index 928f279282d..395acea2b22 100644
--- a/kernel/single/core/src/main/java/org/apache/shardingsphere/single/subscriber/SingleConfigurationSubscriber.java
+++ b/kernel/single/core/src/main/java/org/apache/shardingsphere/single/subscriber/SingleConfigurationSubscriber.java
@@ -22,12 +22,14 @@ import lombok.RequiredArgsConstructor;
 import org.apache.shardingsphere.infra.instance.InstanceContext;
 import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
 import org.apache.shardingsphere.infra.rule.RuleConfigurationSubscribeCoordinator;
+import org.apache.shardingsphere.infra.util.yaml.YamlEngine;
 import org.apache.shardingsphere.mode.event.config.DatabaseRuleConfigurationChangedEvent;
 import org.apache.shardingsphere.single.api.config.SingleRuleConfiguration;
 import org.apache.shardingsphere.single.event.config.AddSingleTableEvent;
 import org.apache.shardingsphere.single.event.config.AlterSingleTableEvent;
 import org.apache.shardingsphere.single.event.config.DeleteSingleTableEvent;
 import org.apache.shardingsphere.single.rule.SingleRule;
+import org.apache.shardingsphere.single.yaml.config.pojo.YamlSingleRuleConfiguration;
 
 import java.util.Map;
 import java.util.Optional;
@@ -58,7 +60,8 @@ public final class SingleConfigurationSubscriber implements RuleConfigurationSub
     @Subscribe
     public synchronized void renew(final AddSingleTableEvent event) {
         ShardingSphereDatabase database = databases.get(event.getDatabaseName());
-        SingleRuleConfiguration needToAddedConfig = event.getConfig();
+        SingleRuleConfiguration needToAddedConfig = swapSingleTableRuleConfig(
+                instanceContext.getModeContextManager().getVersionPathByActiveVersionKey(event.getActiveVersionKey(), event.getActiveVersion()));
         Optional<SingleRule> rule = database.getRuleMetaData().findSingleRule(SingleRule.class);
         SingleRuleConfiguration config;
         if (rule.isPresent()) {
@@ -79,7 +82,8 @@ public final class SingleConfigurationSubscriber implements RuleConfigurationSub
     @Subscribe
     public synchronized void renew(final AlterSingleTableEvent event) {
         ShardingSphereDatabase database = databases.get(event.getDatabaseName());
-        SingleRuleConfiguration needToAlteredConfig = event.getConfig();
+        SingleRuleConfiguration needToAlteredConfig = swapSingleTableRuleConfig(
+                instanceContext.getModeContextManager().getVersionPathByActiveVersionKey(event.getActiveVersionKey(), event.getActiveVersion()));
         SingleRuleConfiguration config = database.getRuleMetaData().getSingleRule(SingleRule.class).getConfiguration();
         config.setTables(needToAlteredConfig.getTables());
         config.setDefaultDataSource(needToAlteredConfig.getDefaultDataSource().orElse(null));
@@ -99,4 +103,14 @@ public final class SingleConfigurationSubscriber implements RuleConfigurationSub
         config.setDefaultDataSource(null);
         instanceContext.getEventBusContext().post(new DatabaseRuleConfigurationChangedEvent(event.getDatabaseName(), config));
     }
+    
+    private SingleRuleConfiguration swapSingleTableRuleConfig(final String yamlContext) {
+        SingleRuleConfiguration result = new SingleRuleConfiguration();
+        YamlSingleRuleConfiguration yamlSingleRuleConfiguration = YamlEngine.unmarshal(yamlContext, YamlSingleRuleConfiguration.class);
+        if (null != yamlSingleRuleConfiguration.getTables()) {
+            result.getTables().addAll(yamlSingleRuleConfiguration.getTables());
+        }
+        result.setDefaultDataSource(yamlSingleRuleConfiguration.getDefaultDataSource());
+        return result;
+    }
 }