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

yx9o 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 2849b62ae77 Get reloaded metadata asynchronously after rule 
configuration altered (#34236)
2849b62ae77 is described below

commit 2849b62ae77a182306b1cefe726c22e54c5e4e6f
Author: Haoran Meng <[email protected]>
AuthorDate: Fri Jan 3 16:27:09 2025 +0800

    Get reloaded metadata asynchronously after rule configuration altered 
(#34236)
---
 .../mode/metadata/MetaDataContextHolder.java       | 62 ++++++++++++++++++++++
 .../mode/metadata/MetaDataContextManager.java      |  5 +-
 .../manager/DatabaseRuleConfigurationManager.java  | 16 +++---
 .../mode/metadata/MetaDataContextHolderTest.java   | 46 ++++++++++++++++
 .../ClusterMetaDataManagerPersistService.java      | 16 +++---
 5 files changed, 130 insertions(+), 15 deletions(-)

diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextHolder.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextHolder.java
new file mode 100644
index 00000000000..9a8a86852e1
--- /dev/null
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextHolder.java
@@ -0,0 +1,62 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.mode.metadata;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * Meta data context holder.
+ */
+@AllArgsConstructor
+@Slf4j
+public final class MetaDataContextHolder {
+    
+    @Getter
+    private final AtomicReference<MetaDataContexts> metaDataContexts;
+    
+    private final CompletableFuture<MetaDataContexts> future = new 
CompletableFuture<>();
+    
+    /**
+     * Get meta data contexts.
+     *
+     * @return meta data contexts
+     */
+    public MetaDataContexts getMetaDataContextsAsync() {
+        try {
+            return future.get(5, TimeUnit.SECONDS);
+        } catch (final InterruptedException | 
java.util.concurrent.ExecutionException | java.util.concurrent.TimeoutException 
ex) {
+            return metaDataContexts.get();
+        }
+    }
+    
+    /**
+     * Update meta data contexts.
+     *
+     * @param reloadMetaDataContexts reload meta data contexts
+     */
+    public void updateMetaDataContextsAsync(final MetaDataContexts 
reloadMetaDataContexts) {
+        metaDataContexts.set(reloadMetaDataContexts);
+        future.complete(reloadMetaDataContexts);
+    }
+}
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
index 7da1734731d..4dee15f38ee 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/MetaDataContextManager.java
@@ -74,13 +74,16 @@ public class MetaDataContextManager {
     
     private final RuleConfigurationPersistDecorateEngine 
ruleConfigPersistDecorateEngine;
     
+    private final MetaDataContextHolder metaDataContextHolder;
+    
     public MetaDataContextManager(final AtomicReference<MetaDataContexts> 
metaDataContexts, final ComputeNodeInstanceContext computeNodeInstanceContext, 
final PersistRepository repository) {
         this.metaDataContexts = metaDataContexts;
         this.computeNodeInstanceContext = computeNodeInstanceContext;
+        metaDataContextHolder = new MetaDataContextHolder(metaDataContexts);
         resourceSwitchManager = new ResourceSwitchManager();
         databaseManager = new 
ShardingSphereDatabaseDataManager(metaDataContexts);
         storageUnitManager = new StorageUnitManager(metaDataContexts, 
computeNodeInstanceContext, repository, resourceSwitchManager);
-        databaseRuleConfigurationManager = new 
DatabaseRuleConfigurationManager(metaDataContexts, computeNodeInstanceContext, 
repository);
+        databaseRuleConfigurationManager = new 
DatabaseRuleConfigurationManager(metaDataContextHolder, 
computeNodeInstanceContext, repository);
         schemaMetaDataManager = new SchemaMetaDataManager(metaDataContexts, 
repository);
         ruleItemManager = new RuleItemManager(metaDataContexts, repository, 
databaseRuleConfigurationManager);
         globalConfigurationManager = new 
GlobalConfigurationManager(metaDataContexts, repository);
diff --git 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
index 50361e42ecd..da56fddff54 100644
--- 
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
+++ 
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/DatabaseRuleConfigurationManager.java
@@ -27,6 +27,7 @@ import 
org.apache.shardingsphere.infra.rule.ShardingSphereRule;
 import 
org.apache.shardingsphere.infra.rule.builder.database.DatabaseRulesBuilder;
 import org.apache.shardingsphere.infra.spi.type.typed.TypedSPILoader;
 import org.apache.shardingsphere.metadata.persist.MetaDataPersistService;
+import org.apache.shardingsphere.mode.metadata.MetaDataContextHolder;
 import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
 import org.apache.shardingsphere.mode.metadata.MetaDataContextsFactory;
 import org.apache.shardingsphere.mode.spi.PersistRepository;
@@ -35,7 +36,6 @@ import java.sql.SQLException;
 import java.util.Collection;
 import java.util.LinkedList;
 import java.util.Optional;
-import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 
 /**
@@ -43,15 +43,15 @@ import java.util.stream.Collectors;
  */
 public final class DatabaseRuleConfigurationManager {
     
-    private final AtomicReference<MetaDataContexts> metaDataContexts;
+    private final MetaDataContextHolder metaDataContextHolder;
     
     private final ComputeNodeInstanceContext computeNodeInstanceContext;
     
     private final MetaDataPersistService metaDataPersistService;
     
-    public DatabaseRuleConfigurationManager(final 
AtomicReference<MetaDataContexts> metaDataContexts, final 
ComputeNodeInstanceContext computeNodeInstanceContext,
+    public DatabaseRuleConfigurationManager(final MetaDataContextHolder 
metaDataContextHolder, final ComputeNodeInstanceContext 
computeNodeInstanceContext,
                                             final PersistRepository 
repository) {
-        this.metaDataContexts = metaDataContexts;
+        this.metaDataContextHolder = metaDataContextHolder;
         this.computeNodeInstanceContext = computeNodeInstanceContext;
         metaDataPersistService = new MetaDataPersistService(repository);
     }
@@ -65,7 +65,7 @@ public final class DatabaseRuleConfigurationManager {
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
     public synchronized void alterRuleConfiguration(final String databaseName, 
final RuleConfiguration ruleConfig) throws SQLException {
-        ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+        ShardingSphereDatabase database = 
metaDataContextHolder.getMetaDataContexts().get().getMetaData().getDatabase(databaseName);
         Collection<ShardingSphereRule> rules = new 
LinkedList<>(database.getRuleMetaData().getRules());
         Optional<ShardingSphereRule> toBeChangedRule = 
rules.stream().filter(each -> 
each.getConfiguration().getClass().equals(ruleConfig.getClass())).findFirst();
         if (toBeChangedRule.isPresent() && toBeChangedRule.get() instanceof 
PartialRuleUpdateSupported && ((PartialRuleUpdateSupported) 
toBeChangedRule.get()).partialUpdate(ruleConfig)) {
@@ -87,7 +87,7 @@ public final class DatabaseRuleConfigurationManager {
      */
     @SuppressWarnings({"unchecked", "rawtypes"})
     public synchronized void dropRuleConfiguration(final String databaseName, 
final RuleConfiguration ruleConfig) throws SQLException {
-        ShardingSphereDatabase database = 
metaDataContexts.get().getMetaData().getDatabase(databaseName);
+        ShardingSphereDatabase database = 
metaDataContextHolder.getMetaDataContexts().get().getMetaData().getDatabase(databaseName);
         Collection<ShardingSphereRule> rules = new 
LinkedList<>(database.getRuleMetaData().getRules());
         Optional<ShardingSphereRule> toBeChangedRule = 
rules.stream().filter(each -> 
each.getConfiguration().getClass().equals(ruleConfig.getClass())).findFirst();
         if (toBeChangedRule.isPresent() && toBeChangedRule.get() instanceof 
PartialRuleUpdateSupported && ((PartialRuleUpdateSupported) 
toBeChangedRule.get()).partialUpdate(ruleConfig)) {
@@ -104,8 +104,8 @@ public final class DatabaseRuleConfigurationManager {
     
     private void refreshMetadata(final String databaseName, final 
Collection<RuleConfiguration> ruleConfigurations) throws SQLException {
         MetaDataContexts reloadMetaDataContexts = 
MetaDataContextsFactory.createByAlterRule(databaseName, false,
-                ruleConfigurations, metaDataContexts.get(), 
metaDataPersistService, computeNodeInstanceContext);
-        metaDataContexts.set(reloadMetaDataContexts);
+                ruleConfigurations, 
metaDataContextHolder.getMetaDataContexts().get(), metaDataPersistService, 
computeNodeInstanceContext);
+        
metaDataContextHolder.updateMetaDataContextsAsync(reloadMetaDataContexts);
     }
     
     private Collection<RuleConfiguration> getRuleConfigurations(final 
Collection<ShardingSphereRule> rules) {
diff --git 
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextHolderTest.java
 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextHolderTest.java
new file mode 100644
index 00000000000..da176b16f1b
--- /dev/null
+++ 
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/MetaDataContextHolderTest.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.shardingsphere.mode.metadata;
+
+import org.junit.jupiter.api.Test;
+
+import java.util.concurrent.atomic.AtomicReference;
+
+import static org.hamcrest.CoreMatchers.is;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertNotEquals;
+import static org.mockito.Mockito.mock;
+
+class MetaDataContextHolderTest {
+    
+    private final MetaDataContexts metaDataContexts = 
mock(MetaDataContexts.class);
+    
+    private final MetaDataContextHolder metaDataContextHolder = new 
MetaDataContextHolder(new AtomicReference<>(metaDataContexts));
+    
+    @Test
+    void assertGetMetaDataContextsAsync() {
+        assertThat(metaDataContextHolder.getMetaDataContextsAsync(), 
is(metaDataContexts));
+    }
+    
+    @Test
+    void assertUpdateMetaDataContextsAsync() {
+        assertThat(metaDataContextHolder.getMetaDataContextsAsync(), 
is(metaDataContexts));
+        
metaDataContextHolder.updateMetaDataContextsAsync(mock(MetaDataContexts.class));
+        assertNotEquals(metaDataContextHolder.getMetaDataContextsAsync(), 
metaDataContexts);
+    }
+}
diff --git 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
index 421ea385b9b..f6f9635da24 100644
--- 
a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
+++ 
b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/persist/service/ClusterMetaDataManagerPersistService.java
@@ -215,9 +215,11 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
     }
     
     private void afterRuleConfigurationAltered(final String databaseName, 
final MetaDataContexts originalMetaDataContexts) {
-        MetaDataContexts reloadMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
-        metaDataPersistService.persistReloadDatabaseByAlter(
-                databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
+        MetaDataContexts reloadMetaDataContexts = 
metaDataContextManager.getMetaDataContextHolder().getMetaDataContextsAsync();
+        if (!reloadMetaDataContexts.equals(originalMetaDataContexts)) {
+            metaDataPersistService.persistReloadDatabaseByAlter(
+                    databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
+        }
     }
     
     @Override
@@ -235,9 +237,11 @@ public final class ClusterMetaDataManagerPersistService 
implements MetaDataManag
     }
     
     private void afterRuleConfigurationDropped(final String databaseName, 
final MetaDataContexts originalMetaDataContexts) {
-        MetaDataContexts reloadMetaDataContexts = 
metaDataContextManager.getMetaDataContexts().get();
-        metaDataPersistService.persistReloadDatabaseByDrop(
-                databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
+        MetaDataContexts reloadMetaDataContexts = 
metaDataContextManager.getMetaDataContextHolder().getMetaDataContextsAsync();
+        if (!reloadMetaDataContexts.equals(originalMetaDataContexts)) {
+            metaDataPersistService.persistReloadDatabaseByDrop(
+                    databaseName, 
reloadMetaDataContexts.getMetaData().getDatabase(databaseName), 
originalMetaDataContexts.getMetaData().getDatabase(databaseName));
+        }
     }
     
     @Override

Reply via email to