This is an automated email from the ASF dual-hosted git repository. kimmking 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 7a4f1c5 Reload and disable slave databases when proxy/jdbc starts (#6115) 7a4f1c5 is described below commit 7a4f1c5496133509e7cf8d3b29b703cb846071b3 Author: Haoran Meng <loca...@163.com> AuthorDate: Fri Jun 19 23:22:32 2020 +0800 Reload and disable slave databases when proxy/jdbc starts (#6115) * Reload and disable slave databases when proxy starts * revise code style * Reload and disable slave databases when proxy starts * Reload and disable slave databases when JDBC starts --- .../core/registrycenter/RegistryCenter.java | 12 +++++++++++ .../core/registrycenter/RegistryCenterTest.java | 12 +++++++++++ .../OrchestrationShardingSphereDataSource.java | 23 ++++++++++++++++++++++ .../org/apache/shardingsphere/proxy/Bootstrap.java | 21 ++++++++++++++++++++ 4 files changed, 68 insertions(+) diff --git a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/main/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenter.java b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/main/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenter.java index 20670ec..90e5624 100644 --- a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/main/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenter.java +++ b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/main/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenter.java @@ -17,10 +17,12 @@ package org.apache.shardingsphere.orchestration.core.registrycenter; +import com.google.common.base.Strings; import org.apache.shardingsphere.orchestration.center.RegistryCenterRepository; import org.apache.shardingsphere.orchestration.core.registrycenter.instance.OrchestrationInstance; import java.util.Collection; +import java.util.stream.Collectors; /** * RegistryCenter hold and persist instance state. @@ -106,4 +108,14 @@ public final class RegistryCenter { public String getDataSourcesNodeData(final String schemaDataSourceName) { return repository.get(node.getDataSourcesNodeFullPath(schemaDataSourceName)); } + + /** + * Load disabled data sources. + * + * @return Collection of disabled data sources + */ + public Collection<String> loadDisabledDataSources() { + return loadAllDataSourcesNodes().stream().filter(each -> !Strings.isNullOrEmpty(getDataSourcesNodeData(each)) + && RegistryCenterNodeStatus.DISABLED.toString().equalsIgnoreCase(getDataSourcesNodeData(each))).collect(Collectors.toList()); + } } diff --git a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/test/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenterTest.java b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/test/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenterTest.java index a63d401..3af9a58 100644 --- a/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/test/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenterTest.java +++ b/shardingsphere-control-panel/shardingsphere-orchestration/shardingsphere-orchestration-core/shardingsphere-orchestration-core-registrycenter/src/test/java/org/apache/shardingsphere/orchestration/core/registrycenter/RegistryCenterTest.java @@ -25,9 +25,12 @@ import org.mockito.Mock; import org.mockito.junit.MockitoJUnitRunner; import java.lang.reflect.Field; +import java.util.Collections; +import java.util.List; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; @RunWith(MockitoJUnitRunner.class) public final class RegistryCenterTest { @@ -68,4 +71,13 @@ public final class RegistryCenterTest { registryCenter.loadInstanceData(); verify(registryCenterRepository).get(anyString()); } + + @Test + public void assertLoadDisabledDataSources() { + List<String> disabledDataSources = Collections.singletonList("slave_ds_0"); + when(registryCenterRepository.getChildrenKeys(anyString())).thenReturn(disabledDataSources); + registryCenter.loadDisabledDataSources(); + verify(registryCenterRepository).getChildrenKeys(anyString()); + verify(registryCenterRepository).get(anyString()); + } } 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 758b764..a06e9e7 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.Joiner; import com.google.common.base.Preconditions; import com.google.common.eventbus.Subscribe; import lombok.AccessLevel; @@ -39,6 +40,7 @@ import org.apache.shardingsphere.infra.rule.event.impl.DataSourceNameDisabledEve import org.apache.shardingsphere.kernel.context.SchemaContext; import org.apache.shardingsphere.kernel.context.SchemaContexts; import org.apache.shardingsphere.kernel.context.schema.ShardingSphereSchema; +import org.apache.shardingsphere.masterslave.rule.MasterSlaveRule; import org.apache.shardingsphere.orchestration.center.config.OrchestrationConfiguration; import org.apache.shardingsphere.orchestration.core.common.event.DataSourceChangedEvent; import org.apache.shardingsphere.orchestration.core.common.event.PropertiesChangedEvent; @@ -74,6 +76,7 @@ public class OrchestrationShardingSphereDataSource extends AbstractOrchestration Map<String, DataSourceConfiguration> dataSourceConfigurations = configService.loadDataSourceConfigurations(DefaultSchema.LOGIC_NAME); dataSource = new ShardingSphereDataSource(DataSourceConverter.getDataSourceMap(dataSourceConfigurations), configurations, configService.loadProperties()); initShardingOrchestrationFacade(); + disableDataSources(); persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema()); initCluster(); } @@ -83,6 +86,7 @@ public class OrchestrationShardingSphereDataSource extends AbstractOrchestration dataSource = shardingSphereDataSource; initShardingOrchestrationFacade(Collections.singletonMap(DefaultSchema.LOGIC_NAME, DataSourceConverter.getDataSourceConfigurationMap(dataSource.getDataSourceMap())), getRuleConfigurationMap(), dataSource.getSchemaContexts().getProps().getProps()); + disableDataSources(); persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema()); initCluster(); } @@ -95,6 +99,7 @@ public class OrchestrationShardingSphereDataSource extends AbstractOrchestration Map<String, DataSourceConfiguration> dataSourceConfigurations = configService.loadDataSourceConfigurations(DefaultSchema.LOGIC_NAME); dataSource = new ShardingSphereDataSource(DataSourceConverter.getDataSourceMap(dataSourceConfigurations), configurations, configService.loadProperties()); initShardingOrchestrationFacade(clusterConfiguration); + disableDataSources(); persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema()); initCluster(); } @@ -105,6 +110,7 @@ public class OrchestrationShardingSphereDataSource extends AbstractOrchestration dataSource = shardingSphereDataSource; initShardingOrchestrationFacade(Collections.singletonMap(DefaultSchema.LOGIC_NAME, DataSourceConverter.getDataSourceConfigurationMap(dataSource.getDataSourceMap())), getRuleConfigurationMap(), dataSource.getSchemaContexts().getProps().getProps(), clusterConfiguration); + disableDataSources(); persistMetaData(dataSource.getSchemaContexts().getDefaultSchemaContext().getSchema().getMetaData().getSchema()); initCluster(); } @@ -228,4 +234,21 @@ public class OrchestrationShardingSphereDataSource extends AbstractOrchestration return new ShardingSphereSchema(oldShardingSphereSchema.getDatabaseType(), oldShardingSphereSchema.getConfigurations(), oldShardingSphereSchema.getRules(), oldShardingSphereSchema.getDataSources(), metaData); } + + private void disableDataSources() { + Collection<String> disabledDataSources = ShardingOrchestrationFacade.getInstance().getRegistryCenter().loadDisabledDataSources(); + if (!disabledDataSources.isEmpty()) { + dataSource.getSchemaContexts().getSchemaContexts().entrySet().forEach(entry -> entry.getValue().getSchema().getRules() + .stream().filter(each -> each instanceof MasterSlaveRule).forEach(e -> disableDataSources((MasterSlaveRule) e, disabledDataSources, entry.getKey()))); + } + } + + private void disableDataSources(final MasterSlaveRule masterSlaveRule, + final Collection<String> disabledDataSources, final String schemaName) { + masterSlaveRule.getSingleDataSourceRule().getSlaveDataSourceNames().forEach(each -> { + if (disabledDataSources.contains(Joiner.on(".").join(schemaName, each))) { + masterSlaveRule.updateRuleStatus(new DataSourceNameDisabledEvent(each, true)); + } + }); + } } diff --git a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/Bootstrap.java b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/Bootstrap.java index 7e70d5b..c727ab2 100644 --- a/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/Bootstrap.java +++ b/shardingsphere-proxy/shardingsphere-proxy-bootstrap/src/main/java/org/apache/shardingsphere/proxy/Bootstrap.java @@ -17,6 +17,7 @@ package org.apache.shardingsphere.proxy; +import com.google.common.base.Joiner; import com.google.common.primitives.Ints; import lombok.AccessLevel; import lombok.NoArgsConstructor; @@ -35,10 +36,12 @@ import org.apache.shardingsphere.infra.database.type.DatabaseType; import org.apache.shardingsphere.infra.database.type.DatabaseTypes; import org.apache.shardingsphere.infra.exception.ShardingSphereException; import org.apache.shardingsphere.infra.log.ConfigurationLogger; +import org.apache.shardingsphere.infra.rule.event.impl.DataSourceNameDisabledEvent; import org.apache.shardingsphere.infra.yaml.swapper.YamlRuleConfigurationSwapperEngine; import org.apache.shardingsphere.kernel.context.SchemaContextsAware; import org.apache.shardingsphere.kernel.context.SchemaContextsBuilder; import org.apache.shardingsphere.kernel.context.schema.DataSourceParameter; +import org.apache.shardingsphere.masterslave.rule.MasterSlaveRule; import org.apache.shardingsphere.metrics.configuration.config.MetricsConfiguration; import org.apache.shardingsphere.metrics.configuration.swapper.MetricsConfigurationYamlSwapper; import org.apache.shardingsphere.metrics.configuration.yaml.YamlMetricsConfiguration; @@ -167,6 +170,7 @@ public final class Bootstrap { ProxySchemaContexts.getInstance().init(schemaContexts); if (isOrchestration) { persistMetaData(schemaContexts); + disableDataSources(schemaContexts); } } @@ -175,6 +179,23 @@ public final class Bootstrap { .getMetaDataCenter().persistMetaDataCenterNode(key, value.getSchema().getMetaData().getSchema())); } + private static void disableDataSources(final SchemaContextsAware schemaContexts) { + Collection<String> disabledDataSources = ShardingOrchestrationFacade.getInstance().getRegistryCenter().loadDisabledDataSources(); + if (!disabledDataSources.isEmpty()) { + schemaContexts.getSchemaContexts().entrySet().forEach(entry -> entry.getValue().getSchema().getRules() + .stream().filter(each -> each instanceof MasterSlaveRule).forEach(e -> disableDataSources((MasterSlaveRule) e, disabledDataSources, entry.getKey()))); + } + } + + private static void disableDataSources(final MasterSlaveRule masterSlaveRule, + final Collection<String> disabledDataSources, final String schemaName) { + masterSlaveRule.getSingleDataSourceRule().getSlaveDataSourceNames().forEach(each -> { + if (disabledDataSources.contains(Joiner.on(".").join(schemaName, each))) { + masterSlaveRule.updateRuleStatus(new DataSourceNameDisabledEvent(each, true)); + } + }); + } + private static Map<String, Map<String, DataSource>> createDataSourcesMap(final Map<String, Map<String, DataSourceParameter>> schemaDataSources) { return schemaDataSources.entrySet().stream().collect(Collectors.toMap(Entry::getKey, entry -> createDataSources(entry.getValue()), (oldVal, currVal) -> oldVal, LinkedHashMap::new)); }