This is an automated email from the ASF dual-hosted git repository.
jiangmaolin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/shardingsphere.git
The following commit(s) were added to refs/heads/master by this push:
new 5006a9f6cb4 Add temporary config key instance-connection-enabled
(#37694)
5006a9f6cb4 is described below
commit 5006a9f6cb4e5e80e81a7310612dbe09796551a5
Author: Raigor <[email protected]>
AuthorDate: Fri Jan 9 17:38:11 2026 +0800
Add temporary config key instance-connection-enabled (#37694)
* Add temporary config key instance-connection-enabled
* Update RELEASE-NOTES.md
* Fix transaction e2e for mysql
---
RELEASE-NOTES.md | 1 +
.../DataSourceGeneratedDatabaseConfiguration.java | 5 +-
.../DataSourceProvidedDatabaseConfiguration.java | 6 +-
.../TemporaryConfigurationPropertyKey.java | 7 ++-
.../database/resource/node/StorageNode.java | 10 +++-
.../resource/node/StorageNodeAggregator.java | 13 ++--
.../database/resource/unit/StorageUnit.java | 6 +-
.../resource/unit/StorageUnitNodeMapCreator.java | 12 ++--
...taSourceGeneratedDatabaseConfigurationTest.java | 2 +-
...ataSourceProvidedDatabaseConfigurationTest.java | 2 +-
.../resource/node/StorageNodeAggregatorTest.java | 6 +-
.../unit/StorageUnitNodeMapCreatorTest.java | 6 +-
.../database/resource/unit/StorageUnitTest.java | 3 -
.../pool/CatalogSwitchableDataSource.java | 2 +-
.../pool/CatalogSwitchableDataSourceTest.java | 69 ++++++++++++++++++++++
.../mode/manager/ContextManager.java | 5 +-
.../metadata/factory/MetaDataContextsFactory.java | 10 ++--
.../RegisterCenterMetaDataContextsInitFactory.java | 25 +++++---
.../manager/resource/ResourceSwitchManager.java | 16 +++--
.../manager/resource/StorageUnitManager.java | 7 ++-
.../mode/manager/ContextManagerTest.java | 7 ++-
.../resource/ResourceSwitchManagerTest.java | 16 ++---
.../manager/resource/StorageUnitManagerTest.java | 19 ++++--
.../swapper/YamlProxyConfigurationSwapper.java | 9 ++-
.../YamlDatabaseConfigurationImportExecutor.java | 4 +-
.../variable/ShowDistVariablesExecutorTest.java | 6 +-
.../ImportDatabaseConfigurationExecutorTest.java | 3 +
.../imports/ImportMetaDataExecutorTest.java | 4 ++
...amlDatabaseConfigurationImportExecutorTest.java | 20 ++++---
.../src/test/resources/env/mysql/global.yaml | 1 +
30 files changed, 218 insertions(+), 84 deletions(-)
diff --git a/RELEASE-NOTES.md b/RELEASE-NOTES.md
index ae56f2cab60..0ef3b428f47 100644
--- a/RELEASE-NOTES.md
+++ b/RELEASE-NOTES.md
@@ -16,6 +16,7 @@
1. Remove logging rule feature -
[#35458](https://github.com/apache/shardingsphere/pull/35458)
1. Remove configuration property key `system-log-level` -
[#35493](https://github.com/apache/shardingsphere/pull/35493)
1. Change ShardingSphere SQL log topic from `ShardingSphere-SQL` to
`org.apache.shardingsphere.sql` -
[#37022](https://github.com/apache/shardingsphere/pull/37022)
+1. Add temporary config key `instance-connection-enabled` -
[#37694](https://github.com/apache/shardingsphere/pull/37694)
### New Features
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfiguration.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfiguration.java
index f77c07ba9f0..7af9bbfe5b2 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfiguration.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfiguration.java
@@ -48,11 +48,12 @@ public final class DataSourceGeneratedDatabaseConfiguration
implements DatabaseC
private final Map<StorageNode, DataSource> dataSources;
- public DataSourceGeneratedDatabaseConfiguration(final Map<String,
DataSourceConfiguration> dataSourceConfigs, final Collection<RuleConfiguration>
ruleConfigs) {
+ public DataSourceGeneratedDatabaseConfiguration(final Map<String,
DataSourceConfiguration> dataSourceConfigs, final Collection<RuleConfiguration>
ruleConfigs,
+ final boolean
isInstanceConnectionEnabled) {
ruleConfigurations = ruleConfigs;
Map<String, DataSourcePoolProperties> dataSourcePoolPropertiesMap =
dataSourceConfigs.entrySet().stream()
.collect(Collectors.toMap(Entry::getKey, entry ->
DataSourcePoolPropertiesCreator.create(entry.getValue()), (oldValue,
currentValue) -> oldValue, LinkedHashMap::new));
- Map<String, StorageNode> storageUnitNodeMap =
StorageUnitNodeMapCreator.create(dataSourcePoolPropertiesMap);
+ Map<String, StorageNode> storageUnitNodeMap =
StorageUnitNodeMapCreator.create(dataSourcePoolPropertiesMap,
isInstanceConnectionEnabled);
Map<StorageNode, DataSource> storageNodeDataSources =
getStorageNodeDataSourceMap(dataSourcePoolPropertiesMap, storageUnitNodeMap);
storageUnits = new LinkedHashMap<>(dataSourceConfigs.size(), 1F);
for (Entry<String, DataSourceConfiguration> entry :
dataSourceConfigs.entrySet()) {
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfiguration.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfiguration.java
index d1ba5647410..9191d9f3a02 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfiguration.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfiguration.java
@@ -55,10 +55,10 @@ public final class DataSourceProvidedDatabaseConfiguration
implements DatabaseCo
this.dataSources = storageNodeDataSources;
}
- public DataSourceProvidedDatabaseConfiguration(final Map<StorageNode,
DataSource> storageNodeDataSources,
- final
Collection<RuleConfiguration> ruleConfigs, final Map<String,
DataSourcePoolProperties> dataSourcePoolPropsMap) {
+ public DataSourceProvidedDatabaseConfiguration(final Map<StorageNode,
DataSource> storageNodeDataSources, final Collection<RuleConfiguration>
ruleConfigs,
+ final Map<String,
DataSourcePoolProperties> dataSourcePoolPropsMap, final boolean
isInstanceConnectionEnabled) {
ruleConfigurations = ruleConfigs;
- Map<String, StorageNode> storageUnitNodeMap =
StorageUnitNodeMapCreator.create(dataSourcePoolPropsMap);
+ Map<String, StorageNode> storageUnitNodeMap =
StorageUnitNodeMapCreator.create(dataSourcePoolPropsMap,
isInstanceConnectionEnabled);
storageUnits = getStorageUnits(storageUnitNodeMap,
storageNodeDataSources, dataSourcePoolPropsMap);
dataSources = storageNodeDataSources;
}
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/props/temporary/TemporaryConfigurationPropertyKey.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/props/temporary/TemporaryConfigurationPropertyKey.java
index 378a55fd575..dec76dd769d 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/config/props/temporary/TemporaryConfigurationPropertyKey.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/config/props/temporary/TemporaryConfigurationPropertyKey.java
@@ -45,7 +45,12 @@ public enum TemporaryConfigurationPropertyKey implements
TypedPropertyKey {
/**
* Proxy meta data collector cron.
*/
- PROXY_META_DATA_COLLECTOR_CRON("proxy-meta-data-collector-cron", "0 0/1 *
* * ?", String.class, false);
+ PROXY_META_DATA_COLLECTOR_CRON("proxy-meta-data-collector-cron", "0 0/1 *
* * ?", String.class, false),
+
+ /**
+ * Instance connection enabled.
+ */
+ INSTANCE_CONNECTION_ENABLED("instance-connection-enabled",
String.valueOf(Boolean.FALSE), boolean.class, false);
private final String key;
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNode.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNode.java
index b1b23778720..57bcce48c77 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNode.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNode.java
@@ -19,19 +19,25 @@ package
org.apache.shardingsphere.infra.metadata.database.resource.node;
import com.google.common.base.Objects;
import lombok.Getter;
-import lombok.RequiredArgsConstructor;
/**
* Storage node.
*/
-@RequiredArgsConstructor
@Getter
public final class StorageNode {
private final String name;
+ private final boolean instanceStorageNode;
+
+ public StorageNode(final String name) {
+ this.name = name;
+ instanceStorageNode = false;
+ }
+
public StorageNode(final String hostname, final int port, final String
username) {
name = String.format("%s_%s_%s", hostname, port, username);
+ instanceStorageNode = true;
}
@Override
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNodeAggregator.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNodeAggregator.java
index bc76a08cd3a..6b13f5f77af 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNodeAggregator.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNodeAggregator.java
@@ -55,26 +55,31 @@ public final class StorageNodeAggregator {
* Aggregate data source pool properties map to storage node grouped.
*
* @param storageUnitDataSourcePoolPropsMap storage unit name and data
source pool properties map
+ * @param isInstanceConnectionEnabled is instance connection enabled
* @return storage node and data source pool properties map
*/
- public static Map<StorageNode, DataSourcePoolProperties>
aggregateDataSourcePoolProperties(final Map<String, DataSourcePoolProperties>
storageUnitDataSourcePoolPropsMap) {
+ public static Map<StorageNode, DataSourcePoolProperties>
aggregateDataSourcePoolProperties(final Map<String, DataSourcePoolProperties>
storageUnitDataSourcePoolPropsMap,
+
final boolean isInstanceConnectionEnabled) {
Map<StorageNode, DataSourcePoolProperties> result = new
LinkedHashMap<>(storageUnitDataSourcePoolPropsMap.size(), 1F);
for (Entry<String, DataSourcePoolProperties> entry :
storageUnitDataSourcePoolPropsMap.entrySet()) {
Map<String, Object> standardProps =
entry.getValue().getConnectionPropertySynonyms().getStandardProperties();
String url = standardProps.get("url").toString();
String username = standardProps.get("username").toString();
DatabaseType databaseType = DatabaseTypeFactory.get(url);
- StorageNode storageNode = getStorageNode(entry.getKey(), url,
username, databaseType);
+ StorageNode storageNode = getStorageNode(entry.getKey(), url,
username, databaseType, isInstanceConnectionEnabled);
result.putIfAbsent(storageNode, entry.getValue());
}
return result;
}
- private static StorageNode getStorageNode(final String dataSourceName,
final String url, final String username, final DatabaseType databaseType) {
+ private static StorageNode getStorageNode(final String dataSourceName,
final String url, final String username,
+ final DatabaseType databaseType,
final boolean isInstanceConnectionEnabled) {
try {
ConnectionProperties connectionProps =
DatabaseTypedSPILoader.getService(ConnectionPropertiesParser.class,
databaseType).parse(url, username, null);
boolean isInstanceConnectionAvailable = new
DatabaseTypeRegistry(databaseType).getDialectDatabaseMetaData().getConnectionOption().isInstanceConnectionAvailable();
- return isInstanceConnectionAvailable ? new
StorageNode(connectionProps.getHostname(), connectionProps.getPort(), username)
: new StorageNode(dataSourceName);
+ return isInstanceConnectionEnabled && isInstanceConnectionAvailable
+ ? new StorageNode(connectionProps.getHostname(),
connectionProps.getPort(), username)
+ : new StorageNode(dataSourceName);
} catch (final UnrecognizedDatabaseURLException ex) {
return new StorageNode(dataSourceName);
}
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnit.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnit.java
index d832c37a7f9..3375ae65c79 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnit.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnit.java
@@ -23,7 +23,6 @@ import
org.apache.shardingsphere.database.connector.core.jdbcurl.parser.Connecti
import
org.apache.shardingsphere.database.connector.core.spi.DatabaseTypedSPILoader;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeFactory;
-import
org.apache.shardingsphere.database.connector.core.type.DatabaseTypeRegistry;
import
org.apache.shardingsphere.infra.datasource.pool.CatalogSwitchableDataSource;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
import
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
@@ -54,10 +53,9 @@ public final class StorageUnit {
Object originUsername = standardProps.get("username");
String username = null == originUsername ? "" :
originUsername.toString();
storageType = DatabaseTypeFactory.get(url);
- boolean isInstanceConnectionAvailable = new
DatabaseTypeRegistry(storageType).getDialectDatabaseMetaData().getConnectionOption().isInstanceConnectionAvailable();
ConnectionPropertiesParser parser =
DatabaseTypedSPILoader.getService(ConnectionPropertiesParser.class,
storageType);
- String catalog = isInstanceConnectionAvailable ? parser.parse(url,
username, null).getCatalog() : null;
- this.dataSource = isInstanceConnectionAvailable ? new
CatalogSwitchableDataSource(dataSource, catalog, url) : dataSource;
+ String catalog = storageNode.isInstanceStorageNode() ?
parser.parse(url, username, null).getCatalog() : null;
+ this.dataSource = storageNode.isInstanceStorageNode() ? new
CatalogSwitchableDataSource(dataSource, catalog, url) : dataSource;
dataSourcePoolProperties = dataSourcePoolProps;
connectionProperties = createConnectionProperties(parser, catalog,
standardProps);
}
diff --git
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitNodeMapCreator.java
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitNodeMapCreator.java
index 114435e24be..41ae0c3afa5 100644
---
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitNodeMapCreator.java
+++
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitNodeMapCreator.java
@@ -43,20 +43,24 @@ public final class StorageUnitNodeMapCreator {
* Create storage unit node map.
*
* @param propsMap data source pool properties map
+ * @param isInstanceConnectionEnabled is instance connection enabled
* @return storage unit node map
*/
- public static Map<String, StorageNode> create(final Map<String,
DataSourcePoolProperties> propsMap) {
- return
propsMap.entrySet().stream().collect(Collectors.toMap(Entry::getKey, entry ->
create(entry.getKey(), entry.getValue()), (oldValue, currentValue) -> oldValue,
LinkedHashMap::new));
+ public static Map<String, StorageNode> create(final Map<String,
DataSourcePoolProperties> propsMap, final boolean isInstanceConnectionEnabled) {
+ return
propsMap.entrySet().stream().collect(Collectors.toMap(Entry::getKey, entry ->
create(entry.getKey(), entry.getValue(), isInstanceConnectionEnabled),
+ (oldValue, currentValue) -> oldValue, LinkedHashMap::new));
}
- private static StorageNode create(final String storageUnitName, final
DataSourcePoolProperties props) {
+ private static StorageNode create(final String storageUnitName, final
DataSourcePoolProperties props, final boolean isInstanceConnectionEnabled) {
Map<String, Object> standardProps =
props.getConnectionPropertySynonyms().getStandardProperties();
String url = standardProps.get("url").toString();
String username = standardProps.get("username").toString();
boolean isInstanceConnectionAvailable = new
DatabaseTypeRegistry(DatabaseTypeFactory.get(url)).getDialectDatabaseMetaData().getConnectionOption().isInstanceConnectionAvailable();
try {
ConnectionProperties connectionProps =
DatabaseTypedSPILoader.getService(ConnectionPropertiesParser.class,
DatabaseTypeFactory.get(url)).parse(url, username, null);
- return isInstanceConnectionAvailable ? new
StorageNode(connectionProps.getHostname(), connectionProps.getPort(), username)
: new StorageNode(storageUnitName);
+ return isInstanceConnectionEnabled && isInstanceConnectionAvailable
+ ? new StorageNode(connectionProps.getHostname(),
connectionProps.getPort(), username)
+ : new StorageNode(storageUnitName);
} catch (final UnrecognizedDatabaseURLException ex) {
return new StorageNode(storageUnitName);
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfigurationTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfigurationTest.java
index 8a8a2688d39..2b8cbe95dd4 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfigurationTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceGeneratedDatabaseConfigurationTest.java
@@ -93,6 +93,6 @@ class DataSourceGeneratedDatabaseConfigurationTest {
private DataSourceGeneratedDatabaseConfiguration
createDatabaseConfiguration(final String dataSourceClassName) {
DataSourceConfiguration dataSourceConfig = new
DataSourceConfiguration(new ConnectionConfiguration(dataSourceClassName,
"jdbc:mock://127.0.0.1/foo_db", "root", ""),
new PoolConfiguration(2000L, 1000L, 1000L, 2, 1, false, new
Properties()));
- return new
DataSourceGeneratedDatabaseConfiguration(Collections.singletonMap("foo_db",
dataSourceConfig), Collections.singleton(new
FixtureRuleConfiguration("foo_rule")));
+ return new
DataSourceGeneratedDatabaseConfiguration(Collections.singletonMap("foo_db",
dataSourceConfig), Collections.singleton(new
FixtureRuleConfiguration("foo_rule")), true);
}
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfigurationTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfigurationTest.java
index 991ac47dbf3..bc8281648a2 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfigurationTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/config/database/impl/DataSourceProvidedDatabaseConfigurationTest.java
@@ -54,7 +54,7 @@ class DataSourceProvidedDatabaseConfigurationTest {
void assertNewWithStorageNodeDataSources() {
Map<String, DataSourcePoolProperties> dataSourcePoolPropsMap =
Collections.singletonMap("foo_ds", new DataSourcePoolProperties("foo_ds",
createConnectionProps()));
DataSourceProvidedDatabaseConfiguration actual = new
DataSourceProvidedDatabaseConfiguration(
- Collections.singletonMap(new StorageNode("foo_ds"), new
MockedDataSource()), Collections.singleton(new
FixtureRuleConfiguration("foo_rule")), dataSourcePoolPropsMap);
+ Collections.singletonMap(new StorageNode("foo_ds"), new
MockedDataSource()), Collections.singleton(new
FixtureRuleConfiguration("foo_rule")), dataSourcePoolPropsMap, false);
assertRuleConfigurations(actual);
assertStorageUnits(actual.getStorageUnits().get("foo_ds"));
assertDataSources((MockedDataSource) actual.getDataSources().get(new
StorageNode("foo_ds")));
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNodeAggregatorTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNodeAggregatorTest.java
index e3e09cf4392..31e1956b2e2 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNodeAggregatorTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/node/StorageNodeAggregatorTest.java
@@ -53,7 +53,7 @@ class StorageNodeAggregatorTest {
standardProps.put("username", "root");
DataSourcePoolProperties dataSourcePoolProps =
mock(DataSourcePoolProperties.class, Answers.RETURNS_DEEP_STUBS);
when(dataSourcePoolProps.getConnectionPropertySynonyms().getStandardProperties()).thenReturn(standardProps);
- Map<StorageNode, DataSourcePoolProperties> actual =
StorageNodeAggregator.aggregateDataSourcePoolProperties(Collections.singletonMap("foo_ds",
dataSourcePoolProps));
+ Map<StorageNode, DataSourcePoolProperties> actual =
StorageNodeAggregator.aggregateDataSourcePoolProperties(Collections.singletonMap("foo_ds",
dataSourcePoolProps), true);
assertThat(actual.size(), is(1));
assertThat(actual.get(actual.keySet().iterator().next()),
is(dataSourcePoolProps));
}
@@ -70,7 +70,7 @@ class StorageNodeAggregatorTest {
when(dialectDatabaseMetaData.getConnectionOption().isInstanceConnectionAvailable()).thenReturn(true);
when(mock.getDialectDatabaseMetaData()).thenReturn(dialectDatabaseMetaData);
})) {
- Map<StorageNode, DataSourcePoolProperties> actual =
StorageNodeAggregator.aggregateDataSourcePoolProperties(Collections.singletonMap("foo_ds",
dataSourcePoolProps));
+ Map<StorageNode, DataSourcePoolProperties> actual =
StorageNodeAggregator.aggregateDataSourcePoolProperties(Collections.singletonMap("foo_ds",
dataSourcePoolProps), true);
assertThat(actual.size(), is(1));
assertThat(actual.get(new StorageNode("127.0.0.1_-1_root")),
is(dataSourcePoolProps));
}
@@ -83,7 +83,7 @@ class StorageNodeAggregatorTest {
standardProps.put("username", "root");
DataSourcePoolProperties dataSourcePoolProps =
mock(DataSourcePoolProperties.class, Answers.RETURNS_DEEP_STUBS);
when(dataSourcePoolProps.getConnectionPropertySynonyms().getStandardProperties()).thenReturn(standardProps);
- Map<StorageNode, DataSourcePoolProperties> actual =
StorageNodeAggregator.aggregateDataSourcePoolProperties(Collections.singletonMap("foo_ds",
dataSourcePoolProps));
+ Map<StorageNode, DataSourcePoolProperties> actual =
StorageNodeAggregator.aggregateDataSourcePoolProperties(Collections.singletonMap("foo_ds",
dataSourcePoolProps), true);
assertThat(actual.size(), is(1));
assertThat(actual.get(new StorageNode("foo_ds")),
is(dataSourcePoolProps));
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitNodeMapCreatorTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitNodeMapCreatorTest.java
index 69da95613f2..1e87400b547 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitNodeMapCreatorTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitNodeMapCreatorTest.java
@@ -73,7 +73,7 @@ class StorageUnitNodeMapCreatorTest {
ConnectionPropertiesParser parser =
mock(ConnectionPropertiesParser.class);
when(parser.parse("jdbc:mock://127.0.0.1/foo_ds", "sa",
null)).thenReturn(new ConnectionProperties("127.0.0.1", 3307, null,
"foo_schema", new Properties()));
mockedLoader.when(() ->
DatabaseTypedSPILoader.getService(ConnectionPropertiesParser.class,
databaseType)).thenReturn(parser);
- Map<String, StorageNode> actual =
StorageUnitNodeMapCreator.create(Collections.singletonMap("foo_ds",
dataSourcePoolProps));
+ Map<String, StorageNode> actual =
StorageUnitNodeMapCreator.create(Collections.singletonMap("foo_ds",
dataSourcePoolProps), true);
assertThat(actual.size(), is(1));
assertTrue(actual.containsKey("foo_ds"));
}
@@ -86,7 +86,7 @@ class StorageUnitNodeMapCreatorTest {
ConnectionPropertiesParser parser =
mock(ConnectionPropertiesParser.class);
when(parser.parse("jdbc:mock://127.0.0.1/foo_ds", "sa",
null)).thenReturn(new ConnectionProperties("127.0.0.1", 3307, null,
"foo_schema", new Properties()));
mockedLoader.when(() ->
DatabaseTypedSPILoader.getService(ConnectionPropertiesParser.class,
databaseType)).thenReturn(parser);
- Map<String, StorageNode> actual =
StorageUnitNodeMapCreator.create(Collections.singletonMap("foo_ds",
dataSourcePoolProps));
+ Map<String, StorageNode> actual =
StorageUnitNodeMapCreator.create(Collections.singletonMap("foo_ds",
dataSourcePoolProps), true);
assertThat(actual.size(), is(1));
assertTrue(actual.containsKey("foo_ds"));
}
@@ -99,7 +99,7 @@ class StorageUnitNodeMapCreatorTest {
ConnectionPropertiesParser parser =
mock(ConnectionPropertiesParser.class);
when(parser.parse("jdbc:mock://127.0.0.1/foo_ds", "sa",
null)).thenThrow(UnrecognizedDatabaseURLException.class);
mockedLoader.when(() ->
DatabaseTypedSPILoader.getService(ConnectionPropertiesParser.class,
databaseType)).thenReturn(parser);
- Map<String, StorageNode> actual =
StorageUnitNodeMapCreator.create(Collections.singletonMap("foo_ds",
dataSourcePoolProps));
+ Map<String, StorageNode> actual =
StorageUnitNodeMapCreator.create(Collections.singletonMap("foo_ds",
dataSourcePoolProps), true);
assertThat(actual.size(), is(1));
assertTrue(actual.containsKey("foo_ds"));
}
diff --git
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitTest.java
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitTest.java
index d347a4e4736..3ea7a7c2331 100644
---
a/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitTest.java
+++
b/infra/common/src/test/java/org/apache/shardingsphere/infra/metadata/database/resource/unit/StorageUnitTest.java
@@ -84,13 +84,10 @@ class StorageUnitTest {
try (MockedStatic<DatabaseTypedSPILoader> mockedLoader =
mockStatic(DatabaseTypedSPILoader.class)) {
when(dataSourcePoolProperties.getConnectionPropertySynonyms().getStandardProperties()).thenReturn(standardProperties);
DialectDatabaseMetaData dialectDatabaseMetaData =
mock(DialectDatabaseMetaData.class, RETURNS_DEEP_STUBS);
-
when(dialectDatabaseMetaData.getConnectionOption().isInstanceConnectionAvailable()).thenReturn(true);
mockedLoader.when(() ->
DatabaseTypedSPILoader.getService(DialectDatabaseMetaData.class,
databaseType)).thenReturn(dialectDatabaseMetaData);
ConnectionPropertiesParser parser =
mock(ConnectionPropertiesParser.class);
when(parser.parse("jdbc:mock://127.0.0.1/foo_ds", "sa", null))
.thenReturn(new ConnectionProperties("127.0.0.1", 3307,
"foo_catalog", "foo_schema", new Properties()));
- when(parser.parse("jdbc:mock://127.0.0.1/foo_ds", "sa",
"foo_catalog"))
- .thenReturn(new ConnectionProperties("127.0.0.1", 3307,
"foo_catalog", "foo_schema", new Properties()));
mockedLoader.when(() ->
DatabaseTypedSPILoader.getService(ConnectionPropertiesParser.class,
databaseType)).thenReturn(parser);
StorageUnit actual = new StorageUnit(mock(),
dataSourcePoolProperties, mock());
assertThat(actual.getConnectionProperties().getHostname(),
is("127.0.0.1"));
diff --git
a/infra/data-source-pool/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/CatalogSwitchableDataSource.java
b/infra/data-source-pool/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/CatalogSwitchableDataSource.java
index c9ea4ed8590..55c24a1b441 100644
---
a/infra/data-source-pool/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/CatalogSwitchableDataSource.java
+++
b/infra/data-source-pool/core/src/main/java/org/apache/shardingsphere/infra/datasource/pool/CatalogSwitchableDataSource.java
@@ -44,7 +44,7 @@ public final class CatalogSwitchableDataSource implements
DataSource, AutoClosea
@Override
public Connection getConnection() throws SQLException {
Connection result = dataSource.getConnection();
- if (null != catalog) {
+ if (null != catalog && !catalog.equals(result.getCatalog())) {
result.setCatalog(catalog);
}
return result;
diff --git
a/infra/data-source-pool/core/src/test/java/org/apache/shardingsphere/infra/datasource/pool/CatalogSwitchableDataSourceTest.java
b/infra/data-source-pool/core/src/test/java/org/apache/shardingsphere/infra/datasource/pool/CatalogSwitchableDataSourceTest.java
new file mode 100644
index 00000000000..9af0113db68
--- /dev/null
+++
b/infra/data-source-pool/core/src/test/java/org/apache/shardingsphere/infra/datasource/pool/CatalogSwitchableDataSourceTest.java
@@ -0,0 +1,69 @@
+/*
+ * 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.datasource.pool;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.mockito.Mock;
+import org.mockito.junit.jupiter.MockitoExtension;
+
+import javax.sql.DataSource;
+import java.sql.Connection;
+import java.sql.SQLException;
+
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+@ExtendWith(MockitoExtension.class)
+class CatalogSwitchableDataSourceTest {
+
+ @Mock
+ private DataSource dataSource;
+
+ @Mock
+ private Connection connection;
+
+ @Test
+ void assertGetConnectionWhenCatalogIsNull() throws SQLException {
+ when(dataSource.getConnection()).thenReturn(connection);
+ CatalogSwitchableDataSource catalogSwitchableDataSource = new
CatalogSwitchableDataSource(dataSource, null, "jdbc:mysql://localhost:3306/db");
+ catalogSwitchableDataSource.getConnection();
+ verify(connection, never()).setCatalog(null);
+ }
+
+ @Test
+ void assertGetConnectionWhenCatalogIsSame() throws SQLException {
+ String catalog = "db";
+ when(dataSource.getConnection()).thenReturn(connection);
+ when(connection.getCatalog()).thenReturn(catalog);
+ CatalogSwitchableDataSource catalogSwitchableDataSource = new
CatalogSwitchableDataSource(dataSource, catalog,
"jdbc:mysql://localhost:3306/db");
+ catalogSwitchableDataSource.getConnection();
+ verify(connection, never()).setCatalog(catalog);
+ }
+
+ @Test
+ void assertGetConnectionWhenCatalogIsDifferent() throws SQLException {
+ String catalog = "db";
+ when(dataSource.getConnection()).thenReturn(connection);
+ when(connection.getCatalog()).thenReturn("other_db");
+ CatalogSwitchableDataSource catalogSwitchableDataSource = new
CatalogSwitchableDataSource(dataSource, catalog,
"jdbc:mysql://localhost:3306/db");
+ catalogSwitchableDataSource.getConnection();
+ verify(connection).setCatalog(catalog);
+ }
+}
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 b8ffd235864..6002fcd373b 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
@@ -24,6 +24,7 @@ import
org.apache.shardingsphere.database.exception.core.exception.syntax.databa
import
org.apache.shardingsphere.database.exception.core.exception.syntax.database.UnknownDatabaseException;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
@@ -152,7 +153,9 @@ public final class ContextManager implements AutoCloseable {
private MetaDataContexts createMetaDataContexts(final
ShardingSphereDatabase database) throws SQLException {
Map<String, DataSourcePoolProperties> dataSourcePoolProps =
persistServiceFacade.getMetaDataFacade().getDataSourceUnitService().load(database.getName());
- SwitchingResource switchingResource =
metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(database.getResourceMetaData(),
dataSourcePoolProps);
+ boolean isInstanceConnectionEnabled =
metaDataContexts.getMetaData().getTemporaryProps().<Boolean>getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED);
+ SwitchingResource switchingResource =
+
metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(database.getResourceMetaData(),
dataSourcePoolProps, isInstanceConnectionEnabled);
Collection<RuleConfiguration> ruleConfigs =
persistServiceFacade.getMetaDataFacade().getDatabaseRuleService().load(database.getName());
ShardingSphereDatabase changedDatabase = new
MetaDataContextsFactory(persistServiceFacade.getMetaDataFacade(),
computeNodeInstanceContext)
.createChangedDatabase(database.getName(), false,
switchingResource, ruleConfigs, metaDataContexts);
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
index f9afcfd0c4f..4ab8269b02b 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/MetaDataContextsFactory.java
@@ -23,6 +23,7 @@ import
org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
import
org.apache.shardingsphere.infra.config.database.impl.DataSourceProvidedDatabaseConfiguration;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
@@ -151,7 +152,7 @@ public final class MetaDataContextsFactory {
ShardingSphereDatabase database =
originalMetaDataContext.getMetaData().getDatabase(databaseName);
ResourceMetaData effectiveResourceMetaData =
getEffectiveResourceMetaData(database, switchingResource);
Collection<RuleConfiguration> toBeCreatedRuleConfigs = null ==
ruleConfigs ? database.getRuleMetaData().getConfigurations() : ruleConfigs;
- DatabaseConfiguration toBeCreatedDatabaseConfig =
getDatabaseConfiguration(effectiveResourceMetaData, switchingResource,
toBeCreatedRuleConfigs);
+ DatabaseConfiguration toBeCreatedDatabaseConfig =
getDatabaseConfiguration(effectiveResourceMetaData, switchingResource,
toBeCreatedRuleConfigs, originalMetaDataContext);
return createChangedDatabase(database.getName(),
isLoadSchemasFromRegisterCenter, toBeCreatedDatabaseConfig,
originalMetaDataContext);
}
@@ -197,12 +198,13 @@ public final class MetaDataContextsFactory {
.collect(Collectors.toMap(Entry::getKey, Entry::getValue,
(oldValue, currentValue) -> currentValue, () -> new
LinkedHashMap<>(currentStorageUnits.size(), 1F)));
}
- private DatabaseConfiguration getDatabaseConfiguration(final
ResourceMetaData currentResourceMetaData,
- final
SwitchingResource switchingResource, final Collection<RuleConfiguration>
toBeCreatedRuleConfigs) {
+ private DatabaseConfiguration getDatabaseConfiguration(final
ResourceMetaData currentResourceMetaData, final SwitchingResource
switchingResource,
+ final
Collection<RuleConfiguration> toBeCreatedRuleConfigs, final MetaDataContexts
metaDataContexts) {
Map<String, DataSourcePoolProperties> propsMap = null ==
switchingResource ?
currentResourceMetaData.getStorageUnits().entrySet().stream()
.collect(Collectors.toMap(Entry::getKey, entry ->
entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) ->
oldValue, LinkedHashMap::new))
: switchingResource.getMergedDataSourcePoolPropertiesMap();
- return new
DataSourceProvidedDatabaseConfiguration(getMergedStorageNodeDataSources(currentResourceMetaData,
switchingResource), toBeCreatedRuleConfigs, propsMap);
+ boolean isInstanceConnectionEnabled =
metaDataContexts.getMetaData().getTemporaryProps().<Boolean>getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED);
+ return new
DataSourceProvidedDatabaseConfiguration(getMergedStorageNodeDataSources(currentResourceMetaData,
switchingResource), toBeCreatedRuleConfigs, propsMap,
isInstanceConnectionEnabled);
}
private Map<StorageNode, DataSource> getMergedStorageNodeDataSources(final
ResourceMetaData currentResourceMetaData, final SwitchingResource
switchingResource) {
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/init/type/RegisterCenterMetaDataContextsInitFactory.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/init/type/RegisterCenterMetaDataContextsInitFactory.java
index 8ec8df4a60b..27c2d980ffb 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/init/type/RegisterCenterMetaDataContextsInitFactory.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/factory/init/type/RegisterCenterMetaDataContextsInitFactory.java
@@ -24,6 +24,8 @@ import
org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
import
org.apache.shardingsphere.infra.config.database.impl.DataSourceGeneratedDatabaseConfiguration;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationProperties;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
import org.apache.shardingsphere.infra.datanode.DataNode;
@@ -75,12 +77,15 @@ public final class
RegisterCenterMetaDataContextsInitFactory extends MetaDataCon
@Override
public MetaDataContexts create(final ContextManagerBuilderParameter param)
throws SQLException {
- Map<String, DatabaseConfiguration> effectiveDatabaseConfigs =
createEffectiveDatabaseConfigurations(getDatabaseNames(param.getDatabaseConfigs()),
param.getDatabaseConfigs());
+ TemporaryConfigurationProperties tempProps = new
TemporaryConfigurationProperties(persistFacade.getPropsService().load());
+ boolean isInstanceConnectionEnabled =
tempProps.getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED);
+ Map<String, DatabaseConfiguration> effectiveDatabaseConfigs =
+
createEffectiveDatabaseConfigurations(getDatabaseNames(param.getDatabaseConfigs()),
param.getDatabaseConfigs(), isInstanceConnectionEnabled);
// TODO load global data sources from persist service
Map<String, DataSource> globalDataSources =
param.getGlobalDataSources();
ConfigurationProperties props = new
ConfigurationProperties(persistFacade.getPropsService().load());
DatabaseType protocolType =
DatabaseTypeEngine.getProtocolType(effectiveDatabaseConfigs, props);
- Map<String, Collection<ShardingSphereSchema>> schemas =
loadSchemas(effectiveDatabaseConfigs, protocolType, props);
+ Map<String, Collection<ShardingSphereSchema>> schemas =
loadSchemas(effectiveDatabaseConfigs, protocolType, props,
isInstanceConnectionEnabled);
Collection<ShardingSphereDatabase> databases;
if (persistSchemasEnabled) {
// TODO merge schemas with local
@@ -104,15 +109,17 @@ public final class
RegisterCenterMetaDataContextsInitFactory extends MetaDataCon
:
persistFacade.getDatabaseMetaDataFacade().getDatabase().loadAllDatabaseNames();
}
- private Map<String, DatabaseConfiguration>
createEffectiveDatabaseConfigurations(final Collection<String> databaseNames,
final Map<String, DatabaseConfiguration> databaseConfigs) {
- return databaseNames.stream().collect(Collectors.toMap(each -> each,
each -> createEffectiveDatabaseConfiguration(each, databaseConfigs)));
+ private Map<String, DatabaseConfiguration>
createEffectiveDatabaseConfigurations(final Collection<String> databaseNames,
final Map<String, DatabaseConfiguration> databaseConfigs,
+
final boolean isInstanceConnectionEnabled) {
+ return databaseNames.stream().collect(Collectors.toMap(each -> each,
each -> createEffectiveDatabaseConfiguration(each, databaseConfigs,
isInstanceConnectionEnabled)));
}
- private DatabaseConfiguration createEffectiveDatabaseConfiguration(final
String databaseName, final Map<String, DatabaseConfiguration> databaseConfigs) {
+ private DatabaseConfiguration createEffectiveDatabaseConfiguration(final
String databaseName, final Map<String, DatabaseConfiguration> databaseConfigs,
+ final
boolean isInstanceConnectionEnabled) {
closeGeneratedDataSources(databaseName, databaseConfigs);
Map<String, DataSourceConfiguration> dataSources =
persistFacade.loadDataSourceConfigurations(databaseName);
Collection<RuleConfiguration> databaseRuleConfigs =
persistFacade.getDatabaseRuleService().load(databaseName);
- return new DataSourceGeneratedDatabaseConfiguration(dataSources,
databaseRuleConfigs);
+ return new DataSourceGeneratedDatabaseConfiguration(dataSources,
databaseRuleConfigs, isInstanceConnectionEnabled);
}
private void closeGeneratedDataSources(final String databaseName, final
Map<String, ? extends DatabaseConfiguration> databaseConfigs) {
@@ -121,8 +128,8 @@ public final class
RegisterCenterMetaDataContextsInitFactory extends MetaDataCon
}
}
- private Map<String, Collection<ShardingSphereSchema>> loadSchemas(final
Map<String, DatabaseConfiguration> effectiveDatabaseConfigs,
- final
DatabaseType protocolType, final ConfigurationProperties props) {
+ private Map<String, Collection<ShardingSphereSchema>> loadSchemas(final
Map<String, DatabaseConfiguration> effectiveDatabaseConfigs, final DatabaseType
protocolType,
+ final
ConfigurationProperties props, final boolean isInstanceConnectionEnabled) {
Collection<String> sysDatabaseNames = new
SystemDatabase(protocolType).getSystemDatabases();
Collection<String> databaseNames = effectiveDatabaseConfigs.keySet();
Map<String, Collection<ShardingSphereSchema>> result = new
HashMap<>(databaseNames.size());
@@ -140,7 +147,7 @@ public final class
RegisterCenterMetaDataContextsInitFactory extends MetaDataCon
} else {
log.info("Repository missed single tables: {} of database:
{}, start to reload", missedSingleTables, dbName);
DataSourceGeneratedDatabaseConfiguration databaseConfig =
new
DataSourceGeneratedDatabaseConfiguration(persistFacade.loadDataSourceConfigurations(dbName),
- Collections.singleton(new
SingleRuleConfiguration(missedSingleTables, null)));
+ Collections.singleton(new
SingleRuleConfiguration(missedSingleTables, null)),
isInstanceConnectionEnabled);
try {
ShardingSphereDatabase database =
ShardingSphereDatabaseFactory.createWithoutSystemSchema(dbName, protocolType,
databaseConfig, props, instanceContext);
database.getAllSchemas().forEach(schema ->
persistFacade.getDatabaseMetaDataFacade().getTable().persist(dbName,
schema.getName(), schema.getAllTables()));
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/ResourceSwitchManager.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/ResourceSwitchManager.java
index 9427ae3ba25..7d1b82146dd 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/ResourceSwitchManager.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/ResourceSwitchManager.java
@@ -45,14 +45,16 @@ public final class ResourceSwitchManager {
*
* @param resourceMetaData resource meta data
* @param toBeRegisteredProps to be registered storage unit grouped data
source pool properties map
+ * @param isInstanceConnectionEnabled is instance connection enabled
* @return created switching resource
*/
- public SwitchingResource switchByRegisterStorageUnit(final
ResourceMetaData resourceMetaData, final Map<String, DataSourcePoolProperties>
toBeRegisteredProps) {
+ public SwitchingResource switchByRegisterStorageUnit(final
ResourceMetaData resourceMetaData, final Map<String, DataSourcePoolProperties>
toBeRegisteredProps,
+ final boolean
isInstanceConnectionEnabled) {
Map<String, DataSourcePoolProperties> mergedPropsMap = new
LinkedHashMap<>(resourceMetaData.getStorageUnits().entrySet().stream()
.collect(Collectors.toMap(Entry::getKey, entry ->
entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) ->
oldValue, LinkedHashMap::new)));
mergedPropsMap.putAll(toBeRegisteredProps);
- Map<String, StorageNode> toBeCreatedStorageUintNodeMap =
StorageUnitNodeMapCreator.create(toBeRegisteredProps);
- Map<StorageNode, DataSourcePoolProperties> dataSourcePoolPropsMap =
StorageNodeAggregator.aggregateDataSourcePoolProperties(toBeRegisteredProps);
+ Map<String, StorageNode> toBeCreatedStorageUintNodeMap =
StorageUnitNodeMapCreator.create(toBeRegisteredProps,
isInstanceConnectionEnabled);
+ Map<StorageNode, DataSourcePoolProperties> dataSourcePoolPropsMap =
StorageNodeAggregator.aggregateDataSourcePoolProperties(toBeRegisteredProps,
isInstanceConnectionEnabled);
return new SwitchingResource(getNewDataSources(resourceMetaData,
toBeCreatedStorageUintNodeMap, dataSourcePoolPropsMap), Collections.emptyMap(),
Collections.emptyList(), mergedPropsMap);
}
@@ -72,14 +74,16 @@ public final class ResourceSwitchManager {
*
* @param resourceMetaData resource meta data
* @param toBeAlteredProps to be altered data source pool properties map
+ * @param isInstanceConnectionEnabled is instance connection enabled
* @return created switching resource
*/
- public SwitchingResource switchByAlterStorageUnit(final ResourceMetaData
resourceMetaData, final Map<String, DataSourcePoolProperties> toBeAlteredProps)
{
+ public SwitchingResource switchByAlterStorageUnit(final ResourceMetaData
resourceMetaData, final Map<String, DataSourcePoolProperties> toBeAlteredProps,
+ final boolean
isInstanceConnectionEnabled) {
Map<String, DataSourcePoolProperties> mergedDataSourcePoolPropsMap =
new LinkedHashMap<>(resourceMetaData.getStorageUnits().entrySet().stream()
.collect(Collectors.toMap(Entry::getKey, entry ->
entry.getValue().getDataSourcePoolProperties(), (oldValue, currentValue) ->
oldValue, LinkedHashMap::new)));
mergedDataSourcePoolPropsMap.putAll(toBeAlteredProps);
- Map<String, StorageNode> toBeAlteredStorageUintNodeMap =
StorageUnitNodeMapCreator.create(mergedDataSourcePoolPropsMap);
- Map<StorageNode, DataSourcePoolProperties> dataSourcePoolPropsMap =
StorageNodeAggregator.aggregateDataSourcePoolProperties(mergedDataSourcePoolPropsMap);
+ Map<String, StorageNode> toBeAlteredStorageUintNodeMap =
StorageUnitNodeMapCreator.create(mergedDataSourcePoolPropsMap,
isInstanceConnectionEnabled);
+ Map<StorageNode, DataSourcePoolProperties> dataSourcePoolPropsMap =
StorageNodeAggregator.aggregateDataSourcePoolProperties(mergedDataSourcePoolPropsMap,
isInstanceConnectionEnabled);
return new
SwitchingResource(getAlterNewDataSources(toBeAlteredStorageUintNodeMap,
dataSourcePoolPropsMap),
getStaleDataSources(resourceMetaData,
toBeAlteredStorageUintNodeMap.values()), new
LinkedHashSet<>(toBeAlteredStorageUintNodeMap.keySet()),
mergedDataSourcePoolPropsMap);
}
diff --git
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManager.java
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManager.java
index 0bdef7fa50a..ec4e3587079 100644
---
a/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManager.java
+++
b/mode/core/src/main/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManager.java
@@ -20,6 +20,7 @@ package
org.apache.shardingsphere.mode.metadata.manager.resource;
import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -60,7 +61,8 @@ public final class StorageUnitManager {
ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabase(databaseName);
try {
closeStaleRules(database);
- SwitchingResource switchingResource =
resourceSwitchManager.switchByRegisterStorageUnit(database.getResourceMetaData(),
propsMap);
+ boolean isInstanceConnectionEnabled =
metaDataContexts.getMetaData().getTemporaryProps().<Boolean>getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED);
+ SwitchingResource switchingResource =
resourceSwitchManager.switchByRegisterStorageUnit(database.getResourceMetaData(),
propsMap, isInstanceConnectionEnabled);
buildNewMetaDataContext(databaseName, switchingResource, true);
} catch (final SQLException ex) {
log.error("Alter database: {} register storage unit failed.",
databaseName, ex);
@@ -77,7 +79,8 @@ public final class StorageUnitManager {
ShardingSphereDatabase database =
metaDataContexts.getMetaData().getDatabase(databaseName);
try {
closeStaleRules(database);
- SwitchingResource switchingResource =
resourceSwitchManager.switchByAlterStorageUnit(database.getResourceMetaData(),
propsMap);
+ boolean isInstanceConnectionEnabled =
metaDataContexts.getMetaData().getTemporaryProps().<Boolean>getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED);
+ SwitchingResource switchingResource =
resourceSwitchManager.switchByAlterStorageUnit(database.getResourceMetaData(),
propsMap, isInstanceConnectionEnabled);
buildNewMetaDataContext(databaseName, switchingResource, true);
} catch (final SQLException ex) {
log.error("Alter database: {} alter storage unit failed.",
databaseName, ex);
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 993b185f203..8f4bbcd41fd 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
@@ -23,6 +23,7 @@ import
org.apache.shardingsphere.database.exception.core.exception.syntax.databa
import
org.apache.shardingsphere.database.exception.core.exception.syntax.database.UnknownDatabaseException;
import org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationProperties;
import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
import org.apache.shardingsphere.infra.datanode.DataNode;
import org.apache.shardingsphere.infra.instance.ComputeNodeInstance;
@@ -77,6 +78,7 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyCollection;
import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.ArgumentMatchers.anySet;
@@ -109,6 +111,7 @@ class ContextManagerTest {
@BeforeEach
void setUp() throws SQLException {
when(metaDataContexts.getMetaData().getProps()).thenReturn(new
ConfigurationProperties(new Properties()));
+
when(metaDataContexts.getMetaData().getTemporaryProps()).thenReturn(new
TemporaryConfigurationProperties(new Properties()));
database = mockDatabase();
when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true);
when(metaDataContexts.getMetaData().getDatabase("foo_db")).thenReturn(database);
@@ -186,7 +189,7 @@ class ContextManagerTest {
setPersistServiceFacade(persistServiceFacade);
MetaDataContextManager metaDataContextManager =
mock(MetaDataContextManager.class, RETURNS_DEEP_STUBS);
SwitchingResource switchingResource = new
SwitchingResource(Collections.emptyMap(), Collections.emptyMap(),
Collections.emptyList(), Collections.emptyMap());
-
when(metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(any(ResourceMetaData.class),
anyMap())).thenReturn(switchingResource);
+
when(metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(any(ResourceMetaData.class),
anyMap(), anyBoolean())).thenReturn(switchingResource);
setMetaDataContextManager(metaDataContextManager);
when(metaDataContexts.getMetaData().getGlobalResourceMetaData()).thenReturn(mock(ResourceMetaData.class));
try (
@@ -210,7 +213,7 @@ class ContextManagerTest {
setPersistServiceFacade(mockPersistServiceFacade());
MetaDataContextManager metaDataContextManager =
mock(MetaDataContextManager.class, RETURNS_DEEP_STUBS);
SwitchingResource switchingResource = new
SwitchingResource(Collections.emptyMap(), Collections.emptyMap(),
Collections.emptyList(), Collections.emptyMap());
-
when(metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(any(ResourceMetaData.class),
anyMap())).thenReturn(switchingResource);
+
when(metaDataContextManager.getResourceSwitchManager().switchByAlterStorageUnit(any(ResourceMetaData.class),
anyMap(), anyBoolean())).thenReturn(switchingResource);
setMetaDataContextManager(metaDataContextManager);
try (
MockedConstruction<MetaDataContextsFactory> ignored =
mockConstruction(MetaDataContextsFactory.class,
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/ResourceSwitchManagerTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/ResourceSwitchManagerTest.java
index 66f4b881c09..3c0e49a4e07 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/ResourceSwitchManagerTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/ResourceSwitchManagerTest.java
@@ -66,7 +66,7 @@ class ResourceSwitchManagerTest {
DataSource newDataSource = mock(DataSource.class);
try (MockedStatic<DataSourcePoolCreator> mocked =
mockStatic(DataSourcePoolCreator.class)) {
mocked.when(() ->
DataSourcePoolCreator.create(any(DataSourcePoolProperties.class))).thenReturn(newDataSource);
- SwitchingResource actual =
resourceSwitchManager.switchByRegisterStorageUnit(resourceMetaData,
toBeRegistered);
+ SwitchingResource actual =
resourceSwitchManager.switchByRegisterStorageUnit(resourceMetaData,
toBeRegistered, false);
assertThat(actual.getNewDataSources().size(), is(1));
assertThat(actual.getNewDataSources(), hasKey(new
StorageNode("ds_new")));
verifyNoInteractions(resourceMetaData.getDataSources().get(new
StorageNode("ds_existing")));
@@ -81,7 +81,7 @@ class ResourceSwitchManagerTest {
DataSource newDataSource = mock(DataSource.class);
try (MockedStatic<DataSourcePoolCreator> mocked =
mockStatic(DataSourcePoolCreator.class)) {
mocked.when(() ->
DataSourcePoolCreator.create(any(DataSourcePoolProperties.class))).thenReturn(newDataSource);
- SwitchingResource actual =
resourceSwitchManager.switchByAlterStorageUnit(resourceMetaData, toBeAltered);
+ SwitchingResource actual =
resourceSwitchManager.switchByAlterStorageUnit(resourceMetaData, toBeAltered,
false);
assertThat(actual.getNewDataSources().get(existingNode),
is(newDataSource));
assertThat(actual.getStaleDataSources().get(existingNode),
is(resourceMetaData.getDataSources().get(existingNode)));
assertThat(actual.getStaleDataSources(), not(hasKey(new
StorageNode("extra_only"))));
@@ -137,7 +137,7 @@ class ResourceSwitchManagerTest {
DataSource newDataSource = mock(DataSource.class);
try (MockedStatic<DataSourcePoolCreator> mocked =
mockStatic(DataSourcePoolCreator.class)) {
mocked.when(() ->
DataSourcePoolCreator.create(any(DataSourcePoolProperties.class))).thenReturn(newDataSource);
- SwitchingResource actual =
resourceSwitchManager.switchByRegisterStorageUnit(resourceMetaData,
toBeRegistered);
+ SwitchingResource actual =
resourceSwitchManager.switchByRegisterStorageUnit(resourceMetaData,
toBeRegistered, false);
assertThat(actual.getNewDataSources().size(), is(newUnitsCount));
assertThat(actual.getNewDataSources().size(), is(newUnitsCount));
for (int i = 0; i < newUnitsCount; i++) {
@@ -154,7 +154,7 @@ class ResourceSwitchManagerTest {
DataSource newDataSource = mock(DataSource.class);
try (MockedStatic<DataSourcePoolCreator> mocked =
mockStatic(DataSourcePoolCreator.class)) {
mocked.when(() ->
DataSourcePoolCreator.create(any(DataSourcePoolProperties.class))).thenReturn(newDataSource);
- SwitchingResource actual =
resourceSwitchManager.switchByAlterStorageUnit(resourceMetaData, toBeAltered);
+ SwitchingResource actual =
resourceSwitchManager.switchByAlterStorageUnit(resourceMetaData, toBeAltered,
false);
assertThat(actual.getNewDataSources().size(), is(totalUnits));
assertThat(actual.getStaleDataSources().size(), is(totalUnits));
assertTrue(actual.getStaleStorageUnitNames().containsAll(toBeAltered.keySet()));
@@ -179,7 +179,7 @@ class ResourceSwitchManagerTest {
void assertSwitchByRegisterStorageUnitWithEmptyInput() {
ResourceMetaData resourceMetaData =
createResourceMetaDataWithSingleUnit("ds_existing");
Map<String, DataSourcePoolProperties> toBeRegistered =
Collections.emptyMap();
- SwitchingResource actual =
resourceSwitchManager.switchByRegisterStorageUnit(resourceMetaData,
toBeRegistered);
+ SwitchingResource actual =
resourceSwitchManager.switchByRegisterStorageUnit(resourceMetaData,
toBeRegistered, false);
assertThat(actual.getNewDataSources(), aMapWithSize(0));
assertThat(actual.getStaleDataSources(), aMapWithSize(0));
assertThat(actual.getStaleStorageUnitNames().isEmpty(), is(true));
@@ -193,7 +193,7 @@ class ResourceSwitchManagerTest {
DataSource newDataSource = mock(DataSource.class);
try (MockedStatic<DataSourcePoolCreator> mocked =
mockStatic(DataSourcePoolCreator.class)) {
mocked.when(() ->
DataSourcePoolCreator.create(any(DataSourcePoolProperties.class))).thenReturn(newDataSource);
- SwitchingResource actual =
resourceSwitchManager.switchByAlterStorageUnit(resourceMetaData, toBeAltered);
+ SwitchingResource actual =
resourceSwitchManager.switchByAlterStorageUnit(resourceMetaData, toBeAltered,
false);
assertThat(actual.getNewDataSources().size(), is(1));
assertThat(actual.getStaleDataSources().size(), is(1));
assertThat(actual.getStaleStorageUnitNames().isEmpty(), is(false));
@@ -228,7 +228,7 @@ class ResourceSwitchManagerTest {
DataSource newDataSource = mock(DataSource.class);
try (MockedStatic<DataSourcePoolCreator> mocked =
mockStatic(DataSourcePoolCreator.class)) {
mocked.when(() ->
DataSourcePoolCreator.create(any(DataSourcePoolProperties.class))).thenReturn(newDataSource);
- SwitchingResource actual =
resourceSwitchManager.switchByRegisterStorageUnit(resourceMetaData,
toBeRegistered);
+ SwitchingResource actual =
resourceSwitchManager.switchByRegisterStorageUnit(resourceMetaData,
toBeRegistered, false);
assertThat(actual.getNewDataSources().size(), is(1));
assertThat(actual.getNewDataSources(), hasKey(new
StorageNode("new_0")));
}
@@ -243,7 +243,7 @@ class ResourceSwitchManagerTest {
DataSource newDataSource = mock(DataSource.class);
try (MockedStatic<DataSourcePoolCreator> mocked =
mockStatic(DataSourcePoolCreator.class)) {
mocked.when(() ->
DataSourcePoolCreator.create(any(DataSourcePoolProperties.class))).thenReturn(newDataSource);
- SwitchingResource actual =
resourceSwitchManager.switchByAlterStorageUnit(resourceMetaData, toBeAltered);
+ SwitchingResource actual =
resourceSwitchManager.switchByAlterStorageUnit(resourceMetaData, toBeAltered,
false);
assertThat(actual.getNewDataSources().size(), is(5));
assertThat(actual.getStaleDataSources().size(), is(5));
assertThat(actual.getStaleStorageUnitNames(),
containsInAnyOrder("0", "1", "2", "3", "4"));
diff --git
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java
index 9481c0d047c..b8a0a530649 100644
---
a/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java
+++
b/mode/core/src/test/java/org/apache/shardingsphere/mode/metadata/manager/resource/StorageUnitManagerTest.java
@@ -18,7 +18,9 @@
package org.apache.shardingsphere.mode.metadata.manager.resource;
import lombok.SneakyThrows;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationProperties;
import org.apache.shardingsphere.infra.instance.ComputeNodeInstanceContext;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import
org.apache.shardingsphere.infra.metadata.database.schema.model.ShardingSphereSchema;
@@ -36,9 +38,11 @@ import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Map;
+import java.util.Properties;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
@@ -61,7 +65,7 @@ class StorageUnitManagerTest {
MetaDataContexts metaDataContexts = mockMetaDataContexts();
ResourceSwitchManager resourceSwitchManager =
mock(ResourceSwitchManager.class);
SwitchingResource switchingResource = new
SwitchingResource(Collections.emptyMap(), Collections.emptyMap(),
Collections.emptyList(), Collections.emptyMap());
-
when(resourceSwitchManager.switchByRegisterStorageUnit(any(ResourceMetaData.class),
any(Map.class))).thenReturn(switchingResource);
+
when(resourceSwitchManager.switchByRegisterStorageUnit(any(ResourceMetaData.class),
any(Map.class), anyBoolean())).thenReturn(switchingResource);
ShardingSphereDatabase reloadDatabase =
mock(ShardingSphereDatabase.class);
when(reloadDatabase.getAllSchemas()).thenReturn(Collections.singleton(new
ShardingSphereSchema("foo_schema")));
MetaDataContexts reloadMetaDataContexts = mock(MetaDataContexts.class,
RETURNS_DEEP_STUBS);
@@ -82,7 +86,7 @@ class StorageUnitManagerTest {
ResourceSwitchManager resourceSwitchManager =
mock(ResourceSwitchManager.class);
doAnswer(invocation -> {
throw new SQLException("register error");
-
}).when(resourceSwitchManager).switchByRegisterStorageUnit(any(ResourceMetaData.class),
any(Map.class));
+
}).when(resourceSwitchManager).switchByRegisterStorageUnit(any(ResourceMetaData.class),
any(Map.class), anyBoolean());
assertDoesNotThrow(() -> createManager(metaDataContexts,
resourceSwitchManager).register(DATABASE_NAME, Collections.emptyMap()));
verify(metaDataContexts, never()).update(any(MetaDataContexts.class));
verify(metaDataContexts.getMetaData(),
never()).putDatabase(any(ShardingSphereDatabase.class));
@@ -93,7 +97,7 @@ class StorageUnitManagerTest {
MetaDataContexts metaDataContexts = mockMetaDataContexts();
ResourceSwitchManager resourceSwitchManager =
mock(ResourceSwitchManager.class);
SwitchingResource switchingResource = new
SwitchingResource(Collections.emptyMap(), Collections.emptyMap(),
Collections.emptyList(), Collections.emptyMap());
-
when(resourceSwitchManager.switchByAlterStorageUnit(any(ResourceMetaData.class),
any(Map.class))).thenReturn(switchingResource);
+
when(resourceSwitchManager.switchByAlterStorageUnit(any(ResourceMetaData.class),
any(Map.class), anyBoolean())).thenReturn(switchingResource);
ShardingSphereDatabase reloadDatabase =
mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS);
MetaDataContexts reloadMetaDataContexts = mock(MetaDataContexts.class,
RETURNS_DEEP_STUBS);
when(reloadMetaDataContexts.getMetaData().getDatabase(DATABASE_NAME)).thenReturn(reloadDatabase);
@@ -113,7 +117,7 @@ class StorageUnitManagerTest {
ResourceSwitchManager resourceSwitchManager =
mock(ResourceSwitchManager.class);
doAnswer(invocation -> {
throw new SQLException("alter error");
-
}).when(resourceSwitchManager).switchByAlterStorageUnit(any(ResourceMetaData.class),
any(Map.class));
+
}).when(resourceSwitchManager).switchByAlterStorageUnit(any(ResourceMetaData.class),
any(Map.class), anyBoolean());
assertDoesNotThrow(() -> createManager(metaDataContexts,
resourceSwitchManager).alter(DATABASE_NAME, Collections.emptyMap()));
verify(metaDataContexts, never()).update(any(MetaDataContexts.class));
verify(metaDataContexts.getMetaData(),
never()).putDatabase(any(ShardingSphereDatabase.class));
@@ -151,11 +155,14 @@ class StorageUnitManagerTest {
}
private MetaDataContexts mockMetaDataContexts() {
- MetaDataContexts result = mock(MetaDataContexts.class,
RETURNS_DEEP_STUBS);
+ MetaDataContexts result = mock(MetaDataContexts.class);
+ ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+ when(result.getMetaData()).thenReturn(metaData);
ShardingSphereDatabase database = mock(ShardingSphereDatabase.class,
RETURNS_DEEP_STUBS);
when(database.getResourceMetaData()).thenReturn(new
ResourceMetaData(Collections.emptyMap(), Collections.emptyMap()));
when(database.getRuleMetaData().getRules()).thenReturn(Arrays.asList(mock(ShardingSphereRule.class,
withSettings().extraInterfaces(AutoCloseable.class)),
mock(ShardingSphereRule.class)));
-
when(result.getMetaData().getDatabase(DATABASE_NAME)).thenReturn(database);
+ when(metaData.getDatabase(DATABASE_NAME)).thenReturn(database);
+ when(metaData.getTemporaryProps()).thenReturn(new
TemporaryConfigurationProperties(new Properties()));
return result;
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/config/yaml/swapper/YamlProxyConfigurationSwapper.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/config/yaml/swapper/YamlProxyConfigurationSwapper.java
index 94ddfbce4b8..abde5352e30 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/config/yaml/swapper/YamlProxyConfigurationSwapper.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/config/yaml/swapper/YamlProxyConfigurationSwapper.java
@@ -19,6 +19,7 @@ package
org.apache.shardingsphere.proxy.backend.config.yaml.swapper;
import org.apache.shardingsphere.infra.config.database.DatabaseConfiguration;
import
org.apache.shardingsphere.infra.config.database.impl.DataSourceGeneratedDatabaseConfiguration;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.datasource.pool.config.DataSourceConfiguration;
import
org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCreator;
@@ -57,7 +58,9 @@ public final class YamlProxyConfigurationSwapper {
* @return proxy configuration
*/
public ProxyConfiguration swap(final YamlProxyConfiguration yamlConfig) {
- Map<String, DatabaseConfiguration> databaseConfigs =
swapDatabaseConfigurations(yamlConfig.getDatabaseConfigurations());
+ boolean isInstanceConnectionEnabled =
+ (boolean)
yamlConfig.getServerConfiguration().getProps().getOrDefault(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED.getKey(),
Boolean.FALSE);
+ Map<String, DatabaseConfiguration> databaseConfigs =
swapDatabaseConfigurations(yamlConfig.getDatabaseConfigurations(),
isInstanceConnectionEnabled);
ProxyGlobalConfiguration globalConfig =
swapGlobalConfiguration(yamlConfig.getServerConfiguration());
return new ProxyConfiguration(databaseConfigs, globalConfig);
}
@@ -76,12 +79,12 @@ public final class YamlProxyConfigurationSwapper {
return DataSourcePoolCreator.create(propsMap, true);
}
- private Map<String, DatabaseConfiguration>
swapDatabaseConfigurations(final Map<String, YamlProxyDatabaseConfiguration>
databaseConfigs) {
+ private Map<String, DatabaseConfiguration>
swapDatabaseConfigurations(final Map<String, YamlProxyDatabaseConfiguration>
databaseConfigs, final boolean isInstanceConnectionEnabled) {
Map<String, DatabaseConfiguration> result = new
LinkedHashMap<>(databaseConfigs.size(), 1F);
for (Entry<String, YamlProxyDatabaseConfiguration> entry :
databaseConfigs.entrySet()) {
Map<String, DataSourceConfiguration> databaseDataSourceConfigs =
swapDataSourceConfigurations(entry.getValue().getDataSources());
Collection<RuleConfiguration> databaseRuleConfigs =
ruleConfigSwapperEngine.swapToRuleConfigurations(entry.getValue().getRules());
- result.put(entry.getKey(), new
DataSourceGeneratedDatabaseConfiguration(databaseDataSourceConfigs,
databaseRuleConfigs));
+ result.put(entry.getKey(), new
DataSourceGeneratedDatabaseConfiguration(databaseDataSourceConfigs,
databaseRuleConfigs, isInstanceConnectionEnabled));
}
return result;
}
diff --git
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
index 62804d1c4e5..68d351b6eb4 100644
---
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
+++
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutor.java
@@ -21,6 +21,7 @@ import lombok.RequiredArgsConstructor;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.database.exception.core.exception.syntax.database.DatabaseCreateExistsException;
import
org.apache.shardingsphere.distsql.handler.validate.DistSQLDataSourcePoolPropertiesValidator;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationPropertyKey;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.config.rule.checker.DatabaseRuleConfigurationCheckEngine;
import org.apache.shardingsphere.infra.database.DatabaseTypeEngine;
@@ -112,7 +113,8 @@ public final class YamlDatabaseConfigurationImportExecutor {
validateHandler.validate(propsMap);
contextManager.getPersistServiceFacade().getModeFacade().getMetaDataManagerService().registerStorageUnits(databaseName,
propsMap);
Map<String, StorageUnit> storageUnits =
contextManager.getMetaDataContexts().getMetaData().getDatabase(databaseName).getResourceMetaData().getStorageUnits();
- Map<String, StorageNode> toBeAddedStorageNode =
StorageUnitNodeMapCreator.create(propsMap);
+ boolean isInstanceConnectionEnabled =
contextManager.getMetaDataContexts().getMetaData().getTemporaryProps().<Boolean>getValue(TemporaryConfigurationPropertyKey.INSTANCE_CONNECTION_ENABLED);
+ Map<String, StorageNode> toBeAddedStorageNode =
StorageUnitNodeMapCreator.create(propsMap, isInstanceConnectionEnabled);
for (Entry<String, DataSourcePoolProperties> entry :
propsMap.entrySet()) {
storageUnits.put(entry.getKey(), new
StorageUnit(toBeAddedStorageNode.get(entry.getKey()), entry.getValue(),
DataSourcePoolCreator.create(entry.getValue())));
}
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/variable/ShowDistVariablesExecutorTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/variable/ShowDistVariablesExecutorTest.java
index 9d5f1724510..6b6664687e5 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/variable/ShowDistVariablesExecutorTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/queryable/variable/ShowDistVariablesExecutorTest.java
@@ -76,10 +76,10 @@ class ShowDistVariablesExecutorTest {
ShowDistVariablesExecutor executor = new ShowDistVariablesExecutor();
ShowDistVariablesStatement sqlStatement = new
ShowDistVariablesStatement(true, null);
Collection<LocalDataQueryResultRow> actual =
executor.getRows(sqlStatement, contextManager);
- assertThat(actual.size(), is(3));
+ assertThat(actual.size(), is(4));
LocalDataQueryResultRow row = actual.iterator().next();
- assertThat(row.getCell(1), is("proxy_meta_data_collector_cron"));
- assertThat(row.getCell(2), is("0 0/1 * * * ?"));
+ assertThat(row.getCell(1), is("instance_connection_enabled"));
+ assertThat(row.getCell(2), is("false"));
}
@Test
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/imports/ImportDatabaseConfigurationExecutorTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/imports/ImportDatabaseConfigurationExecutorTest.java
index 31bddadc2d3..c30e4931ccf 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/imports/ImportDatabaseConfigurationExecutorTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/imports/ImportDatabaseConfigurationExecutorTest.java
@@ -22,6 +22,7 @@ import
org.apache.shardingsphere.database.exception.core.exception.syntax.databa
import
org.apache.shardingsphere.distsql.statement.type.ral.updatable.ImportDatabaseConfigurationStatement;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationProperties;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.MissingRequiredDatabaseException;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.rule.DuplicateRuleException;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
@@ -41,6 +42,7 @@ import java.net.URL;
import java.util.Collections;
import java.util.HashMap;
import java.util.LinkedList;
+import java.util.Properties;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertThrows;
@@ -130,6 +132,7 @@ class ImportDatabaseConfigurationExecutorTest {
when(result.getMetaDataContexts().getMetaData().getDatabase(databaseName)).thenReturn(database);
when(result.getMetaDataContexts().getMetaData().getProps()).thenReturn(
new ConfigurationProperties(PropertiesBuilder.build(new
Property(ConfigurationPropertyKey.PROXY_FRONTEND_DATABASE_PROTOCOL_TYPE.getKey(),
"MySQL"))));
+
when(result.getMetaDataContexts().getMetaData().getTemporaryProps()).thenReturn(new
TemporaryConfigurationProperties(new Properties()));
return result;
}
}
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/imports/ImportMetaDataExecutorTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/imports/ImportMetaDataExecutorTest.java
index ff910fe0b84..43c10d4019c 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/imports/ImportMetaDataExecutorTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/ral/updatable/imports/ImportMetaDataExecutorTest.java
@@ -28,6 +28,7 @@ import
org.apache.shardingsphere.globalclock.rule.builder.DefaultGlobalClockRule
import org.apache.shardingsphere.infra.config.mode.ModeConfiguration;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
import org.apache.shardingsphere.infra.config.props.ConfigurationPropertyKey;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationProperties;
import
org.apache.shardingsphere.infra.datasource.pool.props.creator.DataSourcePoolPropertiesCreator;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
import
org.apache.shardingsphere.infra.exception.kernel.metadata.resource.storageunit.EmptyStorageUnitException;
@@ -60,6 +61,7 @@ import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Objects;
+import java.util.Properties;
import java.util.stream.Collectors;
import static org.junit.jupiter.api.Assertions.assertNotNull;
@@ -92,6 +94,7 @@ class ImportMetaDataExecutorTest {
void assertImportEmptyMetaData() {
ImportMetaDataExecutor executor = new ImportMetaDataExecutor();
ContextManager contextManager = mock(ContextManager.class,
RETURNS_DEEP_STUBS);
+
when(contextManager.getMetaDataContexts().getMetaData().getTemporaryProps()).thenReturn(new
TemporaryConfigurationProperties(new Properties()));
assertThrows(EmptyStorageUnitException.class, () ->
executor.executeUpdate(
new ImportMetaDataStatement(null,
Objects.requireNonNull(ImportMetaDataExecutorTest.class.getResource(featureMap.get(EMPTY_DATABASE_NAME))).getPath()),
contextManager));
}
@@ -99,6 +102,7 @@ class ImportMetaDataExecutorTest {
@Test
void assertImportMetaDataFromJsonValue() {
ContextManager contextManager = mock(ContextManager.class,
RETURNS_DEEP_STUBS);
+
when(contextManager.getMetaDataContexts().getMetaData().getTemporaryProps()).thenReturn(new
TemporaryConfigurationProperties(new Properties()));
ImportMetaDataExecutor executor = new ImportMetaDataExecutor();
executor.executeUpdate(new
ImportMetaDataStatement(Base64.encodeBase64String(METADATA_VALUE.getBytes()),
null), contextManager);
assertNotNull(contextManager.getDatabase("normal_db"));
diff --git
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutorTest.java
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutorTest.java
index 3c41f7f7e07..a2047247e39 100644
---
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutorTest.java
+++
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/util/YamlDatabaseConfigurationImportExecutorTest.java
@@ -20,6 +20,7 @@ package org.apache.shardingsphere.proxy.backend.util;
import org.apache.shardingsphere.database.connector.core.type.DatabaseType;
import
org.apache.shardingsphere.distsql.handler.validate.DistSQLDataSourcePoolPropertiesValidator;
import org.apache.shardingsphere.infra.config.props.ConfigurationProperties;
+import
org.apache.shardingsphere.infra.config.props.temporary.TemporaryConfigurationProperties;
import org.apache.shardingsphere.infra.config.rule.RuleConfiguration;
import
org.apache.shardingsphere.infra.config.rule.checker.DatabaseRuleConfigurationCheckEngine;
import
org.apache.shardingsphere.infra.config.rule.checker.DatabaseRuleConfigurationChecker;
@@ -29,6 +30,7 @@ import
org.apache.shardingsphere.infra.datasource.pool.creator.DataSourcePoolCre
import
org.apache.shardingsphere.infra.datasource.pool.props.creator.DataSourcePoolPropertiesCreator;
import
org.apache.shardingsphere.infra.datasource.pool.props.domain.DataSourcePoolProperties;
import
org.apache.shardingsphere.infra.exception.external.sql.ShardingSphereSQLException;
+import org.apache.shardingsphere.infra.metadata.ShardingSphereMetaData;
import
org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import
org.apache.shardingsphere.infra.metadata.database.resource.ResourceMetaData;
import
org.apache.shardingsphere.infra.metadata.database.resource.node.StorageNode;
@@ -71,6 +73,7 @@ import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.ArgumentMatchers.anyBoolean;
import static org.mockito.ArgumentMatchers.anyCollection;
import static org.mockito.ArgumentMatchers.anyMap;
import static org.mockito.ArgumentMatchers.anyString;
@@ -123,7 +126,7 @@ class YamlDatabaseConfigurationImportExecutorTest {
when(dataSourceConfigSwapper.swap(any(YamlProxyDataSourceConfiguration.class))).thenReturn(dataSourceConfig);
DataSourcePoolProperties poolProperties =
mock(DataSourcePoolProperties.class, RETURNS_DEEP_STUBS);
when(DataSourcePoolPropertiesCreator.create(dataSourceConfig)).thenReturn(poolProperties);
-
when(StorageUnitNodeMapCreator.create(anyMap())).thenReturn(Collections.singletonMap("foo_ds",
mock(StorageNode.class)));
+ when(StorageUnitNodeMapCreator.create(anyMap(),
anyBoolean())).thenReturn(Collections.singletonMap("foo_ds",
mock(StorageNode.class)));
when(DataSourcePoolCreator.create(poolProperties)).thenReturn(mock(DataSource.class));
when(DatabaseTypeEngine.getProtocolType(anyMap(),
any(ConfigurationProperties.class))).thenReturn(mock(DatabaseType.class));
try (MockedConstruction<StorageUnit> mockedConstruction =
mockConstruction(StorageUnit.class, (mock, context) -> {
@@ -148,7 +151,7 @@ class YamlDatabaseConfigurationImportExecutorTest {
when(dataSourceConfigSwapper.swap(any(YamlProxyDataSourceConfiguration.class))).thenReturn(dataSourceConfig);
DataSourcePoolProperties poolProperties =
mock(DataSourcePoolProperties.class, RETURNS_DEEP_STUBS);
when(DataSourcePoolPropertiesCreator.create(dataSourceConfig)).thenReturn(poolProperties);
-
when(StorageUnitNodeMapCreator.create(anyMap())).thenReturn(Collections.singletonMap("foo_ds",
mock(StorageNode.class)));
+ when(StorageUnitNodeMapCreator.create(anyMap(),
anyBoolean())).thenReturn(Collections.singletonMap("foo_ds",
mock(StorageNode.class)));
when(DataSourcePoolCreator.create(poolProperties)).thenReturn(mock(DataSource.class));
when(DatabaseTypeEngine.getProtocolType(anyMap(),
any(ConfigurationProperties.class))).thenReturn(mock(DatabaseType.class));
try (MockedConstruction<StorageUnit> ignored =
mockConstruction(StorageUnit.class)) {
@@ -172,7 +175,7 @@ class YamlDatabaseConfigurationImportExecutorTest {
when(dataSourceConfigSwapper.swap(any(YamlProxyDataSourceConfiguration.class))).thenReturn(dataSourceConfig);
DataSourcePoolProperties poolProperties =
mock(DataSourcePoolProperties.class, RETURNS_DEEP_STUBS);
when(DataSourcePoolPropertiesCreator.create(dataSourceConfig)).thenReturn(poolProperties);
-
when(StorageUnitNodeMapCreator.create(anyMap())).thenReturn(Collections.singletonMap("foo_ds",
mock(StorageNode.class)));
+ when(StorageUnitNodeMapCreator.create(anyMap(),
anyBoolean())).thenReturn(Collections.singletonMap("foo_ds",
mock(StorageNode.class)));
when(DataSourcePoolCreator.create(poolProperties)).thenReturn(mock(DataSource.class));
when(DatabaseTypeEngine.getProtocolType(anyMap(),
any(ConfigurationProperties.class))).thenReturn(mock(DatabaseType.class));
YamlRuleConfiguration yamlRuleConfig =
mock(YamlRuleConfiguration.class);
@@ -235,9 +238,12 @@ class YamlDatabaseConfigurationImportExecutorTest {
}
private void mockMetaDataContexts(final ShardingSphereDatabase database,
final ConfigurationProperties props) {
- MetaDataContexts metaDataContexts = mock(MetaDataContexts.class,
RETURNS_DEEP_STUBS);
-
when(metaDataContexts.getMetaData().getDatabase("foo_db")).thenReturn(database);
- when(metaDataContexts.getMetaData().getProps()).thenReturn(props);
-
when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
+ MetaDataContexts metaDataContexts = mock(MetaDataContexts.class);
+ ShardingSphereMetaData metaData = mock(ShardingSphereMetaData.class);
+ lenient().when(metaData.getDatabase("foo_db")).thenReturn(database);
+ lenient().when(metaData.getProps()).thenReturn(props);
+ lenient().when(metaData.getTemporaryProps()).thenReturn(new
TemporaryConfigurationProperties(new Properties()));
+ when(metaDataContexts.getMetaData()).thenReturn(metaData);
+
lenient().when(contextManager.getMetaDataContexts()).thenReturn(metaDataContexts);
}
}
diff --git
a/test/e2e/operation/transaction/src/test/resources/env/mysql/global.yaml
b/test/e2e/operation/transaction/src/test/resources/env/mysql/global.yaml
index 0485107a638..f6ce39388d2 100644
--- a/test/e2e/operation/transaction/src/test/resources/env/mysql/global.yaml
+++ b/test/e2e/operation/transaction/src/test/resources/env/mysql/global.yaml
@@ -43,3 +43,4 @@ props:
proxy-frontend-flush-threshold: 128
sql-show: true
proxy-frontend-ssl-enabled: true
+ instance-connection-enabled: true