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/08/26 10:06:33 UTC

[shardingsphere] branch master updated: Add JDBCOrchestrationSchemaContexts for OrchestrationShardingSphereDataSource (#7080)

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

zhangliang 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 2075b70  Add JDBCOrchestrationSchemaContexts for OrchestrationShardingSphereDataSource (#7080)
2075b70 is described below

commit 2075b70f2aa61eeca6b3012b20d857fd32c712a1
Author: Juan Pan(Trista) <pa...@apache.org>
AuthorDate: Wed Aug 26 18:06:14 2020 +0800

    Add JDBCOrchestrationSchemaContexts for OrchestrationShardingSphereDataSource (#7080)
---
 ...chestrationShardingSphereDataSourceFactory.java |  2 +-
 .../OrchestrationShardingSphereDataSource.java     | 95 +++++++++++-----------
 .../schema/JDBCOrchestrationSchemaContexts.java    |  2 +-
 3 files changed, 50 insertions(+), 49 deletions(-)

diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/api/yaml/YamlOrchestrationShardingSphereDataSourceFactory.java b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/api/yaml/YamlOrchestrationShardingSphereDataSourceFactory.java
index ada77c6..8487511 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/api/yaml/YamlOrchestrationShardingSphereDataSourceFactory.java
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/api/yaml/YamlOrchestrationShardingSphereDataSourceFactory.java
@@ -133,7 +133,7 @@ public final class YamlOrchestrationShardingSphereDataSourceFactory {
     private static DataSource createDataSourceWithRules(final ShardingSphereDataSource shardingSphereDataSource,
                                                         final YamlOrchestrationConfiguration orchestration,
                                                         final YamlClusterConfiguration yamlClusterConfiguration,
-                                                        final YamlMetricsConfiguration yamlMetricsConfiguration) {
+                                                        final YamlMetricsConfiguration yamlMetricsConfiguration) throws SQLException {
         if (null == yamlClusterConfiguration && null == yamlMetricsConfiguration) {
             return new OrchestrationShardingSphereDataSource(shardingSphereDataSource,
                     YamlOrchestrationRepositoryConfigurationSwapperUtil.marshal(orchestration));
diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/datasource/OrchestrationShardingSphereDataSource.java b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/datasource/OrchestrationShardingSphereDataSource.java
index 66ec423..8a22e2b 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/datasource/OrchestrationShardingSphereDataSource.java
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/datasource/OrchestrationShardingSphereDataSource.java
@@ -17,6 +17,7 @@
 
 package org.apache.shardingsphere.driver.orchestration.internal.datasource;
 
+import com.google.common.base.Preconditions;
 import com.google.common.collect.Maps;
 import com.google.common.eventbus.Subscribe;
 import lombok.Getter;
@@ -31,10 +32,14 @@ import org.apache.shardingsphere.control.panel.spi.engine.ControlPanelFacadeEngi
 import org.apache.shardingsphere.driver.jdbc.core.datasource.ShardingSphereDataSource;
 import org.apache.shardingsphere.driver.jdbc.unsupported.AbstractUnsupportedOperationDataSource;
 import org.apache.shardingsphere.driver.orchestration.internal.circuit.datasource.CircuitBreakerDataSource;
+import org.apache.shardingsphere.driver.orchestration.internal.schema.JDBCOrchestrationSchemaContexts;
 import org.apache.shardingsphere.driver.orchestration.internal.util.DataSourceConverter;
+import org.apache.shardingsphere.infra.auth.Authentication;
 import org.apache.shardingsphere.infra.config.DataSourceConfiguration;
 import org.apache.shardingsphere.infra.config.RuleConfiguration;
 import org.apache.shardingsphere.infra.database.DefaultSchema;
+import org.apache.shardingsphere.infra.database.type.DatabaseType;
+import org.apache.shardingsphere.infra.database.type.DatabaseTypes;
 import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
 import org.apache.shardingsphere.infra.metadata.schema.RuleSchemaMetaData;
 import org.apache.shardingsphere.infra.rule.ShardingSphereRule;
@@ -42,13 +47,13 @@ import org.apache.shardingsphere.infra.rule.StatusContainedRule;
 import org.apache.shardingsphere.infra.rule.event.impl.DataSourceNameDisabledEvent;
 import org.apache.shardingsphere.kernel.context.SchemaContext;
 import org.apache.shardingsphere.kernel.context.SchemaContexts;
+import org.apache.shardingsphere.kernel.context.SchemaContextsBuilder;
 import org.apache.shardingsphere.kernel.context.StandardSchemaContexts;
 import org.apache.shardingsphere.kernel.context.schema.ShardingSphereSchema;
 import org.apache.shardingsphere.metrics.configuration.config.MetricsConfiguration;
 import org.apache.shardingsphere.orchestration.core.common.event.DataSourceChangedEvent;
 import org.apache.shardingsphere.orchestration.core.common.event.PropertiesChangedEvent;
 import org.apache.shardingsphere.orchestration.core.common.event.RuleConfigurationsChangedEvent;
-import org.apache.shardingsphere.orchestration.core.common.eventbus.OrchestrationEventBus;
 import org.apache.shardingsphere.orchestration.core.config.ConfigCenter;
 import org.apache.shardingsphere.orchestration.core.facade.OrchestrationFacade;
 import org.apache.shardingsphere.orchestration.core.metadata.event.MetaDataChangedEvent;
@@ -83,6 +88,8 @@ public final class OrchestrationShardingSphereDataSource extends AbstractUnsuppo
     @Setter
     private PrintWriter logWriter = new PrintWriter(System.out);
     
+    private final SchemaContexts schemaContexts;
+    
     private final OrchestrationFacade orchestrationFacade = OrchestrationFacade.getInstance();
     
     private final Map<String, DataSourceConfiguration> dataSourceConfigurations = new LinkedHashMap<>();
@@ -91,50 +98,45 @@ public final class OrchestrationShardingSphereDataSource extends AbstractUnsuppo
     
     public OrchestrationShardingSphereDataSource(final OrchestrationConfiguration orchestrationConfig) throws SQLException {
         init(orchestrationConfig);
+        schemaContexts = new JDBCOrchestrationSchemaContexts(createSchemaContexts(), orchestrationFacade);
         dataSource = loadDataSource();
-        initWithOrchestrationCenter();
-        disableDataSources();
-        persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
+        initDataSourceConfigurations();
         initControlPanel();
     }
     
     public OrchestrationShardingSphereDataSource(final OrchestrationConfiguration orchestrationConfig, final ClusterConfiguration clusterConfiguration,
                                                  final MetricsConfiguration metricsConfiguration) throws SQLException {
         init(orchestrationConfig);
+        schemaContexts = new JDBCOrchestrationSchemaContexts(createSchemaContexts(), orchestrationFacade);
         dataSource = loadDataSource();
-        initWithOrchestrationCenter();
+        initDataSourceConfigurations();
         initConfigurations(clusterConfiguration, metricsConfiguration);
-        disableDataSources();
-        persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
         initControlPanel();
     }
     
     public OrchestrationShardingSphereDataSource(final OrchestrationConfiguration orchestrationConfig, final ClusterConfiguration clusterConfiguration) throws SQLException {
         init(orchestrationConfig);
+        schemaContexts = new JDBCOrchestrationSchemaContexts(createSchemaContexts(), orchestrationFacade);
         dataSource = loadDataSource();
-        initWithOrchestrationCenter();
+        initDataSourceConfigurations();
         initConfigurations(clusterConfiguration, null);
-        disableDataSources();
-        persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
         initControlPanel();
     }
     
     public OrchestrationShardingSphereDataSource(final OrchestrationConfiguration orchestrationConfig, final MetricsConfiguration metricsConfiguration) throws SQLException {
         init(orchestrationConfig);
+        schemaContexts = new JDBCOrchestrationSchemaContexts(createSchemaContexts(), orchestrationFacade);
         dataSource = loadDataSource();
-        initWithOrchestrationCenter();
+        initDataSourceConfigurations();
         initConfigurations(null, metricsConfiguration);
-        disableDataSources();
-        persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
         initControlPanel();
     }
     
     public OrchestrationShardingSphereDataSource(final ShardingSphereDataSource dataSource, final OrchestrationConfiguration orchestrationConfig) {
         init(orchestrationConfig);
+        schemaContexts = new JDBCOrchestrationSchemaContexts(dataSource.getSchemaContexts(), orchestrationFacade);
         this.dataSource = dataSource;
         initWithLocalConfiguration();
-        disableDataSources();
-        persistMetaData(this.dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
         initControlPanel();
     }
     
@@ -143,11 +145,10 @@ public final class OrchestrationShardingSphereDataSource extends AbstractUnsuppo
                                                  final ClusterConfiguration clusterConfiguration,
                                                  final MetricsConfiguration metricsConfiguration) {
         init(orchestrationConfig);
+        schemaContexts = new JDBCOrchestrationSchemaContexts(dataSource.getSchemaContexts(), orchestrationFacade);
         this.dataSource = dataSource;
         initWithLocalConfiguration();
         initConfigurations(clusterConfiguration, metricsConfiguration);
-        disableDataSources();
-        persistMetaData(this.dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
         initControlPanel();
     }
     
@@ -155,11 +156,10 @@ public final class OrchestrationShardingSphereDataSource extends AbstractUnsuppo
                                                  final OrchestrationConfiguration orchestrationConfig,
                                                  final ClusterConfiguration clusterConfiguration) {
         init(orchestrationConfig);
+        schemaContexts = new JDBCOrchestrationSchemaContexts(dataSource.getSchemaContexts(), orchestrationFacade);
         this.dataSource = dataSource;
         initWithLocalConfiguration();
         initConfigurations(clusterConfiguration, null);
-        disableDataSources();
-        persistMetaData(this.dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
         initControlPanel();
     }
     
@@ -167,17 +167,26 @@ public final class OrchestrationShardingSphereDataSource extends AbstractUnsuppo
                                                  final OrchestrationConfiguration orchestrationConfig,
                                                  final MetricsConfiguration metricsConfiguration) {
         init(orchestrationConfig);
+        schemaContexts = new JDBCOrchestrationSchemaContexts(dataSource.getSchemaContexts(), orchestrationFacade);
         this.dataSource = dataSource;
         initWithLocalConfiguration();
         initConfigurations(null, metricsConfiguration);
-        disableDataSources();
-        persistMetaData(this.dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema());
         initControlPanel();
     }
     
     private void init(final OrchestrationConfiguration config) {
         orchestrationFacade.init(config, Collections.singletonList(DefaultSchema.LOGIC_NAME));
-        OrchestrationEventBus.getInstance().register(this);
+        orchestrationFacade.onlineInstance();
+    }
+    
+    private SchemaContexts createSchemaContexts() throws SQLException {
+        ConfigCenter configCenter = orchestrationFacade.getConfigCenter();
+        Map<String, DataSourceConfiguration> dataSourceConfigs = configCenter.loadDataSourceConfigurations(DefaultSchema.LOGIC_NAME);
+        Collection<RuleConfiguration> ruleConfigurations = configCenter.loadRuleConfigurations(DefaultSchema.LOGIC_NAME);
+        Map<String, DataSource> dataSourceMap = DataSourceConverter.getDataSourceMap(dataSourceConfigs);
+        SchemaContextsBuilder schemaContextsBuilder = new SchemaContextsBuilder(createDatabaseType(dataSourceMap), Collections.singletonMap(DefaultSchema.LOGIC_NAME, dataSourceMap),
+                Collections.singletonMap(DefaultSchema.LOGIC_NAME, ruleConfigurations), new Authentication(), configCenter.loadProperties());
+        return schemaContextsBuilder.build();
     }
     
     private ShardingSphereDataSource loadDataSource() throws SQLException {
@@ -187,8 +196,23 @@ public final class OrchestrationShardingSphereDataSource extends AbstractUnsuppo
         return new ShardingSphereDataSource(DataSourceConverter.getDataSourceMap(dataSourceConfigs), ruleConfigurations, configCenter.loadProperties());
     }
     
-    private void initWithOrchestrationCenter() {
-        orchestrationFacade.onlineInstance();
+    private DatabaseType createDatabaseType(final Map<String, DataSource> dataSourceMap) throws SQLException {
+        DatabaseType result = null;
+        for (DataSource each : dataSourceMap.values()) {
+            DatabaseType databaseType = createDatabaseType(each);
+            Preconditions.checkState(null == result || result == databaseType, String.format("Database type inconsistent with '%s' and '%s'", result, databaseType));
+            result = databaseType;
+        }
+        return result;
+    }
+    
+    private DatabaseType createDatabaseType(final DataSource dataSource) throws SQLException {
+        try (Connection connection = dataSource.getConnection()) {
+            return DatabaseTypes.getDatabaseTypeByURL(connection.getMetaData().getURL());
+        }
+    }
+    
+    private void initDataSourceConfigurations() {
         dataSourceConfigurations.putAll(orchestrationFacade.getConfigCenter().loadDataSourceConfigurations(DefaultSchema.LOGIC_NAME));
     }
     
@@ -210,29 +234,6 @@ public final class OrchestrationShardingSphereDataSource extends AbstractUnsuppo
         }
     }
     
-    private void disableDataSources() {
-        Collection<String> disabledDataSources = orchestrationFacade.getRegistryCenter().loadDisabledDataSources();
-        if (disabledDataSources.isEmpty()) {
-            return;
-        }
-        dataSource.getSchemaContexts().getSchemaContexts().forEach((key, value)
-            -> value.getSchema().getRules().stream().filter(each -> each instanceof StatusContainedRule).forEach(each -> disableDataSources((StatusContainedRule) each, disabledDataSources, key)));
-    }
-    
-    private void disableDataSources(final StatusContainedRule statusContainedRule, final Collection<String> disabledDataSources, final String schemaName) {
-        disabledDataSources.stream().filter(each -> each.startsWith(schemaName)).map(this::getDataSourceName).forEach(each ->
-            statusContainedRule.updateRuleStatus(new DataSourceNameDisabledEvent(each, true))
-        );
-    }
-    
-    private String getDataSourceName(final String disableDataSource) {
-        return new OrchestrationSchema(disableDataSource).getDataSourceName();
-    }
-    
-    private void persistMetaData(final RuleSchemaMetaData metaData) {
-        orchestrationFacade.getMetaDataCenter().persistMetaDataCenterNode(DefaultSchema.LOGIC_NAME, metaData);
-    }
-    
     private void initControlPanel() {
         ClusterConfiguration clusterConfiguration = orchestrationFacade.getConfigCenter().loadClusterConfiguration();
         MetricsConfiguration metricsConfiguration = orchestrationFacade.getConfigCenter().loadMetricsConfiguration();
diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/schema/JDBCOrchestrationSchemaContexts.java b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/schema/JDBCOrchestrationSchemaContexts.java
index 11578f0..a609d6a 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/schema/JDBCOrchestrationSchemaContexts.java
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-orchestration/src/main/java/org/apache/shardingsphere/driver/orchestration/internal/schema/JDBCOrchestrationSchemaContexts.java
@@ -38,7 +38,7 @@ import java.util.stream.Collectors;
  */
 public final class JDBCOrchestrationSchemaContexts extends OrchestrationSchemaContexts {
     
-    protected JDBCOrchestrationSchemaContexts(final SchemaContexts schemaContexts, final OrchestrationFacade orchestrationFacade) {
+    public JDBCOrchestrationSchemaContexts(final SchemaContexts schemaContexts, final OrchestrationFacade orchestrationFacade) {
         super(schemaContexts, orchestrationFacade);
     }