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/20 08:31:00 UTC

[shardingsphere] branch master updated: Add version to feature rule event. (#26452)

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 d0d9b5ac2bd Add version to feature rule event. (#26452)
d0d9b5ac2bd is described below

commit d0d9b5ac2bde6faf7f6d445fb0460cdaec8b9b3d
Author: Chuxin Chen <ch...@qq.com>
AuthorDate: Tue Jun 20 16:30:53 2023 +0800

    Add version to feature rule event. (#26452)
---
 .../BroadcastRuleConfigurationEventBuilder.java    | 13 ++++++----
 .../event/config/AddBroadcastTableEvent.java       |  4 +++
 .../event/config/AlterBroadcastTableEvent.java     |  4 +++
 .../event/config/DeleteBroadcastTableEvent.java    |  4 +++
 .../metadata/converter/BroadcastNodeConverter.java | 15 +++++++++++
 .../BroadcastConfigurationSubscriber.java          |  9 +++++++
 .../coverter/BroadcastNodeConverterTest.java}      | 30 ++++++++++++----------
 .../encrypt/subscriber/EncryptorSubscriber.java    |  6 +++++
 8 files changed, 66 insertions(+), 19 deletions(-)

diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleConfigurationEventBuilder.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleConfigurationEventBuilder.java
index 523983b9e1a..88ac3987f18 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleConfigurationEventBuilder.java
+++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/BroadcastRuleConfigurationEventBuilder.java
@@ -43,19 +43,22 @@ public final class BroadcastRuleConfigurationEventBuilder implements RuleConfigu
             return Optional.empty();
         }
         if (BroadcastNodeConverter.isTablesPath(event.getKey()) && !Strings.isNullOrEmpty(event.getValue())) {
-            return createBroadcastConfigEvent(databaseName, event);
+            Optional<String> tablesVersion = BroadcastNodeConverter.getTablesVersion(event.getKey());
+            if (tablesVersion.isPresent()) {
+                return createBroadcastConfigEvent(databaseName, Integer.parseInt(tablesVersion.get()), event);
+            }
         }
         return Optional.empty();
     }
     
-    private Optional<GovernanceEvent> createBroadcastConfigEvent(final String databaseName, final DataChangedEvent event) {
+    private Optional<GovernanceEvent> createBroadcastConfigEvent(final String databaseName, final int version, final DataChangedEvent event) {
         if (Type.ADDED == event.getType()) {
-            return Optional.of(new AddBroadcastTableEvent(databaseName, swapBroadcastTableRuleConfig(event.getValue())));
+            return Optional.of(new AddBroadcastTableEvent(databaseName, swapBroadcastTableRuleConfig(event.getValue()), event.getKey(), version));
         }
         if (Type.UPDATED == event.getType()) {
-            return Optional.of(new AlterBroadcastTableEvent(databaseName, swapBroadcastTableRuleConfig(event.getValue())));
+            return Optional.of(new AlterBroadcastTableEvent(databaseName, swapBroadcastTableRuleConfig(event.getValue()), event.getKey(), version));
         }
-        return Optional.of(new DeleteBroadcastTableEvent(databaseName));
+        return Optional.of(new DeleteBroadcastTableEvent(databaseName, event.getKey(), version));
     }
     
     private BroadcastRuleConfiguration swapBroadcastTableRuleConfig(final String yamlContext) {
diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/AddBroadcastTableEvent.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/AddBroadcastTableEvent.java
index 54a6508fe81..ce5be3d6e81 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/AddBroadcastTableEvent.java
+++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/AddBroadcastTableEvent.java
@@ -32,4 +32,8 @@ public final class AddBroadcastTableEvent implements GovernanceEvent {
     private final String databaseName;
     
     private final BroadcastRuleConfiguration config;
+    
+    private final String versionKey;
+    
+    private final int version;
 }
diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/AlterBroadcastTableEvent.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/AlterBroadcastTableEvent.java
index 626c8749c48..998e9536472 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/AlterBroadcastTableEvent.java
+++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/AlterBroadcastTableEvent.java
@@ -32,4 +32,8 @@ public final class AlterBroadcastTableEvent implements GovernanceEvent {
     private final String databaseName;
     
     private final BroadcastRuleConfiguration config;
+    
+    private final String versionKey;
+    
+    private final int version;
 }
diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/DeleteBroadcastTableEvent.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/DeleteBroadcastTableEvent.java
index bd624005d20..09132477652 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/DeleteBroadcastTableEvent.java
+++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/DeleteBroadcastTableEvent.java
@@ -29,4 +29,8 @@ import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
 public final class DeleteBroadcastTableEvent implements GovernanceEvent {
     
     private final String databaseName;
+    
+    private final String versionKey;
+    
+    private final int version;
 }
diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/metadata/converter/BroadcastNodeConverter.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/metadata/converter/BroadcastNodeConverter.java
index 78efb88b514..3f2e6dbdeee 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/metadata/converter/BroadcastNodeConverter.java
+++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/metadata/converter/BroadcastNodeConverter.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.broadcast.metadata.converter;
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
 
+import java.util.Optional;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -37,6 +38,8 @@ public final class BroadcastNodeConverter {
     
     private static final String VERSION_PATTERN = "/versions/[0-9]+";
     
+    private static final String VERSION_PATH = "/versions/([0-9]+)";
+    
     /**
      * Get tables path.
      *
@@ -69,4 +72,16 @@ public final class BroadcastNodeConverter {
         Matcher matcher = pattern.matcher(rulePath);
         return matcher.find();
     }
+    
+    /**
+     * Get tables version.
+     *
+     * @param rulePath rule path
+     * @return tables version
+     */
+    public static Optional<String> getTablesVersion(final String rulePath) {
+        Pattern pattern = Pattern.compile(RULES_NODE_PREFIX + ROOT_NODE + "/" + TABLES_NODE + VERSION_PATH, Pattern.CASE_INSENSITIVE);
+        Matcher matcher = pattern.matcher(rulePath);
+        return matcher.find() ? Optional.of(matcher.group(3)) : Optional.empty();
+    }
 }
diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/subscriber/BroadcastConfigurationSubscriber.java b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/subscriber/BroadcastConfigurationSubscriber.java
index b5789233479..3180c28f8c5 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/subscriber/BroadcastConfigurationSubscriber.java
+++ b/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/subscriber/BroadcastConfigurationSubscriber.java
@@ -57,6 +57,9 @@ public final class BroadcastConfigurationSubscriber implements RuleConfiguration
      */
     @Subscribe
     public synchronized void renew(final AddBroadcastTableEvent event) {
+        if (event.getVersion() < instanceContext.getModeContextManager().getActiveVersionByKey(event.getVersionKey())) {
+            return;
+        }
         ShardingSphereDatabase database = databases.get(event.getDatabaseName());
         BroadcastRuleConfiguration needToAddedConfig = event.getConfig();
         Optional<BroadcastRule> rule = database.getRuleMetaData().findSingleRule(BroadcastRule.class);
@@ -78,6 +81,9 @@ public final class BroadcastConfigurationSubscriber implements RuleConfiguration
      */
     @Subscribe
     public synchronized void renew(final AlterBroadcastTableEvent event) {
+        if (event.getVersion() < instanceContext.getModeContextManager().getActiveVersionByKey(event.getVersionKey())) {
+            return;
+        }
         ShardingSphereDatabase database = databases.get(event.getDatabaseName());
         BroadcastRuleConfiguration needToAlteredConfig = event.getConfig();
         BroadcastRuleConfiguration config = database.getRuleMetaData().getSingleRule(BroadcastRule.class).getConfiguration();
@@ -93,6 +99,9 @@ public final class BroadcastConfigurationSubscriber implements RuleConfiguration
      */
     @Subscribe
     public synchronized void renew(final DeleteBroadcastTableEvent event) {
+        if (event.getVersion() < instanceContext.getModeContextManager().getActiveVersionByKey(event.getVersionKey())) {
+            return;
+        }
         ShardingSphereDatabase database = databases.get(event.getDatabaseName());
         BroadcastRuleConfiguration config = database.getRuleMetaData().getSingleRule(BroadcastRule.class).getConfiguration();
         config.getTables().clear();
diff --git a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/AddBroadcastTableEvent.java b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/metadata/coverter/BroadcastNodeConverterTest.java
similarity index 54%
copy from features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/AddBroadcastTableEvent.java
copy to features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/metadata/coverter/BroadcastNodeConverterTest.java
index 54a6508fe81..38cfd212f8f 100644
--- a/features/broadcast/core/src/main/java/org/apache/shardingsphere/broadcast/event/config/AddBroadcastTableEvent.java
+++ b/features/broadcast/core/src/test/java/org/apache/shardingsphere/broadcast/metadata/coverter/BroadcastNodeConverterTest.java
@@ -15,21 +15,23 @@
  * limitations under the License.
  */
 
-package org.apache.shardingsphere.broadcast.event.config;
+package org.apache.shardingsphere.broadcast.metadata.coverter;
 
-import lombok.Getter;
-import lombok.RequiredArgsConstructor;
-import org.apache.shardingsphere.broadcast.api.config.BroadcastRuleConfiguration;
-import org.apache.shardingsphere.infra.rule.event.GovernanceEvent;
+import org.apache.shardingsphere.broadcast.metadata.converter.BroadcastNodeConverter;
+import org.junit.jupiter.api.Test;
 
-/**
- * Add broadcast table event.
- */
-@RequiredArgsConstructor
-@Getter
-public final class AddBroadcastTableEvent implements GovernanceEvent {
-    
-    private final String databaseName;
+import java.util.Optional;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
+class BroadcastNodeConverterTest {
     
-    private final BroadcastRuleConfiguration config;
+    @Test
+    void assertGetTablesVersion() {
+        Optional<String> actual = BroadcastNodeConverter.getTablesVersion("/metadata/foo_db/rules/broadcast/tables/versions/1");
+        assertTrue(actual.isPresent());
+        assertThat(actual.get(), is("1"));
+    }
 }
diff --git a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/subscriber/EncryptorSubscriber.java b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/subscriber/EncryptorSubscriber.java
index aad6f95523d..c4b0bf2698f 100644
--- a/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/subscriber/EncryptorSubscriber.java
+++ b/features/encrypt/core/src/main/java/org/apache/shardingsphere/encrypt/subscriber/EncryptorSubscriber.java
@@ -55,6 +55,9 @@ public final class EncryptorSubscriber implements RuleConfigurationSubscribeCoor
      */
     @Subscribe
     public synchronized void renew(final AlterEncryptorEvent event) {
+        if (event.getVersion() < instanceContext.getModeContextManager().getActiveVersionByKey(event.getVersionKey())) {
+            return;
+        }
         ShardingSphereDatabase database = databases.get(event.getDatabaseName());
         EncryptRuleConfiguration config = (EncryptRuleConfiguration) database.getRuleMetaData().getSingleRule(EncryptRule.class).getConfiguration();
         config.getEncryptors().put(event.getEncryptorName(), event.getConfig());
@@ -67,6 +70,9 @@ public final class EncryptorSubscriber implements RuleConfigurationSubscribeCoor
      */
     @Subscribe
     public synchronized void renew(final DeleteEncryptorEvent event) {
+        if (event.getVersion() < instanceContext.getModeContextManager().getActiveVersionByKey(event.getVersionKey())) {
+            return;
+        }
         ShardingSphereDatabase database = databases.get(event.getDatabaseName());
         EncryptRuleConfiguration config = (EncryptRuleConfiguration) database.getRuleMetaData().getSingleRule(EncryptRule.class).getConfiguration();
         config.getEncryptors().remove(event.getEncryptorName());