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 2020/07/06 10:00:35 UTC
[shardingsphere] branch master updated: Add new schema by registry
center (#6281)
This is an automated email from the ASF dual-hosted git repository.
zhangyonglun 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 c0ae87f Add new schema by registry center (#6281)
c0ae87f is described below
commit c0ae87f51d6c4977b9a1e5ed661fb008f7289424
Author: Juan Pan(Trista) <pa...@apache.org>
AuthorDate: Mon Jul 6 18:00:15 2020 +0800
Add new schema by registry center (#6281)
* Add new schema by registry center
* check style
* fix unit test
---
.../core/schema/OrchestrationSchemaContexts.java | 27 +++++++++++++++-------
.../backend/text/admin/UnicastBackendHandler.java | 5 ++--
.../text/admin/UnicastBackendHandlerTest.java | 3 +--
3 files changed, 23 insertions(+), 12 deletions(-)
diff --git a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/main/java/org/apache/shardingsphere/orchestration/core/schema/OrchestrationSchemaContexts.java b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/main/java/org/apache/shardingsphere/orchestration/core/schema/OrchestrationSchemaContexts.java
index 9336e83..e1a1670 100644
--- a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/main/java/org/apache/shardingsphere/orchestration/core/schema/OrchestrationSchemaContexts.java
+++ b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-schema/src/main/java/org/apache/shardingsphere/orchestration/core/schema/OrchestrationSchemaContexts.java
@@ -27,12 +27,12 @@ import org.apache.shardingsphere.infra.config.RuleConfiguration;
import org.apache.shardingsphere.infra.config.properties.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.properties.ConfigurationPropertyKey;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypes;
import org.apache.shardingsphere.infra.executor.kernel.ExecutorKernel;
import org.apache.shardingsphere.infra.log.ConfigurationLogger;
import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import org.apache.shardingsphere.infra.metadata.schema.RuleSchemaMetaData;
import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
-import org.apache.shardingsphere.infra.rule.ShardingSphereRulesBuilder;
import org.apache.shardingsphere.infra.rule.StatusContainedRule;
import org.apache.shardingsphere.infra.rule.event.impl.DataSourceNameDisabledEvent;
import org.apache.shardingsphere.kernel.context.SchemaContext;
@@ -60,6 +60,7 @@ import org.apache.shardingsphere.orchestration.core.registrycenter.event.Disable
import org.apache.shardingsphere.orchestration.core.registrycenter.schema.OrchestrationSchema;
import javax.sql.DataSource;
+import java.sql.SQLException;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
@@ -231,14 +232,16 @@ public abstract class OrchestrationSchemaContexts implements SchemaContextsAware
* Renew rule configurations.
*
* @param ruleConfigurationsChangedEvent rule configurations changed event.
+ * @throws Exception exception
*/
@Subscribe
- public synchronized void renew(final RuleConfigurationsChangedEvent ruleConfigurationsChangedEvent) {
+ public synchronized void renew(final RuleConfigurationsChangedEvent ruleConfigurationsChangedEvent) throws Exception {
Map<String, SchemaContext> schemaContexts = new HashMap<>(this.schemaContexts.getSchemaContexts());
String schemaName = ruleConfigurationsChangedEvent.getShardingSchemaName();
schemaContexts.remove(schemaName);
schemaContexts.put(schemaName, getChangedSchemaContext(this.schemaContexts.getSchemaContexts().get(schemaName), ruleConfigurationsChangedEvent.getRuleConfigurations()));
this.schemaContexts = new SchemaContexts(schemaContexts, this.schemaContexts.getProps(), this.schemaContexts.getAuthentication());
+ ShardingOrchestrationFacade.getInstance().getMetaDataCenter().persistMetaDataCenterNode(schemaName, schemaContexts.get(schemaName).getSchema().getMetaData().getSchema());
}
/**
@@ -296,13 +299,20 @@ public abstract class OrchestrationSchemaContexts implements SchemaContextsAware
String schemaName = schemaAddedEvent.getShardingSchemaName();
Map<String, Map<String, DataSource>> dataSourcesMap = createDataSourcesMap(Collections.singletonMap(schemaName, schemaAddedEvent.getDataSourceConfigurations()));
Map<String, Map<String, DataSourceParameter>> dataSourceParametersMap = createDataSourceParametersMap(Collections.singletonMap(schemaName, schemaAddedEvent.getDataSourceConfigurations()));
- DatabaseType databaseType = schemaContexts.getSchemaContexts().values().iterator().next().getSchema().getDatabaseType();
+ DatabaseType databaseType = getDatabaseType(dataSourceParametersMap.values().iterator().next().values().iterator().next());
SchemaContextsBuilder schemaContextsBuilder = new SchemaContextsBuilder(dataSourcesMap, dataSourceParametersMap,
schemaContexts.getAuthentication(), databaseType, Collections.singletonMap(schemaName, schemaAddedEvent.getRuleConfigurations()),
schemaContexts.getProps().getProps());
return schemaContextsBuilder.build().getSchemaContexts().get(schemaName);
}
+ private DatabaseType getDatabaseType(final DataSourceParameter parameter) {
+ if (!schemaContexts.getSchemaContexts().isEmpty()) {
+ schemaContexts.getSchemaContexts().values().iterator().next().getSchema().getDatabaseType();
+ }
+ return DatabaseTypes.getDatabaseTypeByURL(parameter.getUrl());
+ }
+
private Map<String, SchemaContext> getChangedSchemaContexts(final ConfigurationProperties props) {
Map<String, SchemaContext> result = new HashMap<>(schemaContexts.getSchemaContexts().size());
for (Entry<String, SchemaContext> entry : this.schemaContexts.getSchemaContexts().entrySet()) {
@@ -319,11 +329,12 @@ public abstract class OrchestrationSchemaContexts implements SchemaContextsAware
oldShardingSphereSchema.getRules(), oldShardingSphereSchema.getDataSources(), metaData);
}
- private SchemaContext getChangedSchemaContext(final SchemaContext schemaContext, final Collection<RuleConfiguration> configurations) {
- ShardingSphereSchema oldSchema = schemaContext.getSchema();
- ShardingSphereSchema newSchema = new ShardingSphereSchema(oldSchema.getDatabaseType(), configurations,
- ShardingSphereRulesBuilder.build(configurations, oldSchema.getDataSources().keySet()), oldSchema.getDataSources(), oldSchema.getDataSourceParameters(), oldSchema.getMetaData());
- return new SchemaContext(schemaContext.getName(), newSchema, schemaContext.getRuntimeContext());
+ private SchemaContext getChangedSchemaContext(final SchemaContext oldSchemaContext, final Collection<RuleConfiguration> configurations) throws SQLException {
+ ShardingSphereSchema oldSchema = oldSchemaContext.getSchema();
+ SchemaContextsBuilder builder = new SchemaContextsBuilder(Collections.singletonMap(oldSchemaContext.getName(), oldSchema.getDataSources()),
+ Collections.singletonMap(oldSchemaContext.getName(), oldSchema.getDataSourceParameters()),
+ schemaContexts.getAuthentication(), oldSchema.getDatabaseType(), Collections.singletonMap(oldSchemaContext.getName(), configurations), schemaContexts.getProps().getProps());
+ return builder.build().getSchemaContexts().values().iterator().next();
}
private SchemaContext getChangedSchemaContext(final SchemaContext oldSchemaContext, final Map<String, DataSourceConfiguration> newDataSources) throws Exception {
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/UnicastBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/UnicastBackendHandler.java
index 9e6965a..d4a5f37 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/UnicastBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/admin/UnicastBackendHandler.java
@@ -21,9 +21,10 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngine;
import org.apache.shardingsphere.proxy.backend.communication.DatabaseCommunicationEngineFactory;
import org.apache.shardingsphere.proxy.backend.communication.jdbc.connection.BackendConnection;
+import org.apache.shardingsphere.proxy.backend.exception.NoDatabaseSelectedException;
import org.apache.shardingsphere.proxy.backend.response.BackendResponse;
+import org.apache.shardingsphere.proxy.backend.response.error.ErrorResponse;
import org.apache.shardingsphere.proxy.backend.response.query.QueryData;
-import org.apache.shardingsphere.proxy.backend.schema.ProxySchemaContexts;
import org.apache.shardingsphere.proxy.backend.text.TextProtocolBackendHandler;
import java.sql.SQLException;
@@ -46,7 +47,7 @@ public final class UnicastBackendHandler implements TextProtocolBackendHandler {
public BackendResponse execute() {
// TODO we should remove set default ShardingSphere schema after parser can recognize all DAL broadcast SQL.
if (null == backendConnection.getSchema()) {
- backendConnection.setCurrentSchema(ProxySchemaContexts.getInstance().getSchemaContexts().getSchemaContexts().keySet().iterator().next());
+ return new ErrorResponse(new NoDatabaseSelectedException());
}
databaseCommunicationEngine = databaseCommunicationEngineFactory.newTextProtocolInstance(backendConnection.getSchema(), sql, backendConnection);
return databaseCommunicationEngine.execute();
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/UnicastBackendHandlerTest.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/UnicastBackendHandlerTest.java
index 9b8cfe3..1b468ca 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/UnicastBackendHandlerTest.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/test/java/org/apache/shardingsphere/proxy/backend/text/admin/UnicastBackendHandlerTest.java
@@ -46,7 +46,6 @@ import static org.junit.Assert.assertThat;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
@@ -78,10 +77,10 @@ public final class UnicastBackendHandlerTest {
@Test
public void assertExecuteWhileSchemaIsNull() {
UnicastBackendHandler backendHandler = new UnicastBackendHandler("show variable like %s", backendConnection);
+ backendConnection.setCurrentSchema("schema_8");
setDatabaseCommunicationEngine(backendHandler);
BackendResponse actual = backendHandler.execute();
assertThat(actual, instanceOf(UpdateResponse.class));
- verify(backendConnection).setCurrentSchema("schema_8");
backendHandler.execute();
}