You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@shardingsphere.apache.org by du...@apache.org on 2022/07/21 09:46:07 UTC
[shardingsphere] branch master updated: Add getActualDatabaseName method (#19412)
This is an automated email from the ASF dual-hosted git repository.
duanzhengqiang 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 41b3fe631e3 Add getActualDatabaseName method (#19412)
41b3fe631e3 is described below
commit 41b3fe631e3a037c03eb57d054239342b01d9a93
Author: zhaojinchao <zh...@apache.org>
AuthorDate: Thu Jul 21 17:46:00 2022 +0800
Add getActualDatabaseName method (#19412)
* Add getActualDatabaseName method
* Fix unit test
* Add put database method
* Adjustment
* Fix unit test
---
.../infra/metadata/ShardingSphereMetaData.java | 23 +++++++++++++++++--
.../jdbc/core/connection/ConnectionManager.java | 7 +++---
.../mode/manager/ContextManager.java | 26 ++++++++++++----------
.../mode/manager/ContextManagerTest.java | 4 ++++
.../cluster/ClusterContextManagerBuilder.java | 4 ++--
.../ImportDatabaseConfigurationHandler.java | 2 +-
.../rdl/rule/RuleDefinitionBackendHandler.java | 4 +++-
7 files changed, 49 insertions(+), 21 deletions(-)
diff --git a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
index b7af6267c3b..ba4fbf27c7d 100644
--- a/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
+++ b/shardingsphere-infra/shardingsphere-infra-common/src/main/java/org/apache/shardingsphere/infra/metadata/ShardingSphereMetaData.java
@@ -63,7 +63,7 @@ public final class ShardingSphereMetaData {
*/
public void addDatabase(final String databaseName, final DatabaseType protocolType) throws SQLException {
ShardingSphereDatabase database = ShardingSphereDatabase.create(databaseName, protocolType);
- databases.put(databaseName.toLowerCase(), database);
+ putDatabase(database);
globalRuleMetaData.findRules(ResourceHeldRule.class).forEach(each -> each.addResource(database));
}
@@ -87,6 +87,25 @@ public final class ShardingSphereMetaData {
return databases.get(databaseName.toLowerCase());
}
+ /**
+ * Put database.
+ *
+ * @param database database
+ */
+ public void putDatabase(final ShardingSphereDatabase database) {
+ databases.put(database.getName().toLowerCase(), database);
+ }
+
+ /**
+ * Get actual database name.
+ *
+ * @param databaseName database name
+ * @return actual database name
+ */
+ public String getActualDatabaseName(final String databaseName) {
+ return getDatabase(databaseName).getName();
+ }
+
/**
* Drop database.
*
@@ -100,7 +119,7 @@ public final class ShardingSphereMetaData {
if (null != database.getResource()) {
database.getResource().getDataSources().values().forEach(each -> database.getResource().close(each));
}
- String databaseName = database.getName().toLowerCase();
+ String databaseName = database.getName();
globalRuleMetaData.findRules(ResourceHeldRule.class).forEach(each -> each.closeStaleResource(databaseName));
database.getRuleMetaData().findRules(ResourceHeldRule.class).forEach(each -> each.closeStaleResource(databaseName));
}
diff --git a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java
index 57edc56814e..71e7cf1a814 100644
--- a/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java
+++ b/shardingsphere-jdbc/shardingsphere-jdbc-core/src/main/java/org/apache/shardingsphere/driver/jdbc/core/connection/ConnectionManager.java
@@ -83,18 +83,19 @@ public final class ConnectionManager implements ExecutorJDBCConnectionManager, A
connectionTransaction = createConnectionTransaction(databaseName, contextManager);
}
- private Map<String, DataSource> getTrafficDataSourceMap(final String schema, final ContextManager contextManager) {
+ private Map<String, DataSource> getTrafficDataSourceMap(final String databaseName, final ContextManager contextManager) {
TrafficRule trafficRule = contextManager.getMetaDataContexts().getMetaData().getGlobalRuleMetaData().getSingleRule(TrafficRule.class);
MetaDataPersistService persistService = contextManager.getMetaDataContexts().getPersistService();
if (trafficRule.getStrategyRules().isEmpty()) {
return Collections.emptyMap();
}
- Map<String, DataSourceProperties> dataSourcePropsMap = persistService.getDataSourceService().load(schema);
+ String actualDatabaseName = contextManager.getMetaDataContexts().getMetaData().getActualDatabaseName(databaseName);
+ Map<String, DataSourceProperties> dataSourcePropsMap = persistService.getDataSourceService().load(actualDatabaseName);
Preconditions.checkState(!dataSourcePropsMap.isEmpty(), "Can not get data source properties from meta data.");
DataSourceProperties dataSourcePropsSample = dataSourcePropsMap.values().iterator().next();
Collection<ShardingSphereUser> users = persistService.getGlobalRuleService().loadUsers();
Collection<InstanceMetaData> instances = contextManager.getInstanceContext().getAllClusterInstances(InstanceType.PROXY, trafficRule.getLabels());
- return DataSourcePoolCreator.create(createDataSourcePropertiesMap(instances, users, dataSourcePropsSample, schema));
+ return DataSourcePoolCreator.create(createDataSourcePropertiesMap(instances, users, dataSourcePropsSample, actualDatabaseName));
}
private Map<String, DataSourceProperties> createDataSourcePropertiesMap(final Collection<InstanceMetaData> instances, final Collection<ShardingSphereUser> users,
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
index bb9007529ef..e486bb9bc70 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/ContextManager.java
@@ -122,9 +122,10 @@ public final class ContextManager implements AutoCloseable {
if (!metaDataContexts.getMetaData().containsDatabase(databaseName)) {
return;
}
- metaDataContexts.getMetaData().dropDatabase(databaseName);
- metaDataContexts.getOptimizerContext().dropDatabase(databaseName);
- metaDataContexts.getPersistService().getDatabaseMetaDataService().deleteDatabase(databaseName);
+ String actualDatabaseName = metaDataContexts.getMetaData().getActualDatabaseName(databaseName);
+ metaDataContexts.getMetaData().dropDatabase(actualDatabaseName);
+ metaDataContexts.getOptimizerContext().dropDatabase(actualDatabaseName);
+ metaDataContexts.getPersistService().getDatabaseMetaDataService().deleteDatabase(actualDatabaseName);
}
/**
@@ -219,7 +220,7 @@ public final class ContextManager implements AutoCloseable {
metaDataContexts.getMetaData().getGlobalRuleMetaData().findRules(ResourceHeldRule.class).forEach(each -> each.addResource(metaDataContexts.getMetaData().getDatabase(databaseName)));
metaDataContexts.getOptimizerContext().alterDatabase(metaDataContexts.getMetaData().getDatabase(databaseName), metaDataContexts.getMetaData().getGlobalRuleMetaData());
persistMetaData(metaDataContexts);
- metaDataContexts.getPersistService().getDataSourceService().append(databaseName, toBeUpdatedDataSourcePropsMap);
+ metaDataContexts.getPersistService().getDataSourceService().append(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), toBeUpdatedDataSourcePropsMap);
switchingResource.closeStaleDataSources();
}
@@ -235,7 +236,7 @@ public final class ContextManager implements AutoCloseable {
for (String each : toBeDroppedResourceNames) {
dataSourceMap.remove(each);
}
- metaDataContexts.getPersistService().getDataSourceService().drop(databaseName, toBeDroppedResourceNames);
+ metaDataContexts.getPersistService().getDataSourceService().drop(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), toBeDroppedResourceNames);
}
/**
@@ -323,9 +324,10 @@ public final class ContextManager implements AutoCloseable {
? metaDataContexts.getMetaData().getDatabase(databaseName).getRuleMetaData().getConfigurations()
: ruleConfigs;
DatabaseConfiguration toBeCreatedDatabaseConfig = new DataSourceProvidedDatabaseConfiguration(toBeCreatedDataSources, toBeCreatedRuleConfigs);
- ShardingSphereDatabase changedDatabase = ShardingSphereDatabasesFactory.create(databaseName, toBeCreatedDatabaseConfig, metaDataContexts.getMetaData().getProps(), instanceContext);
+ ShardingSphereDatabase changedDatabase = ShardingSphereDatabasesFactory.create(metaDataContexts.getMetaData().getActualDatabaseName(databaseName),
+ toBeCreatedDatabaseConfig, metaDataContexts.getMetaData().getProps(), instanceContext);
Map<String, ShardingSphereDatabase> result = new LinkedHashMap<>(metaDataContexts.getMetaData().getDatabases());
- result.put(databaseName, changedDatabase);
+ result.put(databaseName.toLowerCase(), changedDatabase);
return result;
}
@@ -388,8 +390,8 @@ public final class ContextManager implements AutoCloseable {
}
private void persistMetaData(final MetaDataContexts metaDataContexts) {
- metaDataContexts.getMetaData().getDatabases().forEach((databaseName, schemas) -> schemas.getSchemas()
- .forEach((schemaName, tables) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().persistMetaData(databaseName, schemaName, tables)));
+ metaDataContexts.getMetaData().getDatabases().values().forEach(each -> each.getSchemas().forEach((schemaName, tables) ->
+ metaDataContexts.getPersistService().getDatabaseMetaDataService().persistMetaData(each.getName(), schemaName, tables)));
}
/**
@@ -404,10 +406,10 @@ public final class ContextManager implements AutoCloseable {
ShardingSphereSchema reloadedSchema = loadSchema(databaseName, schemaName, dataSourceName);
if (null == reloadedSchema) {
metaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().remove(schemaName);
- metaDataContexts.getPersistService().getDatabaseMetaDataService().deleteSchema(databaseName, schemaName);
+ metaDataContexts.getPersistService().getDatabaseMetaDataService().deleteSchema(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), schemaName);
} else {
metaDataContexts.getMetaData().getDatabase(databaseName).getSchemas().put(schemaName, reloadedSchema);
- metaDataContexts.getPersistService().getDatabaseMetaDataService().persistMetaData(databaseName, schemaName, reloadedSchema);
+ metaDataContexts.getPersistService().getDatabaseMetaDataService().persistMetaData(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), schemaName, reloadedSchema);
}
} catch (final SQLException ex) {
log.error("Reload meta data of database: {} schema: {} with data source: {} failed", databaseName, schemaName, dataSourceName, ex);
@@ -464,7 +466,7 @@ public final class ContextManager implements AutoCloseable {
ShardingSphereSchema schema = GenericSchemaBuilder.build(Collections.singletonList(tableName), materials).getOrDefault(schemaName, new ShardingSphereSchema());
if (schema.containsTable(tableName)) {
database.getSchemas().get(schemaName).put(tableName, schema.get(tableName));
- metaDataContexts.getPersistService().getDatabaseMetaDataService().persistMetaData(databaseName, schemaName, database.getSchemas().get(schemaName));
+ metaDataContexts.getPersistService().getDatabaseMetaDataService().persistMetaData(database.getName(), schemaName, database.getSchemas().get(schemaName));
}
}
diff --git a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
index 7de5b55c53f..37c3cc281f8 100644
--- a/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
+++ b/shardingsphere-mode/shardingsphere-mode-core/src/test/java/org/apache/shardingsphere/mode/manager/ContextManagerTest.java
@@ -129,6 +129,7 @@ public final class ContextManagerTest {
@Test
public void assertDropDatabase() {
+ when(metaDataContexts.getMetaData().getActualDatabaseName("foo_db")).thenReturn("foo_db");
when(metaDataContexts.getMetaData().containsDatabase("foo_db")).thenReturn(true);
contextManager.dropDatabase("foo_db");
verify(metaDataContexts.getMetaData()).dropDatabase("foo_db");
@@ -222,6 +223,7 @@ public final class ContextManagerTest {
when(metaDataContexts.getMetaData().getDatabases()).thenReturn(databases);
when(metaDataContexts.getMetaData().getGlobalRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.emptyList()));
when(metaDataContexts.getPersistService()).thenReturn(mock(MetaDataPersistService.class, RETURNS_DEEP_STUBS));
+ when(metaDataContexts.getMetaData().getActualDatabaseName("foo_db")).thenReturn("foo_db");
// TODO TransactionRule is global rule, do not use it in database rule test
RuleConfiguration ruleConfig = new TransactionRuleConfiguration("LOCAL", null, new Properties());
contextManager.alterRuleConfiguration("foo_db", Collections.singleton(ruleConfig));
@@ -234,6 +236,7 @@ public final class ContextManagerTest {
ShardingSphereDatabase originalDatabaseMetaData = new ShardingSphereDatabase(
"foo_db", new MySQLDatabaseType(), createOriginalResource(), createOriginalRuleMetaData(), Collections.emptyMap());
when(metaDataContexts.getMetaData().getDatabase("foo_db")).thenReturn(originalDatabaseMetaData);
+ when(metaDataContexts.getMetaData().getActualDatabaseName("foo_db")).thenReturn("foo_db");
when(metaDataContexts.getMetaData().getGlobalRuleMetaData()).thenReturn(new ShardingSphereRuleMetaData(Collections.emptyList()));
contextManager.alterDataSourceConfiguration("foo_db", Collections.singletonMap("foo_ds", new DataSourceProperties(MockedDataSource.class.getName(), createProperties("test", "test"))));
assertThat(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db").getResource().getDataSources().size(), is(1));
@@ -273,6 +276,7 @@ public final class ContextManagerTest {
@Test
public void assertReloadDatabase() {
when(metaDataContexts.getMetaData().getDatabase("foo_db").getResource().getDataSources()).thenReturn(Collections.singletonMap("foo_ds", new MockedDataSource()));
+ when(metaDataContexts.getMetaData().getActualDatabaseName("foo_db")).thenReturn("foo_db");
DatabaseMetaDataPersistService databaseMetaDataPersistService = mock(DatabaseMetaDataPersistService.class, RETURNS_DEEP_STUBS);
MetaDataPersistService persistService = mock(MetaDataPersistService.class);
when(persistService.getDatabaseMetaDataService()).thenReturn(databaseMetaDataPersistService);
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
index 9277ee313db..43c102b3d7a 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/ClusterContextManagerBuilder.java
@@ -70,8 +70,8 @@ public final class ClusterContextManagerBuilder implements ContextManagerBuilder
}
private void persistMetaData(final MetaDataContexts metaDataContexts) {
- metaDataContexts.getMetaData().getDatabases().forEach((databaseName, schemas) -> schemas.getSchemas()
- .forEach((schemaName, tables) -> metaDataContexts.getPersistService().getDatabaseMetaDataService().persistMetaData(databaseName, schemaName, tables)));
+ metaDataContexts.getMetaData().getDatabases().values().forEach(each -> each.getSchemas().forEach((schemaName, tables) ->
+ metaDataContexts.getPersistService().getDatabaseMetaDataService().persistMetaData(each.getName(), schemaName, tables)));
}
private void registerOnline(final MetaDataPersistService persistService, final RegistryCenter registryCenter,
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/updatable/ImportDatabaseConfigurationHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/updatable/ImportDatabaseConfigurationHandler.java
index 12b8512bab4..5c45dc49e03 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/updatable/ImportDatabaseConfigurationHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/ral/updatable/ImportDatabaseConfigurationHandler.java
@@ -171,6 +171,6 @@ public final class ImportDatabaseConfigurationHandler extends UpdatableRALBacken
}
database.getRuleMetaData().getConfigurations().addAll(ruleConfigs);
ProxyContext.getInstance().getContextManager().renewMetaDataContexts(metaDataContexts);
- metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(databaseName, ruleConfigs);
+ metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), ruleConfigs);
}
}
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/rule/RuleDefinitionBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/rule/RuleDefinitionBackendHandler.java
index 1933a4a1510..1c136c9c475 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/rule/RuleDefinitionBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/distsql/rdl/rule/RuleDefinitionBackendHandler.java
@@ -31,6 +31,7 @@ import org.apache.shardingsphere.infra.distsql.update.RuleDefinitionUpdater;
import org.apache.shardingsphere.infra.distsql.update.RuleDefinitionUpdaterFactory;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.mode.manager.cluster.coordinator.registry.config.event.version.MetadataVersionPreparedEvent;
+import org.apache.shardingsphere.mode.metadata.MetaDataContexts;
import org.apache.shardingsphere.mode.metadata.persist.MetaDataPersistService;
import org.apache.shardingsphere.proxy.backend.context.ProxyContext;
import org.apache.shardingsphere.proxy.backend.response.header.ResponseHeader;
@@ -168,7 +169,8 @@ public final class RuleDefinitionBackendHandler<T extends RuleDefinitionStatemen
}
private void persistRuleConfigurationChange(final String databaseName, final Collection<RuleConfiguration> alteredConfigs) {
- ProxyContext.getInstance().getContextManager().getMetaDataContexts().getPersistService().getDatabaseRulePersistService().persist(databaseName, alteredConfigs);
+ MetaDataContexts metaDataContexts = ProxyContext.getInstance().getContextManager().getMetaDataContexts();
+ metaDataContexts.getPersistService().getDatabaseRulePersistService().persist(metaDataContexts.getMetaData().getActualDatabaseName(databaseName), alteredConfigs);
}
private RuleConfiguration getAlteredRuleConfig(final T sqlStatement, final RuleDefinitionAlterUpdater updater,