diff --git a/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/metrics/prometheus/PrometheusPluginBootServiceTest.java b/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/metrics/prometheus/PrometheusPluginBootServiceTest.java index 69035f5af3860..5e530168741ac 100644 --- a/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/metrics/prometheus/PrometheusPluginBootServiceTest.java +++ b/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/metrics/prometheus/PrometheusPluginBootServiceTest.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.InstanceContext; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; @@ -53,8 +54,8 @@ public void close() { public void assertStart() throws IOException { MetaDataContexts metaDataContexts = new MetaDataContexts(mock(MetaDataPersistService.class), new ShardingSphereMetaData()); InstanceContext instanceContext = new InstanceContext( - new ComputeNodeInstance(mock(InstanceMetaData.class)), new StandaloneWorkerIdGenerator(), new ModeConfiguration("Standalone", null), mock(LockContext.class), - new EventBusContext()); + new ComputeNodeInstance(mock(InstanceMetaData.class)), new StandaloneWorkerIdGenerator(), new ModeConfiguration("Standalone", null), + mock(ModeContextManager.class), mock(LockContext.class), new EventBusContext()); ProxyContext.init(new ContextManager(metaDataContexts, instanceContext)); pluginBootService.start(new PluginConfiguration("localhost", 8090, "", createProperties()), true); new Socket().connect(new InetSocketAddress("localhost", 8090)); diff --git a/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/metrics/prometheus/collector/ProxyInfoCollectorTest.java b/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/metrics/prometheus/collector/ProxyInfoCollectorTest.java index 8d9f7d803e0d1..f290d64a06a33 100644 --- a/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/metrics/prometheus/collector/ProxyInfoCollectorTest.java +++ b/agent/plugins/metrics/type/prometheus/src/test/java/org/apache/shardingsphere/agent/metrics/prometheus/collector/ProxyInfoCollectorTest.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.InstanceContext; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; @@ -41,8 +42,8 @@ public final class ProxyInfoCollectorTest extends ProxyContextRestorer { public void assertCollect() { MetaDataContexts metaDataContexts = new MetaDataContexts(mock(MetaDataPersistService.class), new ShardingSphereMetaData()); InstanceContext instanceContext = new InstanceContext( - new ComputeNodeInstance(mock(InstanceMetaData.class)), new StandaloneWorkerIdGenerator(), new ModeConfiguration("Standalone", null), mock(LockContext.class), - new EventBusContext()); + new ComputeNodeInstance(mock(InstanceMetaData.class)), new StandaloneWorkerIdGenerator(), new ModeConfiguration("Standalone", null), + mock(ModeContextManager.class), mock(LockContext.class), new EventBusContext()); ProxyContext.init(new ContextManager(metaDataContexts, instanceContext)); assertFalse(new ProxyInfoCollector().collect().isEmpty()); } diff --git a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithmTest.java b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithmTest.java index 494c1b1346723..51819d39b9e45 100644 --- a/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithmTest.java +++ b/features/sharding/core/src/test/java/org/apache/shardingsphere/sharding/algorithm/keygen/SnowflakeKeyGenerateAlgorithmTest.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.infra.instance.InstanceContext; import org.apache.shardingsphere.infra.instance.InstanceContextAware; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.sharding.algorithm.keygen.fixture.FixedTimeService; @@ -203,7 +204,7 @@ private void setSequence(final KeyGenerateAlgorithm algorithm, final Number valu public void assertSetWorkerIdFailureWhenNegative() { SnowflakeKeyGenerateAlgorithm algorithm = (SnowflakeKeyGenerateAlgorithm) KeyGenerateAlgorithmFactory.newInstance(new AlgorithmConfiguration("SNOWFLAKE", new Properties())); InstanceContext instanceContext = new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(-1), - new ModeConfiguration("Standalone", null), mock(LockContext.class), new EventBusContext()); + new ModeConfiguration("Standalone", null), mock(ModeContextManager.class), mock(LockContext.class), new EventBusContext()); algorithm.setInstanceContext(instanceContext); algorithm.generateKey(); } @@ -219,7 +220,7 @@ public void assertSetMaxVibrationOffsetFailureWhenNegative() { public void assertSetWorkerIdFailureWhenOutOfRange() { SnowflakeKeyGenerateAlgorithm algorithm = (SnowflakeKeyGenerateAlgorithm) KeyGenerateAlgorithmFactory.newInstance(new AlgorithmConfiguration("SNOWFLAKE", new Properties())); InstanceContext instanceContext = new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(Integer.MIN_VALUE), - new ModeConfiguration("Standalone", null), mock(LockContext.class), new EventBusContext()); + new ModeConfiguration("Standalone", null), mock(ModeContextManager.class), mock(LockContext.class), new EventBusContext()); algorithm.setInstanceContext(instanceContext); algorithm.generateKey(); } diff --git a/features/sharding/plugin/cache/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java b/features/sharding/plugin/cache/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java index 49ab3e50f6136..a592fb5dfde07 100644 --- a/features/sharding/plugin/cache/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java +++ b/features/sharding/plugin/cache/src/test/java/org/apache/shardingsphere/sharding/cache/checker/ShardingRouteCacheableCheckerTest.java @@ -143,7 +143,7 @@ private ShardingRule prepareShardingRule() { ShardingTableRuleConfiguration nonCacheableTableSharding = new ShardingTableRuleConfiguration("t_non_cacheable_table_sharding", "ds_0.t_non_cacheable_table_sharding_${0..1}"); nonCacheableTableSharding.setTableShardingStrategy(new StandardShardingStrategyConfiguration("id", "inline")); ruleConfig.getTables().add(nonCacheableTableSharding); - return new ShardingRule(ruleConfig, Arrays.asList("ds_0", "ds_1"), new InstanceContext(mock(ComputeNodeInstance.class), props -> 0, null, null, null)); + return new ShardingRule(ruleConfig, Arrays.asList("ds_0", "ds_1"), new InstanceContext(mock(ComputeNodeInstance.class), props -> 0, null, null, null, null)); } private ShardingCacheRule prepareShardingCacheRule(final ShardingRule shardingRule) { diff --git a/features/sharding/plugin/cosid/src/test/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/CosIdSnowflakeKeyGenerateAlgorithmTest.java b/features/sharding/plugin/cosid/src/test/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/CosIdSnowflakeKeyGenerateAlgorithmTest.java index 712a45033566f..d8415e626c809 100644 --- a/features/sharding/plugin/cosid/src/test/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/CosIdSnowflakeKeyGenerateAlgorithmTest.java +++ b/features/sharding/plugin/cosid/src/test/java/org/apache/shardingsphere/sharding/cosid/algorithm/keygen/CosIdSnowflakeKeyGenerateAlgorithmTest.java @@ -27,6 +27,7 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.InstanceContext; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.sharding.cosid.algorithm.keygen.fixture.WorkerIdGeneratorFixture; @@ -60,7 +61,7 @@ public void assertGenerateKey() { CosIdSnowflakeKeyGenerateAlgorithm algorithm = (CosIdSnowflakeKeyGenerateAlgorithm) KeyGenerateAlgorithmFactory.newInstance( new AlgorithmConfiguration("COSID_SNOWFLAKE", new Properties())); algorithm.setInstanceContext(new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(FIXTURE_WORKER_ID), - new ModeConfiguration("Standalone", null), mock(LockContext.class), eventBusContext)); + new ModeConfiguration("Standalone", null), mock(ModeContextManager.class), mock(LockContext.class), eventBusContext)); long firstActualKey = (Long) algorithm.generateKey(); long secondActualKey = (Long) algorithm.generateKey(); SnowflakeIdState firstActualState = snowflakeIdStateParser.parse(firstActualKey); @@ -76,7 +77,7 @@ public void assertGenerateKey() { public void assertGenerateKeyModUniformity() { CosIdSnowflakeKeyGenerateAlgorithm algorithm = (CosIdSnowflakeKeyGenerateAlgorithm) KeyGenerateAlgorithmFactory.newInstance(new AlgorithmConfiguration("COSID_SNOWFLAKE", new Properties())); algorithm.setInstanceContext(new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(FIXTURE_WORKER_ID), - new ModeConfiguration("Standalone", null), mock(LockContext.class), eventBusContext)); + new ModeConfiguration("Standalone", null), mock(ModeContextManager.class), mock(LockContext.class), eventBusContext)); int divisor = 4; int total = 99999; int avg = total / divisor; @@ -121,7 +122,7 @@ public void assertGenerateKeyAsString() { new AlgorithmConfiguration("COSID_SNOWFLAKE", props)); algorithm.setInstanceContext(new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(FIXTURE_WORKER_ID), new ModeConfiguration("Standalone", null), - mock(LockContext.class), eventBusContext)); + mock(ModeContextManager.class), mock(LockContext.class), eventBusContext)); Comparable actualKey = algorithm.generateKey(); assertThat(actualKey, instanceOf(String.class)); String actualStringKey = (String) actualKey; @@ -142,7 +143,7 @@ public void assertGenerateKeyWhenNegative() { CosIdSnowflakeKeyGenerateAlgorithm algorithm = (CosIdSnowflakeKeyGenerateAlgorithm) KeyGenerateAlgorithmFactory.newInstance( new AlgorithmConfiguration("COSID_SNOWFLAKE", new Properties())); algorithm.setInstanceContext(new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(-1), - new ModeConfiguration("Standalone", null), mock(LockContext.class), eventBusContext)); + new ModeConfiguration("Standalone", null), mock(ModeContextManager.class), mock(LockContext.class), eventBusContext)); algorithm.generateKey(); } @@ -151,7 +152,7 @@ public void assertGenerateKeyWhenGreaterThen1023() { CosIdSnowflakeKeyGenerateAlgorithm algorithm = (CosIdSnowflakeKeyGenerateAlgorithm) KeyGenerateAlgorithmFactory.newInstance( new AlgorithmConfiguration("COSID_SNOWFLAKE", new Properties())); algorithm.setInstanceContext(new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(1024), - new ModeConfiguration("Standalone", null), mock(LockContext.class), eventBusContext)); + new ModeConfiguration("Standalone", null), mock(ModeContextManager.class), mock(LockContext.class), eventBusContext)); algorithm.generateKey(); } } diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java index beab858732df5..53bcd0d5aef1d 100644 --- a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/InstanceContext.java @@ -21,6 +21,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; import org.apache.shardingsphere.infra.instance.metadata.InstanceType; @@ -48,6 +49,8 @@ public final class InstanceContext { private final ModeConfiguration modeConfiguration; + private final ModeContextManager modeContextManager; + private final LockContext lockContext; private final EventBusContext eventBusContext; diff --git a/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/mode/ModeContextManager.java b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/mode/ModeContextManager.java new file mode 100644 index 0000000000000..780b5817994ed --- /dev/null +++ b/infra/common/src/main/java/org/apache/shardingsphere/infra/instance/mode/ModeContextManager.java @@ -0,0 +1,94 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.infra.instance.mode; + +import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; +import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties; + +import java.sql.SQLException; +import java.util.Collection; +import java.util.Map; +import java.util.Properties; + +/** + * Mode context manager. + */ +public interface ModeContextManager { + + /** + * Create database. + * + * @param databaseName database name + */ + void createDatabase(String databaseName); + + /** + * Drop database. + * + * @param databaseName database name + */ + void dropDatabase(String databaseName); + + /** + * Register storage units. + * + * @param databaseName database name + * @param toBeRegisterStorageUnitProps to be register storage unit props + * @throws SQLException SQL exception + */ + void registerStorageUnits(String databaseName, Map toBeRegisterStorageUnitProps) throws SQLException; + + /** + * Alter storage units. + * + * @param databaseName database name + * @param toBeUpdatedStorageUnitProps to be updated storage unit props + * @throws SQLException SQL exception + */ + void alterStorageUnits(String databaseName, Map toBeUpdatedStorageUnitProps) throws SQLException; + + /** + * Unregister storage units. + * @param databaseName database name + * @param toBeDroppedStorageUnitNames to be dropped storage unit names + * @throws SQLException SQL exception + */ + void unregisterStorageUnits(String databaseName, Collection toBeDroppedStorageUnitNames) throws SQLException; + + /** + * Alter rule configuration. + * + * @param databaseName database name + * @param ruleConfigs rule configs + */ + void alterRuleConfiguration(String databaseName, Collection ruleConfigs); + + /** + * Alter global rule configuration. + * + * @param globalRuleConfigs global rule configs + */ + void alterGlobalRuleConfiguration(Collection globalRuleConfigs); + + /** + * Alter properties. + * + * @param props pros + */ + void alterProperties(Properties props); +} diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/InstanceContextTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/InstanceContextTest.java index 83bf38a9a009e..674a627e71128 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/InstanceContextTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/instance/InstanceContextTest.java @@ -20,6 +20,7 @@ import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; import org.apache.shardingsphere.infra.instance.fixture.WorkerIdGeneratorFixture; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.state.StateType; import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; @@ -43,6 +44,8 @@ public final class InstanceContextTest { private final ModeConfiguration modeConfig = new ModeConfiguration("Standalone", null); + private final ModeContextManager modeContextManager = mock(ModeContextManager.class); + private final LockContext lockContext = mock(LockContext.class); private final EventBusContext eventBusContext = new EventBusContext(); @@ -51,7 +54,8 @@ public final class InstanceContextTest { public void assertUpdateInstanceStatus() { InstanceMetaData instanceMetaData = mock(InstanceMetaData.class); when(instanceMetaData.getId()).thenReturn("foo_instance_id"); - InstanceContext context = new InstanceContext(new ComputeNodeInstance(instanceMetaData), new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, lockContext, eventBusContext); + InstanceContext context = new InstanceContext(new ComputeNodeInstance(instanceMetaData), + new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, modeContextManager, lockContext, eventBusContext); StateType actual = context.getInstance().getState().getCurrentState(); assertThat(actual, is(StateType.OK)); context.updateInstanceStatus(instanceMetaData.getId(), StateType.CIRCUIT_BREAK.name()); @@ -66,14 +70,14 @@ public void assertUpdateInstanceStatus() { public void assertGetWorkerId() { ComputeNodeInstance computeNodeInstance = mock(ComputeNodeInstance.class); when(computeNodeInstance.getWorkerId()).thenReturn(0); - InstanceContext context = new InstanceContext(computeNodeInstance, new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, lockContext, eventBusContext); + InstanceContext context = new InstanceContext(computeNodeInstance, new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, modeContextManager, lockContext, eventBusContext); assertThat(context.getWorkerId(), is(0)); } @Test public void assertGenerateWorkerId() { InstanceContext context = new InstanceContext( - new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, lockContext, eventBusContext); + new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, modeContextManager, lockContext, eventBusContext); assertThat(context.generateWorkerId(new Properties()), is(Integer.MIN_VALUE)); } @@ -81,7 +85,8 @@ public void assertGenerateWorkerId() { public void assertUpdateLabel() { InstanceMetaData instanceMetaData = mock(InstanceMetaData.class); when(instanceMetaData.getId()).thenReturn("foo_instance_id"); - InstanceContext context = new InstanceContext(new ComputeNodeInstance(instanceMetaData), new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, lockContext, eventBusContext); + InstanceContext context = new InstanceContext(new ComputeNodeInstance(instanceMetaData), new WorkerIdGeneratorFixture(Integer.MIN_VALUE), + modeConfig, modeContextManager, lockContext, eventBusContext); Set expected = new LinkedHashSet<>(Arrays.asList("label_1", "label_2")); context.updateLabel("foo_instance_id", expected); Collection actual = context.getInstance().getLabels(); @@ -91,7 +96,7 @@ public void assertUpdateLabel() { @Test public void assertGetInstance() { ComputeNodeInstance expected = new ComputeNodeInstance(mock(InstanceMetaData.class)); - InstanceContext context = new InstanceContext(expected, new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, lockContext, eventBusContext); + InstanceContext context = new InstanceContext(expected, new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, modeContextManager, lockContext, eventBusContext); ComputeNodeInstance actual = context.getInstance(); assertThat(actual, is(expected)); } @@ -99,24 +104,24 @@ public void assertGetInstance() { @Test public void assertGetState() { InstanceContext context = new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, - lockContext, eventBusContext); + modeContextManager, lockContext, eventBusContext); assertNotNull(context.getInstance().getState()); } @Test public void assertGetModeConfiguration() { InstanceContext context = new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, - lockContext, eventBusContext); + modeContextManager, lockContext, eventBusContext); assertThat(context.getModeConfiguration(), is(modeConfig)); } @Test public void assertIsCluster() { InstanceContext context = new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(Integer.MIN_VALUE), modeConfig, - lockContext, eventBusContext); + modeContextManager, lockContext, eventBusContext); assertFalse(context.isCluster()); InstanceContext clusterContext = new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), new WorkerIdGeneratorFixture(Integer.MIN_VALUE), - new ModeConfiguration("Cluster", null), lockContext, eventBusContext); + new ModeConfiguration("Cluster", null), modeContextManager, lockContext, eventBusContext); assertTrue(clusterContext.isCluster()); } } diff --git a/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java b/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java index 37601602934b8..7f3cdb5ad28c3 100644 --- a/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java +++ b/infra/common/src/test/java/org/apache/shardingsphere/infra/rule/builder/global/GlobalRulesBuilderTest.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.InstanceContext; import org.apache.shardingsphere.infra.instance.metadata.jdbc.JDBCInstanceMetaData; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; @@ -68,7 +69,7 @@ private ShardingSphereDatabase buildDatabase() { private InstanceContext buildInstanceContext() { ComputeNodeInstance computeNodeInstance = new ComputeNodeInstance(new JDBCInstanceMetaData(UUID.randomUUID().toString())); ModeConfiguration modeConfig = new ModeConfiguration("Standalone", null); - return new InstanceContext(computeNodeInstance, createWorkerIdGenerator(), modeConfig, mock(LockContext.class), new EventBusContext()); + return new InstanceContext(computeNodeInstance, createWorkerIdGenerator(), modeConfig, mock(ModeContextManager.class), mock(LockContext.class), new EventBusContext()); } private WorkerIdGenerator createWorkerIdGenerator() { diff --git a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/builder/TransactionRuleBuilderTest.java b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/builder/TransactionRuleBuilderTest.java index 811631c963689..0b1c34224025d 100644 --- a/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/builder/TransactionRuleBuilderTest.java +++ b/kernel/transaction/core/src/test/java/org/apache/shardingsphere/transaction/rule/builder/TransactionRuleBuilderTest.java @@ -23,6 +23,7 @@ import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; import org.apache.shardingsphere.infra.instance.InstanceContext; import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator; import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; @@ -54,8 +55,8 @@ public void assertBuild() { TransactionRuleConfiguration ruleConfig = new TransactionRuleConfiguration("LOCAL", "provider", new Properties()); ShardingSphereDatabase database = new ShardingSphereDatabase("logic_db", null, new ShardingSphereResourceMetaData("db", createDataSourceMap()), new ShardingSphereRuleMetaData(Collections.singletonList(mock(ShardingSphereRule.class))), Collections.singletonMap("test", mock(ShardingSphereSchema.class))); - InstanceContext instanceContext = new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), - mock(WorkerIdGenerator.class), new ModeConfiguration("Standalone", null), mock(LockContext.class), new EventBusContext()); + InstanceContext instanceContext = new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), mock(WorkerIdGenerator.class), + new ModeConfiguration("Standalone", null), mock(ModeContextManager.class), mock(LockContext.class), new EventBusContext()); TransactionRule rule = new TransactionRuleBuilder().build(ruleConfig, Collections.singletonMap(DefaultDatabase.LOGIC_NAME, database), instanceContext, mock(ConfigurationProperties.class)); assertNotNull(rule.getConfiguration()); assertThat(rule.getDatabases().get("logic_db").getResourceMetaData().getDataSources().size(), is(2)); diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java index 40914ec0d676d..bf9bf12b0379d 100644 --- a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java @@ -121,20 +121,6 @@ public synchronized void addDatabase(final String databaseName) { metaDataContexts.getMetaData().addDatabase(databaseName, protocolType); } - /** - * Add database and persist. - * - * @param databaseName database name - */ - public synchronized void addDatabaseAndPersist(final String databaseName) { - if (metaDataContexts.getMetaData().containsDatabase(databaseName)) { - return; - } - DatabaseType protocolType = DatabaseTypeEngine.getProtocolType(Collections.emptyMap(), metaDataContexts.getMetaData().getProps()); - metaDataContexts.getMetaData().addDatabase(databaseName, protocolType); - metaDataContexts.getPersistService().getDatabaseMetaDataService().addDatabase(databaseName); - } - /** * Drop database. * @@ -149,30 +135,29 @@ public synchronized void dropDatabase(final String databaseName) { } /** - * Drop database and persist. + * Add schema. * * @param databaseName database name + * @param schemaName schema name */ - public synchronized void dropDatabaseAndPersist(final String databaseName) { - if (!metaDataContexts.getMetaData().containsDatabase(databaseName)) { + public synchronized void addSchema(final String databaseName, final String schemaName) { + if (metaDataContexts.getMetaData().getDatabase(databaseName).containsSchema(schemaName)) { return; } - String actualDatabaseName = metaDataContexts.getMetaData().getActualDatabaseName(databaseName); - metaDataContexts.getMetaData().dropDatabase(actualDatabaseName); - metaDataContexts.getPersistService().getDatabaseMetaDataService().dropDatabase(actualDatabaseName); + metaDataContexts.getMetaData().getDatabase(databaseName).putSchema(schemaName, new ShardingSphereSchema()); } /** - * Add schema. + * Drop schema. * * @param databaseName database name * @param schemaName schema name */ - public synchronized void addSchema(final String databaseName, final String schemaName) { - if (metaDataContexts.getMetaData().getDatabase(databaseName).containsSchema(schemaName)) { + public synchronized void dropSchema(final String databaseName, final String schemaName) { + if (!metaDataContexts.getMetaData().getDatabase(databaseName).containsSchema(schemaName)) { return; } - metaDataContexts.getMetaData().getDatabase(databaseName).putSchema(schemaName, new ShardingSphereSchema()); + metaDataContexts.getMetaData().getDatabase(databaseName).removeSchema(schemaName); } /** @@ -184,9 +169,6 @@ public synchronized void addSchema(final String databaseName, final String schem * @param toBeDeletedViewName to be deleted view name */ public synchronized void alterSchema(final String databaseName, final String schemaName, final String toBeDeletedTableName, final String toBeDeletedViewName) { - if (!metaDataContexts.getMetaData().containsDatabase(databaseName) || !metaDataContexts.getMetaData().getDatabase(databaseName).containsSchema(schemaName)) { - return; - } Optional.ofNullable(toBeDeletedTableName).ifPresent(optional -> dropTable(databaseName, schemaName, optional)); Optional.ofNullable(toBeDeletedViewName).ifPresent(optional -> dropView(databaseName, schemaName, optional)); } @@ -240,102 +222,6 @@ private boolean containsMutableDataNodeRule(final ShardingSphereDatabase databas .filter(each -> !(each instanceof MutableDataNodeRule)).anyMatch(each -> each.getAllTables().contains(tableName)); } - /** - * Drop schema. - * - * @param databaseName database name - * @param schemaName schema name - */ - public synchronized void dropSchema(final String databaseName, final String schemaName) { - ShardingSphereDatabase database = metaDataContexts.getMetaData().getDatabase(databaseName); - if (null == database || !database.containsSchema(schemaName)) { - return; - } - database.removeSchema(schemaName); - } - - /** - * Add resources. - * - * @param databaseName database name - * @param toBeAddedDataSourcePropsMap to be added data source properties map - * @throws SQLException SQL exception - */ - public synchronized void addResources(final String databaseName, final Map toBeAddedDataSourcePropsMap) throws SQLException { - SwitchingResource switchingResource = new ResourceSwitchManager().create(metaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(), toBeAddedDataSourcePropsMap); - metaDataContexts.getMetaData().getDatabases().putAll(createChangedDatabases(databaseName, switchingResource, null)); - metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each -> each.addResource(metaDataContexts.getMetaData().getDatabase(databaseName))); - metaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName, schema) -> metaDataContexts.getPersistService().getDatabaseMetaDataService() - .persist(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), schemaName, schema)); - metaDataContexts.getPersistService().getDataSourceService().append(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), toBeAddedDataSourcePropsMap); - switchingResource.closeStaleDataSources(); - } - - /** - * Update resources. - * - * @param databaseName database name - * @param toBeUpdatedDataSourcePropsMap to be updated data source properties map - * @throws SQLException SQL exception - */ - public synchronized void updateResources(final String databaseName, final Map toBeUpdatedDataSourcePropsMap) throws SQLException { - SwitchingResource switchingResource = new ResourceSwitchManager().create(metaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(), toBeUpdatedDataSourcePropsMap); - metaDataContexts.getMetaData().getDatabases().putAll(createChangedDatabases(databaseName, switchingResource, null)); - metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each -> each.addResource(metaDataContexts.getMetaData().getDatabase(databaseName))); - metaDataContexts.getMetaData().getDatabases().putAll(newShardingSphereDatabase(metaDataContexts.getMetaData().getDatabase(databaseName))); - metaDataContexts.getPersistService().getDataSourceService().append(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), toBeUpdatedDataSourcePropsMap); - switchingResource.closeStaleDataSources(); - } - - /** - * Drop resources. - * - * @param databaseName database name - * @param toBeDroppedResourceNames to be dropped resource names - * @throws SQLException SQL exception - */ - public synchronized void dropResources(final String databaseName, final Collection toBeDroppedResourceNames) throws SQLException { - // TODO should check to be dropped resources are unused here. ContextManager is atomic domain to maintain metadata, not DistSQL handler - Map dataSourcePropsMap = metaDataContexts.getPersistService().getDataSourceService().load(metaDataContexts.getMetaData().getActualDatabaseName(databaseName)); - Map toBeDeletedDataSourcePropsMap = getToBeDeletedDataSourcePropsMap(dataSourcePropsMap, toBeDroppedResourceNames); - SwitchingResource switchingResource = - new ResourceSwitchManager().createByDropResource(metaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(), toBeDeletedDataSourcePropsMap); - metaDataContexts.getMetaData().getDatabases().putAll(renewDatabase(metaDataContexts.getMetaData().getDatabase(databaseName), switchingResource)); - MetaDataContexts reloadMetaDataContexts = createMetaDataContexts(databaseName, switchingResource, null); - alterSchemaMetaData(databaseName, reloadMetaDataContexts.getMetaData().getDatabase(databaseName), metaDataContexts.getMetaData().getDatabase(databaseName)); - deletedSchemaNames(databaseName, reloadMetaDataContexts.getMetaData().getDatabase(databaseName), metaDataContexts.getMetaData().getDatabase(databaseName)); - metaDataContexts = reloadMetaDataContexts; - Map toBeReversedDataSourcePropsMap = getToBeReversedDataSourcePropsMap(dataSourcePropsMap, toBeDroppedResourceNames); - metaDataContexts.getPersistService().getDataSourceService().persist(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), toBeReversedDataSourcePropsMap); - switchingResource.closeStaleDataSources(); - } - - private Map renewDatabase(final ShardingSphereDatabase database, final SwitchingResource resource) { - Map result = new LinkedHashMap<>(1, 1); - Map newDataSource = - database.getResourceMetaData().getDataSources().entrySet().stream().filter(entry -> !resource.getStaleDataSources().containsKey(entry.getKey())) - .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (oldValue, currentValue) -> oldValue, LinkedHashMap::new)); - result.put(database.getName().toLowerCase(), - new ShardingSphereDatabase(database.getName(), database.getProtocolType(), new ShardingSphereResourceMetaData(database.getName(), newDataSource), - database.getRuleMetaData(), database.getSchemas())); - return result; - } - - private Map getToBeDeletedDataSourcePropsMap(final Map dataSourcePropsMap, final Collection toBeDroppedResourceNames) { - return dataSourcePropsMap.entrySet().stream().filter(entry -> toBeDroppedResourceNames.contains(entry.getKey())).collect(Collectors.toMap(Entry::getKey, Entry::getValue)); - } - - private Map getToBeReversedDataSourcePropsMap(final Map dataSourcePropsMap, final Collection toBeDroppedResourceNames) { - return dataSourcePropsMap.entrySet().stream().filter(entry -> !toBeDroppedResourceNames.contains(entry.getKey())).collect(Collectors.toMap(Entry::getKey, Entry::getValue)); - } - - private synchronized void alterSchemaMetaData(final String databaseName, final ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase currentDatabase) { - Map toBeDeletedTables = SchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(), currentDatabase.getSchemas()); - Map toBeAddedTables = SchemaManager.getToBeAddedTablesBySchemas(reloadDatabase.getSchemas(), currentDatabase.getSchemas()); - toBeAddedTables.forEach((key, value) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().persist(databaseName, key, value)); - toBeDeletedTables.forEach((key, value) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().delete(databaseName, key, value)); - } - /** * Alter rule configuration. * @@ -356,6 +242,20 @@ public synchronized void alterRuleConfiguration(final String databaseName, final } } + /** + * Alter schema meta data. + * + * @param databaseName database name + * @param reloadDatabase reload database + * @param currentDatabase current database + */ + public synchronized void alterSchemaMetaData(final String databaseName, final ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase currentDatabase) { + Map toBeDeletedTables = SchemaManager.getToBeDeletedTablesBySchemas(reloadDatabase.getSchemas(), currentDatabase.getSchemas()); + Map toBeAddedTables = SchemaManager.getToBeAddedTablesBySchemas(reloadDatabase.getSchemas(), currentDatabase.getSchemas()); + toBeAddedTables.forEach((key, value) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().persist(databaseName, key, value)); + toBeDeletedTables.forEach((key, value) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().delete(databaseName, key, value)); + } + /** * Alter data source configuration. * @@ -378,6 +278,24 @@ public synchronized void alterDataSourceConfiguration(final String databaseName, } } + /** + * Renew ShardingSphere databases. + * + * @param database database + * @param resource resource + * @return ShardingSphere databases + */ + public synchronized Map renewDatabase(final ShardingSphereDatabase database, final SwitchingResource resource) { + Map result = new LinkedHashMap<>(1, 1); + Map newDataSource = + database.getResourceMetaData().getDataSources().entrySet().stream().filter(entry -> !resource.getStaleDataSources().containsKey(entry.getKey())) + .collect(Collectors.toMap(Entry::getKey, Entry::getValue, (oldValue, currentValue) -> oldValue, LinkedHashMap::new)); + result.put(database.getName().toLowerCase(), + new ShardingSphereDatabase(database.getName(), database.getProtocolType(), new ShardingSphereResourceMetaData(database.getName(), newDataSource), + database.getRuleMetaData(), database.getSchemas())); + return result; + } + /** * Alter data source and rule configuration. * @@ -408,7 +326,17 @@ private Collection getStaleResourceHeldRules(final String data return result; } - private MetaDataContexts createMetaDataContexts(final String databaseName, final SwitchingResource switchingResource, final Collection ruleConfigs) throws SQLException { + /** + * Create meta data contexts. + * + * @param databaseName database name + * @param switchingResource switching resource + * @param ruleConfigs rule configs + * @return MetaDataContexts meta data contexts + * @throws SQLException SQL exception + */ + public synchronized MetaDataContexts createMetaDataContexts(final String databaseName, final SwitchingResource switchingResource, + final Collection ruleConfigs) throws SQLException { Map changedDatabases = createChangedDatabases(databaseName, switchingResource, ruleConfigs); ConfigurationProperties props = metaDataContexts.getMetaData().getProps(); ShardingSphereRuleMetaData changedGlobalMetaData = new ShardingSphereRuleMetaData( @@ -425,7 +353,16 @@ private MetaDataContexts createMetaDataContexts(final String databaseName, final return newMetaDataContexts(new ShardingSphereMetaData(changedDatabases, changedGlobalMetaData, props)); } - private Map createChangedDatabases(final String databaseName, + /** + * Create changed databases. + * + * @param databaseName database name + * @param switchingResource switching resource + * @param ruleConfigs rule configs + * @return ShardingSphere databases + * @throws SQLException SQL exception + */ + public synchronized Map createChangedDatabases(final String databaseName, final SwitchingResource switchingResource, final Collection ruleConfigs) throws SQLException { if (null != switchingResource && !switchingResource.getNewDataSources().isEmpty()) { metaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources().putAll(switchingResource.getNewDataSources()); @@ -454,7 +391,13 @@ private Map newShardingSphereSchemas(final Shardin return result; } - private Map newShardingSphereDatabase(final ShardingSphereDatabase originalDatabase) { + /** + * Create new ShardingSphere database. + * + * @param originalDatabase original database + * @return ShardingSphere databases + */ + public synchronized Map newShardingSphereDatabase(final ShardingSphereDatabase originalDatabase) { Map result = new LinkedHashMap<>(1, 1); result.put(originalDatabase.getName().toLowerCase(), new ShardingSphereDatabase(originalDatabase.getName(), originalDatabase.getProtocolType(), originalDatabase.getResourceMetaData(), originalDatabase.getRuleMetaData(), @@ -492,11 +435,6 @@ public synchronized void alterProperties(final Properties props) { metaDataContexts = newMetaDataContexts(toBeChangedMetaData); } - private void deletedSchemaNames(final String databaseName, final ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase currentDatabase) { - SchemaManager.getToBeDeletedSchemaNames(reloadDatabase.getSchemas(), currentDatabase.getSchemas()).keySet() - .forEach(each -> metaDataContexts.getPersistService().getDatabaseMetaDataService().dropSchema(databaseName, each)); - } - /** * Reload database metadata from governance center. * @@ -519,6 +457,18 @@ public synchronized void reloadDatabaseMetaData(final String databaseName) { } } + /** + * Delete schema names. + * + * @param databaseName database name + * @param reloadDatabase reload database + * @param currentDatabase current database + */ + public synchronized void deletedSchemaNames(final String databaseName, final ShardingSphereDatabase reloadDatabase, final ShardingSphereDatabase currentDatabase) { + SchemaManager.getToBeDeletedSchemaNames(reloadDatabase.getSchemas(), currentDatabase.getSchemas()).keySet() + .forEach(each -> metaDataContexts.getPersistService().getDatabaseMetaDataService().dropSchema(databaseName, each)); + } + /** * Reload schema. * @@ -576,7 +526,7 @@ public void reloadTable(final String databaseName, final String schemaName, fina * @param dataSourceName data source name * @param tableName to be reloaded table name */ - public void reloadTable(final String databaseName, final String schemaName, final String dataSourceName, final String tableName) { + public synchronized void reloadTable(final String databaseName, final String schemaName, final String dataSourceName, final String tableName) { Map dataSourceMap = Collections.singletonMap( dataSourceName, metaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData().getDataSources().get(dataSourceName)); try { diff --git a/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManagerAware.java b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManagerAware.java new file mode 100644 index 0000000000000..e8845bd2f0d9d --- /dev/null +++ b/mode/core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManagerAware.java @@ -0,0 +1,31 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager; + +/** + * Context manager aware. + */ +public interface ContextManagerAware { + + /** + * Set context manager aware. + * + * @param contextManager context manager + */ + void setContextManagerAware(ContextManager contextManager); +} diff --git a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java index 0dc0e33dcb536..ad998d2b1a143 100644 --- a/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java +++ b/mode/core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java @@ -40,13 +40,10 @@ import org.apache.shardingsphere.test.fixture.jdbc.MockedDataSource; import org.apache.shardingsphere.transaction.config.TransactionRuleConfiguration; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import javax.sql.DataSource; -import java.sql.SQLException; import java.sql.Types; -import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import java.util.LinkedHashMap; @@ -116,28 +113,15 @@ public void assertRenewMetaDataContexts() { } @Test - public void assertAddDatabase() throws SQLException { - contextManager.addDatabaseAndPersist("new_db"); + public void assertAddDatabase() { + contextManager.addDatabase("new_db"); verify(metaDataContexts.getMetaData()).addDatabase(eq("new_db"), any(DatabaseType.class)); } @Test - public void assertAddDatabaseAndPersist() throws SQLException { - contextManager.addDatabaseAndPersist("new_db"); - verify(metaDataContexts.getMetaData()).addDatabase(eq("new_db"), any(DatabaseType.class)); - } - - @Test - public void assertAddExistedDatabase() throws SQLException { + public void assertAddExistedDatabase() { when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true); - contextManager.addDatabaseAndPersist("foo_db"); - verify(metaDataContexts.getMetaData(), times(0)).addDatabase(eq("foo_db"), any(DatabaseType.class)); - } - - @Test - public void assertAddExistedDatabaseAndPersist() throws SQLException { - when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true); - contextManager.addDatabaseAndPersist("foo_db"); + contextManager.addDatabase("foo_db"); verify(metaDataContexts.getMetaData(), times(0)).addDatabase(eq("foo_db"), any(DatabaseType.class)); } @@ -145,27 +129,13 @@ public void assertAddExistedDatabaseAndPersist() throws SQLException { public void assertDropDatabase() { when(metaDataContexts.getMetaData().getActualDatabaseName("foo_db")).thenReturn("foo_db"); when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true); - contextManager.dropDatabaseAndPersist("foo_db"); - verify(metaDataContexts.getMetaData()).dropDatabase("foo_db"); - } - - @Test - public void assertDropDatabaseAndPersist() { - when(metaDataContexts.getMetaData().getActualDatabaseName("foo_db")).thenReturn("foo_db"); - when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true); - contextManager.dropDatabaseAndPersist("foo_db"); + contextManager.dropDatabase("foo_db"); verify(metaDataContexts.getMetaData()).dropDatabase("foo_db"); } @Test public void assertDropNotExistedDatabase() { - contextManager.dropDatabaseAndPersist("not_existed_db"); - verify(metaDataContexts.getMetaData(), times(0)).dropDatabase("not_existed_db"); - } - - @Test - public void assertDropNotExistedDatabaseAndPersist() { - contextManager.dropDatabaseAndPersist("not_existed_db"); + contextManager.dropDatabase("not_existed_db"); verify(metaDataContexts.getMetaData(), times(0)).dropDatabase("not_existed_db"); } @@ -227,19 +197,6 @@ private ShardingSphereSchema createToBeAlteredSchema() { return new ShardingSphereSchema(Collections.singletonMap("foo_tbl", beforeChangedTable), Collections.singletonMap("foo_view", beforeChangedView)); } - @Ignore - @Test - public void assertUpdateResources() throws SQLException { - ShardingSphereDatabase originalDatabase = createOriginalDatabaseMetaData(); - ShardingSphereResourceMetaData originalResourceMetaData = originalDatabase.getResourceMetaData(); - DataSource originalDataSource = originalResourceMetaData.getDataSources().get("bar_ds"); - when(metaDataContexts.getMetaData().getDatabase("foo_db")).thenReturn(originalDatabase); - contextManager.updateResources("foo_db", Collections.singletonMap("bar_ds", new DataSourceProperties(MockedDataSource.class.getName(), - createProperties("test", "test")))); - verify(originalResourceMetaData, times(1)).close(originalDataSource); - assertAlteredDataSource((MockedDataSource) contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResourceMetaData().getDataSources().get("bar_ds")); - } - private ShardingSphereDatabase createOriginalDatabaseMetaData() { ShardingSphereResourceMetaData resourceMetaData = mock(ShardingSphereResourceMetaData.class); when(resourceMetaData.getDataSources()).thenReturn(Collections.singletonMap("bar_ds", new MockedDataSource())); @@ -254,24 +211,6 @@ private void assertAlteredDataSource(final MockedDataSource actual) { assertThat(actual.getUsername(), is("test")); } - @Test - public void assertDropResources() throws SQLException { - ShardingSphereDatabase database = new ShardingSphereDatabase( - "foo_db", new MySQLDatabaseType(), createOriginalResource(), createOriginalRuleMetaData(), Collections.emptyMap()); - when(metaDataContexts.getMetaData().getDatabase("foo_db")).thenReturn(database); - Map databases = new LinkedHashMap<>(1, 1); - databases.put("foo_db", database); - when(metaDataContexts.getMetaData().getDatabases()).thenReturn(databases); - when(metaDataContexts.getMetaData().getActualDatabaseName("foo_db")).thenReturn("foo_db"); - when(metaDataContexts.getPersistService()).thenReturn(mock(MetaDataPersistService.class, RETURNS_DEEP_STUBS)); - Map dataSourcePropertiesMap = new LinkedHashMap<>(1, 1); - dataSourcePropertiesMap.put("ds_1", mock(DataSourceProperties.class)); - dataSourcePropertiesMap.put("ds_2", mock(DataSourceProperties.class)); - when(metaDataContexts.getPersistService().getDataSourceService().load("foo_db")).thenReturn(dataSourcePropertiesMap); - contextManager.dropResources("foo_db", Arrays.asList("ds_1", "ds_2")); - assertTrue(metaDataContexts.getMetaData().getDatabases().get("foo_db").getResourceMetaData().getDataSources().isEmpty()); - } - @Test public void assertAlterRuleConfiguration() { ShardingSphereResourceMetaData resourceMetaData = mock(ShardingSphereResourceMetaData.class); diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java index 6e08b085d5b25..b3537a9b27087 100644 --- a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java @@ -48,13 +48,14 @@ public ContextManager build(final ContextManagerBuilderParameter param) throws S MetaDataPersistService persistService = new MetaDataPersistService(repository); persistConfigurations(persistService, param); RegistryCenter registryCenter = new RegistryCenter(repository, new EventBusContext(), param.getInstanceMetaData(), param.getDatabaseConfigs()); - InstanceContext instanceContext = buildInstanceContext(registryCenter, param); + InstanceContext instanceContext = buildInstanceContext(persistService, registryCenter, param); if (registryCenter.getRepository() instanceof InstanceContextAware) { ((InstanceContextAware) registryCenter.getRepository()).setInstanceContext(instanceContext); } MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(persistService, param, instanceContext, registryCenter.getStorageNodeStatusService().loadStorageNodes()); persistMetaData(metaDataContexts); ContextManager result = new ContextManager(metaDataContexts, instanceContext); + setContextManagerAware(result); registerOnline(persistService, registryCenter, param, result); return result; } @@ -65,9 +66,9 @@ private void persistConfigurations(final MetaDataPersistService persistService, } } - private InstanceContext buildInstanceContext(final RegistryCenter registryCenter, final ContextManagerBuilderParameter param) { + private InstanceContext buildInstanceContext(final MetaDataPersistService persistService, final RegistryCenter registryCenter, final ContextManagerBuilderParameter param) { return new InstanceContext(new ComputeNodeInstance(param.getInstanceMetaData()), new ClusterWorkerIdGenerator(registryCenter, param.getInstanceMetaData()), - param.getModeConfiguration(), new GlobalLockContext(registryCenter.getGlobalLockPersistService()), registryCenter.getEventBusContext()); + param.getModeConfiguration(), new ClusterModeContextManager(), new GlobalLockContext(registryCenter.getGlobalLockPersistService()), registryCenter.getEventBusContext()); } private void persistMetaData(final MetaDataContexts metaDataContexts) { @@ -77,6 +78,10 @@ private void persistMetaData(final MetaDataContexts metaDataContexts) { .getPersistService().getShardingSphereDataPersistService().persist(databaseName, schemaName, schemaData, metaDataContexts.getMetaData().getDatabases()))); } + private void setContextManagerAware(final ContextManager contextManager) { + ((ClusterModeContextManager) contextManager.getInstanceContext().getModeContextManager()).setContextManagerAware(contextManager); + } + private void registerOnline(final MetaDataPersistService persistService, final RegistryCenter registryCenter, final ContextManagerBuilderParameter param, final ContextManager contextManager) { contextManager.getInstanceContext().getInstance().setLabels(param.getLabels()); contextManager.getInstanceContext().getAllClusterInstances().addAll(registryCenter.getComputeNodeStatusService().loadAllComputeNodeInstances()); diff --git a/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java new file mode 100644 index 0000000000000..65d541b5c537e --- /dev/null +++ b/mode/type/cluster/core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterModeContextManager.java @@ -0,0 +1,89 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager.cluster; + +import lombok.RequiredArgsConstructor; +import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; +import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; +import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.mode.manager.ContextManagerAware; + +import java.util.Collection; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +/** + * Cluster mode context manager. + */ +@RequiredArgsConstructor +public final class ClusterModeContextManager implements ModeContextManager, ContextManagerAware { + + private ContextManager contextManager; + + @Override + public void createDatabase(final String databaseName) { + contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().addDatabase(databaseName); + } + + @Override + public void dropDatabase(final String databaseName) { + contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().dropDatabase(databaseName); + } + + @Override + public void registerStorageUnits(final String databaseName, final Map toBeRegisterStorageUnitProps) { + contextManager.getMetaDataContexts().getPersistService().getDataSourceService().append(databaseName, toBeRegisterStorageUnitProps); + } + + @Override + public void alterStorageUnits(final String databaseName, final Map toBeUpdatedStorageUnitProps) { + contextManager.getMetaDataContexts().getPersistService().getDataSourceService().append(databaseName, toBeUpdatedStorageUnitProps); + } + + @Override + public void unregisterStorageUnits(final String databaseName, final Collection toBeDroppedStorageUnitNames) { + contextManager.getMetaDataContexts().getPersistService().getDataSourceService().persist(databaseName, + getToBeReversedDataSourcePropsMap(contextManager.getMetaDataContexts().getPersistService().getDataSourceService().load(databaseName), toBeDroppedStorageUnitNames)); + } + + private Map getToBeReversedDataSourcePropsMap(final Map dataSourcePropsMap, final Collection toBeDroppedResourceNames) { + return dataSourcePropsMap.entrySet().stream().filter(entry -> !toBeDroppedResourceNames.contains(entry.getKey())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + @Override + public void alterRuleConfiguration(final String databaseName, final Collection ruleConfigs) { + contextManager.getMetaDataContexts().getPersistService().getDatabaseRulePersistService().persist(databaseName, ruleConfigs); + } + + @Override + public void alterGlobalRuleConfiguration(final Collection globalRuleConfigs) { + contextManager.getMetaDataContexts().getPersistService().getGlobalRuleService().persist(globalRuleConfigs); + } + + @Override + public void alterProperties(final Properties props) { + contextManager.getMetaDataContexts().getPersistService().getPropsService().persist(props); + } + + @Override + public void setContextManagerAware(final ContextManager contextManager) { + this.contextManager = contextManager; + } +} diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java index 7b705b9dbed0b..26e7a92293346 100644 --- a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneContextManagerBuilder.java @@ -47,7 +47,9 @@ public ContextManager build(final ContextManagerBuilderParameter param) throws S InstanceContext instanceContext = buildInstanceContext(param); new ProcessStandaloneSubscriber(instanceContext.getEventBusContext()); MetaDataContexts metaDataContexts = MetaDataContextsFactory.create(persistService, param, instanceContext); - return new ContextManager(metaDataContexts, instanceContext); + ContextManager result = new ContextManager(metaDataContexts, instanceContext); + setContextManagerAware(result); + return result; } private void persistConfigurations(final MetaDataPersistService persistService, final ContextManagerBuilderParameter param) { @@ -58,7 +60,11 @@ private void persistConfigurations(final MetaDataPersistService persistService, private InstanceContext buildInstanceContext(final ContextManagerBuilderParameter param) { return new InstanceContext(new ComputeNodeInstance(param.getInstanceMetaData()), - new StandaloneWorkerIdGenerator(), param.getModeConfiguration(), new GlobalLockContext(null), new EventBusContext()); + new StandaloneWorkerIdGenerator(), param.getModeConfiguration(), new StandaloneModeContextManager(), new GlobalLockContext(null), new EventBusContext()); + } + + private void setContextManagerAware(final ContextManager contextManager) { + ((StandaloneModeContextManager) contextManager.getInstanceContext().getModeContextManager()).setContextManagerAware(contextManager); } @Override diff --git a/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java new file mode 100644 index 0000000000000..1e5661b13138d --- /dev/null +++ b/mode/type/standalone/core/src/main/java/org/apache/shardingsphere/mode/manager/standalone/StandaloneModeContextManager.java @@ -0,0 +1,131 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.shardingsphere.mode.manager.standalone; + +import org.apache.shardingsphere.infra.config.rule.RuleConfiguration; +import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; +import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; +import org.apache.shardingsphere.infra.rule.identifier.type.ResourceHeldRule; +import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.mode.manager.ContextManagerAware; +import org.apache.shardingsphere.mode.manager.switcher.ResourceSwitchManager; +import org.apache.shardingsphere.mode.manager.switcher.SwitchingResource; +import org.apache.shardingsphere.mode.metadata.MetaDataContexts; + +import java.sql.SQLException; +import java.util.Collection; +import java.util.Map; +import java.util.Properties; +import java.util.stream.Collectors; + +/** + * Standalone mode context manager. + */ +public final class StandaloneModeContextManager implements ModeContextManager, ContextManagerAware { + + private ContextManager contextManager; + + private volatile MetaDataContexts metaDataContexts; + + @Override + public void createDatabase(final String databaseName) { + contextManager.addDatabase(databaseName); + contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().addDatabase(databaseName); + } + + @Override + public void dropDatabase(final String databaseName) { + contextManager.dropDatabase(databaseName); + contextManager.getMetaDataContexts().getPersistService().getDatabaseMetaDataService().dropDatabase(databaseName); + } + + @Override + public void registerStorageUnits(final String databaseName, final Map toBeRegisterStorageUnitProps) throws SQLException { + SwitchingResource switchingResource = new ResourceSwitchManager().create(metaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(), toBeRegisterStorageUnitProps); + metaDataContexts.getMetaData().getDatabases().putAll(contextManager.createChangedDatabases(databaseName, switchingResource, null)); + metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each -> each.addResource(metaDataContexts.getMetaData().getDatabase(databaseName))); + metaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().forEach((schemaName, schema) -> metaDataContexts.getPersistService().getDatabaseMetaDataService() + .persist(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), schemaName, schema)); + metaDataContexts.getPersistService().getDataSourceService().append(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), toBeRegisterStorageUnitProps); + } + + @Override + public void alterStorageUnits(final String databaseName, final Map toBeUpdatedStorageUnitProps) throws SQLException { + SwitchingResource switchingResource = new ResourceSwitchManager().create(metaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(), toBeUpdatedStorageUnitProps); + metaDataContexts.getMetaData().getDatabases().putAll(contextManager.createChangedDatabases(databaseName, switchingResource, null)); + metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each -> each.addResource(metaDataContexts.getMetaData().getDatabase(databaseName))); + metaDataContexts.getMetaData().getDatabases().putAll(contextManager.newShardingSphereDatabase(metaDataContexts.getMetaData().getDatabase(databaseName))); + metaDataContexts.getPersistService().getDataSourceService().append(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), toBeUpdatedStorageUnitProps); + switchingResource.closeStaleDataSources(); + } + + @Override + public void unregisterStorageUnits(final String databaseName, final Collection toBeDroppedStorageUnitNames) throws SQLException { + Map dataSourcePropsMap = metaDataContexts.getPersistService().getDataSourceService().load(metaDataContexts.getMetaData().getActualDatabaseName(databaseName)); + Map toBeDeletedDataSourcePropsMap = getToBeDeletedDataSourcePropsMap(dataSourcePropsMap, toBeDroppedStorageUnitNames); + SwitchingResource switchingResource = + new ResourceSwitchManager().createByDropResource(metaDataContexts.getMetaData().getDatabase(databaseName).getResourceMetaData(), toBeDeletedDataSourcePropsMap); + metaDataContexts.getMetaData().getDatabases().putAll(contextManager.renewDatabase(metaDataContexts.getMetaData().getDatabase(databaseName), switchingResource)); + MetaDataContexts reloadMetaDataContexts = contextManager.createMetaDataContexts(databaseName, switchingResource, null); + contextManager.alterSchemaMetaData(databaseName, reloadMetaDataContexts.getMetaData().getDatabase(databaseName), metaDataContexts.getMetaData().getDatabase(databaseName)); + contextManager.deletedSchemaNames(databaseName, reloadMetaDataContexts.getMetaData().getDatabase(databaseName), metaDataContexts.getMetaData().getDatabase(databaseName)); + metaDataContexts = reloadMetaDataContexts; + Map toBeReversedDataSourcePropsMap = getToBeReversedDataSourcePropsMap(dataSourcePropsMap, toBeDroppedStorageUnitNames); + metaDataContexts.getPersistService().getDataSourceService().persist(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), toBeReversedDataSourcePropsMap); + switchingResource.closeStaleDataSources(); + } + + private Map getToBeDeletedDataSourcePropsMap(final Map dataSourcePropsMap, final Collection toBeDroppedResourceNames) { + return dataSourcePropsMap.entrySet().stream().filter(entry -> toBeDroppedResourceNames.contains(entry.getKey())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + private Map getToBeReversedDataSourcePropsMap(final Map dataSourcePropsMap, final Collection toBeDroppedResourceNames) { + return dataSourcePropsMap.entrySet().stream().filter(entry -> !toBeDroppedResourceNames.contains(entry.getKey())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue)); + } + + @Override + public void alterRuleConfiguration(final String databaseName, final Collection ruleConfigs) { + // TODO Verify it + ShardingSphereDatabase currentDatabase = metaDataContexts.getMetaData().getDatabase(databaseName); + contextManager.alterRuleConfiguration(databaseName, ruleConfigs); + ShardingSphereDatabase reloadDatabase = metaDataContexts.getMetaData().getDatabase(databaseName); + contextManager.alterSchemaMetaData(databaseName, reloadDatabase, currentDatabase); + metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), ruleConfigs); + } + + @Override + public void alterGlobalRuleConfiguration(final Collection globalRuleConfigs) { + contextManager.alterGlobalRuleConfiguration(globalRuleConfigs); + metaDataContexts.getPersistService().getGlobalRuleService().persist(metaDataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations()); + } + + @Override + public void alterProperties(final Properties props) { + contextManager.alterProperties(props); + if (null != metaDataContexts.getPersistService().getPropsService()) { + metaDataContexts.getPersistService().getPropsService().persist(props); + } + } + + @Override + public void setContextManagerAware(final ContextManager contextManager) { + this.contextManager = contextManager; + this.metaDataContexts = contextManager.getMetaDataContexts(); + } +} diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/CreateDatabaseBackendHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/CreateDatabaseBackendHandler.java index 861d688f9bc50..fd8f4da509c9c 100644 --- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/CreateDatabaseBackendHandler.java +++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/CreateDatabaseBackendHandler.java @@ -38,7 +38,7 @@ public final class CreateDatabaseBackendHandler implements ProxyBackendHandler { @Override public ResponseHeader execute() throws SQLException { check(sqlStatement); - ProxyContext.getInstance().getContextManager().addDatabaseAndPersist(sqlStatement.getDatabaseName()); + ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().createDatabase(sqlStatement.getDatabaseName()); return new UpdateResponseHeader(sqlStatement); } diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandler.java index 1566d13c8d9ba..2e9104d9124fe 100644 --- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandler.java +++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/database/DropDatabaseBackendHandler.java @@ -51,7 +51,7 @@ public ResponseHeader execute() { if (isDropCurrentDatabase(sqlStatement.getDatabaseName())) { connectionSession.setCurrentDatabase(null); } - ProxyContext.getInstance().getContextManager().dropDatabaseAndPersist(sqlStatement.getDatabaseName()); + ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().dropDatabase(sqlStatement.getDatabaseName()); return new UpdateResponseHeader(sqlStatement); } diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/UpdatableGlobalRuleRALBackendHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/UpdatableGlobalRuleRALBackendHandler.java index 3d8042d059d0e..f5747c64fa6ec 100644 --- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/UpdatableGlobalRuleRALBackendHandler.java +++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/UpdatableGlobalRuleRALBackendHandler.java @@ -19,7 +19,7 @@ import org.apache.shardingsphere.distsql.parser.statement.ral.RALStatement; import org.apache.shardingsphere.distsql.handler.update.GlobalRuleRALUpdater; -import org.apache.shardingsphere.mode.metadata.MetaDataContexts; +import org.apache.shardingsphere.mode.manager.ContextManager; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.backend.handler.ProxyBackendHandler; import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader; @@ -42,12 +42,8 @@ public UpdatableGlobalRuleRALBackendHandler(final RALStatement sqlStatement, fin @Override public ResponseHeader execute() { updater.executeUpdate(ProxyContext.getInstance().getContextManager().getMetaDataContexts().getMetaData(), sqlStatement); - persistNewRuleConfigurations(); + ContextManager contextManager = ProxyContext.getInstance().getContextManager(); + contextManager.getInstanceContext().getModeContextManager().alterGlobalRuleConfiguration(contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getConfigurations()); return new UpdateResponseHeader(sqlStatement); } - - private void persistNewRuleConfigurations() { - MetaDataContexts metaDataContexts = ProxyContext.getInstance().getContextManager().getMetaDataContexts(); - metaDataContexts.getPersistService().getGlobalRuleService().persist(metaDataContexts.getMetaData().getGlobalRuleMetaData().getConfigurations()); - } } diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationHandler.java index e3568c916c72a..f99800d0cb5ee 100644 --- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationHandler.java +++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/ImportDatabaseConfigurationHandler.java @@ -115,7 +115,7 @@ private void checkDataSource(final Map } private void addDatabase(final String databaseName) { - ProxyContext.getInstance().getContextManager().addDatabaseAndPersist(databaseName); + ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().createDatabase(databaseName); } private void addResources(final String databaseName, final Map yamlDataSourceMap) { @@ -125,7 +125,7 @@ private void addResources(final String databaseName, final Map dataSourcePropsMap = ResourceSegmentsConverter.convert(databaseType, sqlStatement.getStorageUnits()); validateHandler.validate(dataSourcePropsMap); try { - ProxyContext.getInstance().getContextManager().updateResources(databaseName, dataSourcePropsMap); + ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().alterStorageUnits(databaseName, dataSourcePropsMap); } catch (final SQLException | ShardingSphereServerException ex) { log.error("Alter storage unit failed", ex); throw new InvalidResourcesException(Collections.singleton(ex.getMessage())); diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java index 6ad5b81f5ac66..b1165c6b0c9a8 100644 --- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java +++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/RegisterStorageUnitBackendHandler.java @@ -68,7 +68,7 @@ public ResponseHeader execute(final String databaseName, final RegisterStorageUn Map dataSourcePropsMap = ResourceSegmentsConverter.convert(databaseType, sqlStatement.getStorageUnits()); validateHandler.validate(dataSourcePropsMap); try { - ProxyContext.getInstance().getContextManager().addResources(databaseName, dataSourcePropsMap); + ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().registerStorageUnits(databaseName, dataSourcePropsMap); } catch (final SQLException | ShardingSphereServerException ex) { log.error("Register storage unit failed", ex); throw new InvalidResourcesException(Collections.singleton(ex.getMessage())); diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandler.java index fa8d88a9ae8d2..950e15da8a9d4 100644 --- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandler.java +++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandler.java @@ -59,7 +59,7 @@ public UnregisterStorageUnitBackendHandler(final UnregisterStorageUnitStatement public ResponseHeader execute(final String databaseName, final UnregisterStorageUnitStatement sqlStatement) { checkSQLStatement(databaseName, sqlStatement); try { - ProxyContext.getInstance().getContextManager().dropResources(databaseName, sqlStatement.getStorageUnitNames()); + ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().unregisterStorageUnits(databaseName, sqlStatement.getStorageUnitNames()); } catch (final SQLException | ShardingSphereServerException ex) { log.error("Unregister storage unit failed", ex); throw new InvalidResourcesException(Collections.singleton(ex.getMessage())); diff --git a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java index 35587f920acef..4e643aa914261 100644 --- a/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java +++ b/proxy/backend/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/rule/RuleDefinitionBackendHandler.java @@ -26,7 +26,6 @@ import org.apache.shardingsphere.distsql.handler.update.RuleDefinitionUpdaterFactory; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.util.exception.external.sql.type.generic.UnsupportedSQLOperationException; -import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; import org.apache.shardingsphere.proxy.backend.handler.DatabaseRequiredBackendHandler; import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader; @@ -58,8 +57,8 @@ protected ResponseHeader execute(final String databaseName, final T sqlStatement RuleConfiguration currentRuleConfig = findCurrentRuleConfiguration(database, ruleConfigClass).orElse(null); ruleDefinitionUpdater.checkSQLStatement(database, sqlStatement, currentRuleConfig); if (getRefreshStatus(sqlStatement, currentRuleConfig, ruleDefinitionUpdater)) { - Collection alteredConfigs = processSQLStatement(database, sqlStatement, ruleDefinitionUpdater, currentRuleConfig); - persistRuleConfigurationChange(databaseName, alteredConfigs); + ProxyContext.getInstance().getContextManager().getInstanceContext().getModeContextManager().alterRuleConfiguration(databaseName, + processSQLStatement(database, sqlStatement, ruleDefinitionUpdater, currentRuleConfig)); } return new UpdateResponseHeader(sqlStatement); } @@ -121,11 +120,6 @@ private void processDrop(final Collection configs, final T sq } } - private void persistRuleConfigurationChange(final String databaseName, final Collection alteredConfigs) { - MetaDataContexts metaDataContexts = ProxyContext.getInstance().getContextManager().getMetaDataContexts(); - metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), alteredConfigs); - } - private boolean getRefreshStatus(final SQLStatement sqlStatement, final RuleConfiguration currentRuleConfig, final RuleDefinitionUpdater updater) { return !(updater instanceof RuleDefinitionDropUpdater) || ((RuleDefinitionDropUpdater) updater).hasAnyOneToBeDropped(sqlStatement, currentRuleConfig); } diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java index dd4f3f1fd60d8..e14f9b8670e33 100644 --- a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java +++ b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/DistSQLBackendHandlerFactoryTest.java @@ -24,6 +24,7 @@ import org.apache.shardingsphere.distsql.parser.statement.rql.show.ShowStorageUnitsStatement; import org.apache.shardingsphere.infra.config.algorithm.AlgorithmConfiguration; import org.apache.shardingsphere.distsql.handler.exception.rule.MissingRequiredRuleException; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData; import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData; @@ -80,9 +81,10 @@ public void setUp() { } private ContextManager mockContextManager() { - ContextManager result = mock(ContextManager.class); + ContextManager result = mock(ContextManager.class, RETURNS_DEEP_STUBS); MetaDataContexts metaDataContexts = mockMetaDataContexts(); when(result.getMetaDataContexts()).thenReturn(metaDataContexts); + when(result.getInstanceContext().getModeContextManager()).thenReturn(mock(ModeContextManager.class)); return result; } diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java index ef3586f7f7474..61c2e511ad90c 100644 --- a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java +++ b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/SetDistVariableExecutorTest.java @@ -18,9 +18,17 @@ package org.apache.shardingsphere.proxy.backend.handler.distsql.ral.updatable; import org.apache.shardingsphere.distsql.parser.statement.ral.updatable.SetDistVariableStatement; +import org.apache.shardingsphere.infra.config.mode.ModeConfiguration; import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey; +import org.apache.shardingsphere.infra.instance.ComputeNodeInstance; +import org.apache.shardingsphere.infra.instance.InstanceContext; +import org.apache.shardingsphere.infra.instance.metadata.InstanceMetaData; +import org.apache.shardingsphere.infra.instance.workerid.WorkerIdGenerator; +import org.apache.shardingsphere.infra.lock.LockContext; import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData; +import org.apache.shardingsphere.infra.util.eventbus.EventBusContext; import org.apache.shardingsphere.mode.manager.ContextManager; +import org.apache.shardingsphere.mode.manager.standalone.StandaloneModeContextManager; import org.apache.shardingsphere.mode.metadata.MetaDataContexts; import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService; import org.apache.shardingsphere.proxy.backend.context.ProxyContext; @@ -70,7 +78,11 @@ public void assertExecuteWithAgent() throws SQLException { @Test public void assertExecuteWithConfigurationKey() throws SQLException { - ContextManager contextManager = new ContextManager(new MetaDataContexts(mock(MetaDataPersistService.class), new ShardingSphereMetaData()), null); + StandaloneModeContextManager standaloneModeContextManager = new StandaloneModeContextManager(); + ContextManager contextManager = new ContextManager(new MetaDataContexts(mock(MetaDataPersistService.class), new ShardingSphereMetaData()), + new InstanceContext(new ComputeNodeInstance(mock(InstanceMetaData.class)), mock(WorkerIdGenerator.class), + new ModeConfiguration("Standalone", null), standaloneModeContextManager, mock(LockContext.class), new EventBusContext())); + standaloneModeContextManager.setContextManagerAware(contextManager); ProxyContext.init(contextManager); SetDistVariableStatement statement = new SetDistVariableStatement("proxy_frontend_flush_threshold", "1024"); SetDistVariableHandler handler = new SetDistVariableHandler(); diff --git a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandlerTest.java b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandlerTest.java index e826b582f328c..bb626cfaf34fa 100644 --- a/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandlerTest.java +++ b/proxy/backend/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/resource/UnregisterStorageUnitBackendHandlerTest.java @@ -22,6 +22,7 @@ import org.apache.shardingsphere.distsql.handler.exception.DistSQLException; import org.apache.shardingsphere.distsql.handler.exception.resource.MissingRequiredResourcesException; import org.apache.shardingsphere.distsql.handler.exception.resource.ResourceInUsedException; +import org.apache.shardingsphere.infra.instance.mode.ModeContextManager; import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase; import org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResourceMetaData; import org.apache.shardingsphere.infra.metadata.database.rule.ShardingSphereRuleMetaData; @@ -79,6 +80,9 @@ public final class UnregisterStorageUnitBackendHandlerTest extends ProxyContextR private ContextManager contextManager; + @Mock + private ModeContextManager modeContextManager; + private UnregisterStorageUnitBackendHandler unregisterStorageUnitBackendHandler; @Before @@ -92,6 +96,7 @@ public void setUp() { when(metaDataContexts.getMetaData().containsDatabase("test")).thenReturn(true); contextManager = mock(ContextManager.class, RETURNS_DEEP_STUBS); when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts); + when(contextManager.getInstanceContext().getModeContextManager()).thenReturn(modeContextManager); ProxyContext.init(contextManager); unregisterStorageUnitBackendHandler = new UnregisterStorageUnitBackendHandler(unregisterStorageUnitStatement, connectionSession); } @@ -104,7 +109,7 @@ public void assertExecute() throws SQLException { when(contextManager.getMetaDataContexts().getMetaData().getDatabase("test")).thenReturn(database); UnregisterStorageUnitStatement unregisterStorageUnitStatement = new UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false); assertThat(unregisterStorageUnitBackendHandler.execute("test", unregisterStorageUnitStatement), instanceOf(UpdateResponseHeader.class)); - verify(contextManager).dropResources("test", unregisterStorageUnitStatement.getStorageUnitNames()); + verify(modeContextManager).unregisterStorageUnits("test", unregisterStorageUnitStatement.getStorageUnitNames()); } @Test(expected = MissingRequiredResourcesException.class) @@ -148,14 +153,14 @@ public void assertStorageUnitNameInUseIgnoreSingleTables() throws SQLException { when(contextManager.getMetaDataContexts().getMetaData().getDatabase("test")).thenReturn(database); UnregisterStorageUnitStatement unregisterStorageUnitStatement = new UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), true); assertThat(unregisterStorageUnitBackendHandler.execute("test", unregisterStorageUnitStatement), instanceOf(UpdateResponseHeader.class)); - verify(contextManager).dropResources("test", unregisterStorageUnitStatement.getStorageUnitNames()); + verify(modeContextManager).unregisterStorageUnits("test", unregisterStorageUnitStatement.getStorageUnitNames()); } @Test public void assertExecuteWithIfExists() throws SQLException { UnregisterStorageUnitStatement unregisterStorageUnitStatement = new UnregisterStorageUnitStatement(true, Collections.singleton("foo_ds"), true); assertThat(unregisterStorageUnitBackendHandler.execute("test", unregisterStorageUnitStatement), instanceOf(UpdateResponseHeader.class)); - verify(contextManager).dropResources("test", unregisterStorageUnitStatement.getStorageUnitNames()); + verify(modeContextManager).unregisterStorageUnits("test", unregisterStorageUnitStatement.getStorageUnitNames()); } @Test(expected = DistSQLException.class) diff --git a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java index 3e1a623deeac5..55bda35ae23b9 100644 --- a/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java +++ b/test/e2e/discovery/src/test/java/org/apache/shardingsphere/test/e2e/discovery/cases/base/BaseDiscoveryE2EIT.java @@ -122,7 +122,7 @@ private void closeDataSource(final DataSource dataSource) throws SQLException { Statement statement = connection.createStatement()) { statement.execute("SHUTDOWN"); } - ThreadUtil.sleep(30, TimeUnit.SECONDS); + ThreadUtil.sleep(35, TimeUnit.SECONDS); } private void assertPrimaryDataSourceChanged(final String oldPrimaryDataSourceName, final String newPrimaryDataSourceName) { diff --git a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/ral/BaseRALE2EIT.java b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/ral/BaseRALE2EIT.java index 44d5aa87e1948..39099ccbe589f 100644 --- a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/ral/BaseRALE2EIT.java +++ b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/ral/BaseRALE2EIT.java @@ -34,6 +34,7 @@ import java.util.Collection; import java.util.LinkedList; import java.util.List; +import java.util.concurrent.TimeUnit; import java.util.stream.Collectors; import static org.hamcrest.CoreMatchers.is; @@ -86,6 +87,13 @@ private void executeDestroySQLs(final Connection connection) throws SQLException } } + protected void sleep() { + try { + TimeUnit.SECONDS.sleep(2); + } catch (final InterruptedException ignored) { + } + } + protected final void assertResultSet(final ResultSet resultSet) throws SQLException { assertMetaData(resultSet.getMetaData(), getExpectedColumns()); assertRows(resultSet, getNotAssertionColumns(), getDataSet().getRows()); diff --git a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/ral/GeneralRALE2EIT.java b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/ral/GeneralRALE2EIT.java index a47fc7b7d0917..520cccc6b362a 100644 --- a/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/ral/GeneralRALE2EIT.java +++ b/test/e2e/suite/src/test/java/org/apache/shardingsphere/test/e2e/engine/ral/GeneralRALE2EIT.java @@ -59,6 +59,7 @@ private void assertResultSet(final Statement statement) throws SQLException, Par assertResultSet(statement, getSQL()); } else { statement.execute(getSQL()); + sleep(); assertResultSet(statement, getAssertion().getAssertionSQL().getSql()); } }