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 2021/11/17 06:46:41 UTC

[shardingsphere] branch master updated: Add alter rule in ContextManager (#13649)

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

zhonghongsheng 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 460e80c  Add alter rule in ContextManager (#13649)
460e80c is described below

commit 460e80cb327f7d1d403cb925cc2adc1c33a5538c
Author: Haoran Meng <me...@gmail.com>
AuthorDate: Wed Nov 17 14:45:35 2021 +0800

    Add alter rule in ContextManager (#13649)
---
 .../mode/manager/ContextManager.java               | 23 ++++++++++++++++++++++
 .../rdl/rule/RuleDefinitionBackendHandler.java     |  1 +
 2 files changed, 24 insertions(+)

diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index 74cc251..6c510fc 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -163,6 +163,29 @@ public final class ContextManager implements AutoCloseable {
         toBeDroppedResourceNames.forEach(metaDataContexts.getMetaData(schemaName).getResource().getDataSources()::remove);
     }
     
+    /**
+     * Alter rule.
+     * 
+     * @param schemaName schema name
+     */
+    public void alterRule(final String schemaName) {
+        try {
+            Map<String, Map<String, DataSource>> dataSourcesMap = Collections.singletonMap(schemaName, metaDataContexts.getMetaData(schemaName).getResource().getDataSources());
+            Map<String, Collection<RuleConfiguration>> schemaRuleConfigs = Collections.singletonMap(schemaName, metaDataContexts.getMetaData(schemaName).getRuleMetaData().getConfigurations());
+            Properties props = metaDataContexts.getProps().getProps();
+            Map<String, Collection<ShardingSphereRule>> rules = SchemaRulesBuilder.buildRules(dataSourcesMap, schemaRuleConfigs, props);
+            Map<String, ShardingSphereSchema> schemas = new SchemaLoader(dataSourcesMap, schemaRuleConfigs, rules, props).load();
+            MetaDataContexts changedMetaDataContext = new MetaDataContextsBuilder(dataSourcesMap, schemaRuleConfigs, metaDataContexts.getGlobalRuleMetaData().getConfigurations(), 
+                    schemas, rules, props)
+                    .build(metaDataContexts.getMetaDataPersistService().orElse(null));
+            metaDataContexts.getOptimizerContext().getMetaData().getSchemas().put(schemaName,
+                    changedMetaDataContext.getOptimizerContext().getMetaData().getSchemas().get(schemaName));
+            metaDataContexts.getMetaDataMap().put(schemaName, changedMetaDataContext.getMetaData(schemaName));
+        } catch (final SQLException ex) {
+            log.error("Alter schema:{} rule configuration failed", schemaName, ex);
+        }
+    }
+    
     private void refreshMetaDataContext(final String schemaName, final Map<String, DataSourceConfiguration> dataSourceConfigs) throws SQLException {
         MetaDataContexts changedMetaDataContext = buildChangedMetaDataContext(metaDataContexts.getMetaDataMap().get(schemaName), dataSourceConfigs);
         metaDataContexts.getMetaDataMap().putAll(changedMetaDataContext.getMetaDataMap());
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/rule/RuleDefinitionBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/rule/RuleDefinitionBackendHandler.java
index f992406..0dfa324 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/rule/RuleDefinitionBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/rule/RuleDefinitionBackendHandler.java
@@ -94,6 +94,7 @@ public final class RuleDefinitionBackendHandler<T extends RuleDefinitionStatemen
         } else {
             throw new UnsupportedOperationException(String.format("Cannot support RDL updater type `%s`", updater.getClass().getCanonicalName()));
         }
+        ProxyContext.getInstance().getContextManager().alterRule(shardingSphereMetaData.getName());
     }
     
     @SuppressWarnings({"rawtypes", "unchecked"})