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);
}