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 95a4905  Refresh meta data context for alter resource (#13043)
95a4905 is described below

commit 95a4905e2c7db428a058e1ae22db7a3870cb59c1
Author: Haoran Meng <[email protected]>
AuthorDate: Thu Oct 14 17:40:14 2021 +0800

    Refresh meta data context for alter resource (#13043)
---
 .../mode/manager/ContextManager.java               | 22 +++++++++++++++++++---
 .../rdl/resource/AlterResourceBackendHandler.java  | 11 ++++++++++-
 .../rdl/resource/DropResourceBackendHandler.java   |  1 -
 .../rdl/rule/RuleDefinitionBackendHandler.java     |  1 -
 4 files changed, 29 insertions(+), 6 deletions(-)

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 a2a3281..eb2ef0e 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
@@ -40,6 +40,7 @@ import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.Optional;
 import java.util.Properties;
@@ -136,7 +137,22 @@ public final class ContextManager implements AutoCloseable 
{
      * @throws SQLException SQL exception                         
      */
     public void addResource(final String schemaName, final Map<String, 
DataSourceConfiguration> dataSourceConfigs) throws SQLException {
-        MetaDataContexts changedMetaDataContext = 
buildAddResourceMetaDataContext(metaDataContexts.getMetaDataMap().get(schemaName),
 dataSourceConfigs);
+        refreshMetaDataContext(schemaName, dataSourceConfigs);
+    }
+    
+    /**
+     * Alter resource.
+     *
+     * @param schemaName schema name
+     * @param dataSourceConfigs data source configs
+     * @throws SQLException SQL exception                         
+     */
+    public void alterResource(final String schemaName, final Map<String, 
DataSourceConfiguration> dataSourceConfigs) throws SQLException {
+        refreshMetaDataContext(schemaName, dataSourceConfigs);
+    }
+    
+    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());
         
metaDataContexts.getOptimizerContext().getMetaData().getSchemas().putAll(changedMetaDataContext.getOptimizerContext().getMetaData().getSchemas());
         
metaDataContexts.getOptimizerContext().getParserContexts().putAll(changedMetaDataContext.getOptimizerContext().getParserContexts());
@@ -144,7 +160,7 @@ public final class ContextManager implements AutoCloseable {
         renewTransactionContext(schemaName, 
metaDataContexts.getMetaData(schemaName).getResource());
     }
     
-    private MetaDataContexts buildAddResourceMetaDataContext(final 
ShardingSphereMetaData originalMetaData, final Map<String, 
DataSourceConfiguration> addedDataSourceConfigs) throws SQLException {
+    private MetaDataContexts buildChangedMetaDataContext(final 
ShardingSphereMetaData originalMetaData, final Map<String, 
DataSourceConfiguration> addedDataSourceConfigs) throws SQLException {
         Map<String, DataSource> dataSourceMap = new 
HashMap<>(originalMetaData.getResource().getDataSources());
         
dataSourceMap.putAll(DataSourceConverter.getDataSourceMap(addedDataSourceConfigs));
         Map<String, Map<String, DataSource>> dataSourcesMap = 
Collections.singletonMap(originalMetaData.getName(), dataSourceMap);
@@ -174,7 +190,7 @@ public final class ContextManager implements AutoCloseable {
     
     private MetaDataContexts buildNewMetaDataContext(final String schemaName) 
throws SQLException {
         Map<String, Map<String, DataSource>> dataSourcesMap = 
Collections.singletonMap(schemaName, new HashMap<>());
-        Map<String, Collection<RuleConfiguration>> schemaRuleConfigs = 
Collections.singletonMap(schemaName, Collections.emptyList());
+        Map<String, Collection<RuleConfiguration>> schemaRuleConfigs = 
Collections.singletonMap(schemaName, new LinkedList<>());
         Properties props = metaDataContexts.getProps().getProps();
         Map<String, ShardingSphereSchema> schemas = 
Collections.singletonMap(schemaName, new ShardingSphereSchema());
         return new MetaDataContextsBuilder(dataSourcesMap, schemaRuleConfigs, 
metaDataContexts.getGlobalRuleMetaData().getConfigurations(), schemas, props)
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/resource/AlterResourceBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/resource/AlterResourceBackendHandler.java
index 7b59691..37ba1db 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/resource/AlterResourceBackendHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/resource/AlterResourceBackendHandler.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.proxy.backend.text.distsql.rdl.resource;
 
+import lombok.extern.slf4j.Slf4j;
 import org.apache.shardingsphere.distsql.parser.segment.DataSourceSegment;
 import 
org.apache.shardingsphere.distsql.parser.statement.rdl.alter.AlterResourceStatement;
 import 
org.apache.shardingsphere.infra.config.datasource.DataSourceConfiguration;
@@ -24,6 +25,7 @@ import 
org.apache.shardingsphere.infra.config.datasource.DataSourceConfiguration
 import org.apache.shardingsphere.infra.database.type.DatabaseType;
 import org.apache.shardingsphere.infra.distsql.exception.DistSQLException;
 import 
org.apache.shardingsphere.infra.distsql.exception.resource.DuplicateResourceException;
+import 
org.apache.shardingsphere.infra.distsql.exception.resource.InvalidResourcesException;
 import 
org.apache.shardingsphere.infra.distsql.exception.resource.RequiredResourceMissedException;
 import 
org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
 import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
@@ -32,6 +34,7 @@ import 
org.apache.shardingsphere.proxy.backend.response.header.update.UpdateResp
 import 
org.apache.shardingsphere.proxy.backend.text.SchemaRequiredBackendHandler;
 
 import javax.sql.DataSource;
+import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -39,6 +42,7 @@ import java.util.stream.Collectors;
 /**
  * Alter resource backend handler.
  */
+@Slf4j
 public final class AlterResourceBackendHandler extends 
SchemaRequiredBackendHandler<AlterResourceStatement> {
     
     private final DatabaseType databaseType;
@@ -56,7 +60,12 @@ public final class AlterResourceBackendHandler extends 
SchemaRequiredBackendHand
         checkSQLStatement(schemaName, sqlStatement);
         Map<String, DataSourceConfiguration> dataSourceConfigs = 
ResourceSegmentsConverter.convert(databaseType, sqlStatement.getDataSources());
         dataSourceConfigValidator.validate(dataSourceConfigs);
-        // TODO update meta data context in memory
+        try {
+            
ProxyContext.getInstance().getContextManager().alterResource(schemaName, 
dataSourceConfigs);
+        } catch (final SQLException ex) {
+            log.error("Alter resource failed", ex);
+            DistSQLException.predictionThrow(false, new 
InvalidResourcesException(dataSourceConfigs.keySet()));
+        }
         ProxyContext.getInstance().getContextManager()
                 
.getMetaDataContexts().getMetaDataPersistService().ifPresent(optional -> 
optional.getDataSourceService().append(schemaName, dataSourceConfigs));
         return new UpdateResponseHeader(sqlStatement);
diff --git 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/resource/DropResourceBackendHandler.java
 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/resource/DropResourceBackendHandler.java
index bcd7934..4efbda5 100644
--- 
a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/resource/DropResourceBackendHandler.java
+++ 
b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/resource/DropResourceBackendHandler.java
@@ -55,7 +55,6 @@ public final class DropResourceBackendHandler extends 
SchemaRequiredBackendHandl
         Collection<String> toBeDroppedResourceNames = sqlStatement.getNames();
         check(schemaName, toBeDroppedResourceNames, 
sqlStatement.isIgnoreSingleTables());
         drop(schemaName, toBeDroppedResourceNames);
-        // TODO update meta data context in memory
         
ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaDataPersistService().ifPresent(
             optional -> optional.getDataSourceService().drop(schemaName, 
toBeDroppedResourceNames));
         return new UpdateResponseHeader(sqlStatement);
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 c82c552..3d3d58d 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
@@ -60,7 +60,6 @@ public final class RuleDefinitionBackendHandler<T extends 
RuleDefinitionStatemen
         RuleConfiguration currentRuleConfig = 
findCurrentRuleConfiguration(shardingSphereMetaData, 
ruleConfigClass).orElse(null);
         ruleDefinitionUpdater.checkSQLStatement(shardingSphereMetaData, 
sqlStatement, currentRuleConfig);
         processSQLStatement(shardingSphereMetaData, sqlStatement, 
ruleDefinitionUpdater, currentRuleConfig);
-        // TODO update meta data context in memory
         persistRuleConfigurationChange(shardingSphereMetaData);
         return new UpdateResponseHeader(sqlStatement);
     }

Reply via email to