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

kimmking 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 583fac5  Add cache manager for configuration changes (#8846)
583fac5 is described below

commit 583fac57195af09d4bf6a84ea5e19ec213ba93dc
Author: Haoran Meng <[email protected]>
AuthorDate: Mon Jan 4 15:32:16 2021 +0800

    Add cache manager for configuration changes (#8846)
    
    * Add cache manager for configuration changes
    
    * Add cache manager for configuration changes
    
    * Add cache manager for configuration changes
---
 .../governance/core/config/ConfigCacheManager.java | 56 ++++++++++++++++++++++
 .../governance/core/config/ConfigCenter.java       | 45 +++++++++++------
 .../governance/core/config/ConfigCenterTest.java   |  5 +-
 3 files changed, 89 insertions(+), 17 deletions(-)

diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/ConfigCacheManager.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/ConfigCacheManager.java
new file mode 100644
index 0000000..3b334fc
--- /dev/null
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/ConfigCacheManager.java
@@ -0,0 +1,56 @@
+/*
+ * 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.governance.core.config;
+
+import com.google.common.base.Joiner;
+import 
org.apache.shardingsphere.governance.repository.api.ConfigurationRepository;
+
+import java.util.UUID;
+
+/**
+ * Config cache manager.
+ */
+public final class ConfigCacheManager {
+    
+    private static final String CACHE_KEY = "cache";
+    
+    private static final String PATH_SEPARATOR = "/";
+    
+    private final ConfigurationRepository repository;
+    
+    public ConfigCacheManager(final ConfigurationRepository repository) {
+        this.repository = repository;
+    }
+    
+    /**
+     * Cache configuration.
+     * 
+     * @param key key
+     * @param configuration configuration
+     * @return cache id
+     */
+    public String cache(final String key, final String configuration) {
+        String cacheId = getCacheId();
+        repository.persist(Joiner.on(PATH_SEPARATOR).join(key, CACHE_KEY, 
cacheId), configuration);
+        return cacheId;
+    }
+    
+    private String getCacheId() {
+        return UUID.randomUUID().toString().replace("-", "");
+    }
+}
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/ConfigCenter.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/ConfigCenter.java
index 7ebe76d..32c4bc5 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/ConfigCenter.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/main/java/org/apache/shardingsphere/governance/core/config/ConfigCenter.java
@@ -76,9 +76,12 @@ public final class ConfigCenter {
     
     private final ConfigurationRepository repository;
     
+    private final ConfigCacheManager configCacheManager;
+    
     public ConfigCenter(final ConfigurationRepository repository) {
         node = new ConfigCenterNode();
         this.repository = repository;
+        configCacheManager = new ConfigCacheManager(repository);
         ShardingSphereEventBus.getInstance().register(this);
     }
     
@@ -126,7 +129,7 @@ public final class ConfigCenter {
      */
     @Subscribe
     public synchronized void renew(final RuleConfigurationsPersistEvent event) 
{
-        persistRuleConfigurations(event.getSchemaName(), 
event.getRuleConfigurations());
+        cacheRuleConfigurations(event.getSchemaName(), 
event.getRuleConfigurations());
     }
     
     /**
@@ -190,17 +193,21 @@ public final class ConfigCenter {
     }
     
     private void persistDataSourceConfigurations(final String schemaName, 
final Map<String, DataSourceConfiguration> dataSourceConfigurations) {
-        Map<String, YamlDataSourceConfiguration> yamlDataSourceConfigurations 
= 
dataSourceConfigurations.entrySet().stream().collect(Collectors.toMap(Entry::getKey,
-            entry -> new 
DataSourceConfigurationYamlSwapper().swapToYamlConfiguration(entry.getValue()), 
(oldValue, currentValue) -> oldValue, LinkedHashMap::new));
-        YamlDataSourceConfigurationWrap yamlDataSourceConfigWrap = new 
YamlDataSourceConfigurationWrap();
-        yamlDataSourceConfigWrap.setDataSources(yamlDataSourceConfigurations);
-        repository.persist(node.getDataSourcePath(schemaName), 
YamlEngine.marshal(yamlDataSourceConfigWrap));
+        repository.persist(node.getDataSourcePath(schemaName), 
YamlEngine.marshal(createYamlDataSourceConfigurationWrap(dataSourceConfigurations)));
     }
     
     private void addDataSourceConfigurations(final String schemaName, final 
Map<String, DataSourceConfiguration> dataSourceConfigurations) {
         Map<String, DataSourceConfiguration> dataSourceConfigurationMap = 
loadDataSourceConfigurations(schemaName);
         dataSourceConfigurationMap.putAll(dataSourceConfigurations);
-        persistDataSourceConfigurations(schemaName, 
dataSourceConfigurationMap);
+        repository.persist(node.getDataSourcePath(schemaName), 
YamlEngine.marshal(createYamlDataSourceConfigurationWrap(dataSourceConfigurations)));
+    }
+    
+    private YamlDataSourceConfigurationWrap 
createYamlDataSourceConfigurationWrap(final Map<String, 
DataSourceConfiguration> dataSourceConfigurations) {
+        Map<String, YamlDataSourceConfiguration> yamlDataSourceConfigurations 
= 
dataSourceConfigurations.entrySet().stream().collect(Collectors.toMap(Entry::getKey,
 
+            entry -> new 
DataSourceConfigurationYamlSwapper().swapToYamlConfiguration(entry.getValue()), 
(oldValue, currentValue) -> oldValue, LinkedHashMap::new));
+        YamlDataSourceConfigurationWrap result = new 
YamlDataSourceConfigurationWrap();
+        result.setDataSources(yamlDataSourceConfigurations);
+        return result;
     }
     
     private void persistRuleConfigurations(final String schemaName, final 
Collection<RuleConfiguration> ruleConfigurations, final boolean isOverwrite) {
@@ -210,6 +217,19 @@ public final class ConfigCenter {
     }
     
     private void persistRuleConfigurations(final String schemaName, final 
Collection<RuleConfiguration> ruleConfigurations) {
+        repository.persist(node.getRulePath(schemaName), 
YamlEngine.marshal(createYamlRootRuleConfigurations(schemaName, 
ruleConfigurations)));
+    }
+    
+    private void cacheRuleConfigurations(final String schemaName, final 
Collection<RuleConfiguration> ruleConfigurations) {
+        configCacheManager.cache(node.getRulePath(schemaName), 
YamlEngine.marshal(createYamlRootRuleConfigurations(schemaName, 
ruleConfigurations)));
+    }
+    
+    private void checkDataSources(final String schemaName, final 
Collection<ReplicaQueryDataSourceRuleConfiguration> dataSources) {
+        dataSources.forEach(each -> Preconditions.checkState(
+                !each.getPrimaryDataSourceName().isEmpty(), "No available 
replica-query rule configuration in `%s` for governance.", schemaName));
+    }
+    
+    private YamlRootRuleConfigurations createYamlRootRuleConfigurations(final 
String schemaName, final Collection<RuleConfiguration> ruleConfigurations) {
         Collection<RuleConfiguration> configs = new LinkedList<>();
         for (RuleConfiguration each : ruleConfigurations) {
             if (each instanceof ShardingRuleConfiguration) {
@@ -249,14 +269,9 @@ public final class ConfigCenter {
                 configs.add(each);
             }
         }
-        YamlRootRuleConfigurations yamlRuleConfigs = new 
YamlRootRuleConfigurations();
-        yamlRuleConfigs.setRules(new 
YamlRuleConfigurationSwapperEngine().swapToYamlConfigurations(configs));
-        repository.persist(node.getRulePath(schemaName), 
YamlEngine.marshal(yamlRuleConfigs));
-    }
-    
-    private void checkDataSources(final String schemaName, final 
Collection<ReplicaQueryDataSourceRuleConfiguration> dataSources) {
-        dataSources.forEach(each -> Preconditions.checkState(
-                !each.getPrimaryDataSourceName().isEmpty(), "No available 
replica-query rule configuration in `%s` for governance.", schemaName));
+        YamlRootRuleConfigurations result = new YamlRootRuleConfigurations();
+        result.setRules(new 
YamlRuleConfigurationSwapperEngine().swapToYamlConfigurations(configs));
+        return result;
     }
     
     private boolean hasAvailableTableConfigurations(final 
ShardingRuleConfiguration config) {
diff --git 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/config/ConfigCenterTest.java
 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/config/ConfigCenterTest.java
index de83ce2..a8ae641 100644
--- 
a/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/config/ConfigCenterTest.java
+++ 
b/shardingsphere-governance/shardingsphere-governance-core/src/test/java/org/apache/shardingsphere/governance/core/config/ConfigCenterTest.java
@@ -69,6 +69,7 @@ import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.anyString;
 import static org.mockito.ArgumentMatchers.eq;
+import static org.mockito.ArgumentMatchers.startsWith;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
@@ -498,7 +499,7 @@ public final class ConfigCenterTest {
         DataSourcePersistEvent event = new 
DataSourcePersistEvent("sharding_db", createDataSourceConfigurations());
         ConfigCenter configCenter = new ConfigCenter(configurationRepository);
         configCenter.renew(event);
-        
verify(configurationRepository).persist(eq("/metadata/sharding_db/datasource"), 
anyString());
+        
verify(configurationRepository).persist(startsWith("/metadata/sharding_db/datasource"),
 anyString());
     }
     
     @Test
@@ -506,7 +507,7 @@ public final class ConfigCenterTest {
         RuleConfigurationsPersistEvent event = new 
RuleConfigurationsPersistEvent("sharding_db", createRuleConfigurations());
         ConfigCenter configCenter = new ConfigCenter(configurationRepository);
         configCenter.renew(event);
-        
verify(configurationRepository).persist(eq("/metadata/sharding_db/rule"), 
anyString());
+        
verify(configurationRepository).persist(startsWith("/metadata/sharding_db/rule/cache"),
 anyString());
     }
     
     @Test

Reply via email to