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/06/30 09:04:05 UTC
[shardingsphere] branch master updated: refactor ContextManager.dropDatabase (#18729)
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 9f883940241 refactor ContextManager.dropDatabase (#18729)
9f883940241 is described below
commit 9f883940241e0046c06555f108a6b78002132aad
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Thu Jun 30 17:03:59 2022 +0800
refactor ContextManager.dropDatabase (#18729)
* Refactor SingleTableDropSchemaMetadataValidatorTest
* Refactor ContextManager
* private ContextManager.alterSchemas
* private ContextManager.alterSchemas
* refactor ContextManager.dropDatabase
---
.../optimizer/context/OptimizerContext.java | 11 ++++++
.../mode/manager/ContextManager.java | 43 +++++++++++-----------
.../mode/manager/ContextManagerTest.java | 24 ++++--------
.../ClusterContextManagerCoordinator.java | 2 +-
.../text/database/DropDatabaseBackendHandler.java | 2 +-
5 files changed, 42 insertions(+), 40 deletions(-)
diff --git a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
index abd6309f279..cd2ad256466 100644
--- a/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
+++ b/shardingsphere-infra/shardingsphere-infra-federation/shardingsphere-infra-federation-optimizer/src/main/java/org/apache/shardingsphere/infra/federation/optimizer/context/OptimizerContext.java
@@ -60,6 +60,17 @@ public final class OptimizerContext {
plannerContexts.put(databaseName, OptimizerPlannerContextFactory.create(federationDatabaseMetaData));
}
+ /**
+ * Drop database.
+ *
+ * @param databaseName database name
+ */
+ public void dropDatabase(final String databaseName) {
+ federationMetaData.getDatabases().remove(databaseName);
+ parserContexts.remove(databaseName);
+ plannerContexts.remove(databaseName);
+ }
+
/**
* Add schema.
*
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 bdde5be8436..45c08f5bbf4 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
@@ -126,6 +126,22 @@ public final class ContextManager implements AutoCloseable {
persistMetaData(metaDataContexts);
}
+ /**
+ * Drop database.
+ *
+ * @param databaseName database name
+ */
+ public void dropDatabase(final String databaseName) {
+ if (!metaDataContexts.getMetaData().getDatabases().containsKey(databaseName)) {
+ return;
+ }
+ ShardingSphereDatabase tobeRemovedDatabase = metaDataContexts.getMetaData().getDatabases().remove(databaseName);
+ closeDataSources(tobeRemovedDatabase);
+ removeAndCloseResource(databaseName, tobeRemovedDatabase);
+ metaDataContexts.getOptimizerContext().dropDatabase(databaseName);
+ metaDataContexts.getPersistService().ifPresent(optional -> optional.getSchemaMetaDataService().deleteDatabase(databaseName));
+ }
+
/**
* Add schema.
*
@@ -190,23 +206,6 @@ public final class ContextManager implements AutoCloseable {
database.getRuleMetaData().getRules().addAll(databaseRules);
}
- /**
- * Delete database.
- *
- * @param databaseName database name
- */
- public void deleteDatabase(final String databaseName) {
- if (metaDataContexts.getMetaData().getDatabases().containsKey(databaseName)) {
- metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases().remove(databaseName);
- metaDataContexts.getOptimizerContext().getParserContexts().remove(databaseName);
- metaDataContexts.getOptimizerContext().getPlannerContexts().remove(databaseName);
- ShardingSphereDatabase removeMetaData = metaDataContexts.getMetaData().getDatabases().remove(databaseName);
- closeDataSources(removeMetaData);
- removeAndCloseResource(databaseName, removeMetaData);
- metaDataContexts.getPersistService().ifPresent(optional -> optional.getSchemaMetaDataService().deleteDatabase(databaseName));
- }
- }
-
/**
* Drop schema.
*
@@ -607,9 +606,9 @@ public final class ContextManager implements AutoCloseable {
return DataSourcePoolCreator.create(getChangedDataSourceConfiguration(originalDatabase, newDataSourcePropsMap));
}
- private void closeDataSources(final ShardingSphereDatabase removeMetaData) {
- if (null != removeMetaData.getResource()) {
- removeMetaData.getResource().getDataSources().values().forEach(each -> removeMetaData.getResource().close(each));
+ private void closeDataSources(final ShardingSphereDatabase toBeRemovedDatabase) {
+ if (null != toBeRemovedDatabase.getResource()) {
+ toBeRemovedDatabase.getResource().getDataSources().values().forEach(each -> toBeRemovedDatabase.getResource().close(each));
}
}
@@ -618,10 +617,10 @@ public final class ContextManager implements AutoCloseable {
dataSources.forEach(resource::close);
}
- private void removeAndCloseResource(final String databaseName, final ShardingSphereDatabase removeMetaData) {
+ private void removeAndCloseResource(final String databaseName, final ShardingSphereDatabase database) {
metaDataContexts.getMetaData().getGlobalRuleMetaData().getRules().stream()
.filter(each -> each instanceof ResourceHeldRule).map(each -> (ResourceHeldRule<?>) each).forEach(each -> each.closeStaleResource(databaseName));
- removeMetaData.getRuleMetaData().getRules().stream()
+ database.getRuleMetaData().getRules().stream()
.filter(each -> each instanceof ResourceHeldRule).map(each -> (ResourceHeldRule<?>) each).forEach(each -> each.closeStaleResource(databaseName));
}
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 05528dd7092..a85d0306278 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
@@ -24,9 +24,6 @@ import org.apache.shardingsphere.infra.database.DefaultDatabase;
import org.apache.shardingsphere.infra.database.type.DatabaseType;
import org.apache.shardingsphere.infra.database.type.dialect.MySQLDatabaseType;
import org.apache.shardingsphere.infra.datasource.props.DataSourceProperties;
-import org.apache.shardingsphere.infra.federation.optimizer.context.parser.OptimizerParserContext;
-import org.apache.shardingsphere.infra.federation.optimizer.context.planner.OptimizerPlannerContext;
-import org.apache.shardingsphere.infra.federation.optimizer.metadata.FederationDatabaseMetaData;
import org.apache.shardingsphere.infra.instance.InstanceContext;
import org.apache.shardingsphere.infra.metadata.database.ShardingSphereDatabase;
import org.apache.shardingsphere.infra.metadata.database.resource.ShardingSphereResource;
@@ -116,6 +113,14 @@ public final class ContextManagerTest {
verify(metaDataContexts.getOptimizerContext(), times(0)).addDatabase(eq("foo_db"), any(DatabaseType.class));
}
+ @Test
+ public void assertDropDatabase() {
+ when(metaDataContexts.getMetaData().getDatabases()).thenReturn(new HashMap<>(Collections.singletonMap("foo_db", mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS))));
+ contextManager.dropDatabase("foo_db");
+ assertFalse(contextManager.getMetaDataContexts().getMetaData().getDatabases().containsKey("foo_db"));
+ verify(metaDataContexts.getOptimizerContext()).dropDatabase("foo_db");
+ }
+
@Test
public void assertAddSchema() {
contextManager.addSchema("foo_db", "bar_schema");
@@ -129,19 +134,6 @@ public final class ContextManagerTest {
verify(metaDataContexts.getOptimizerContext(), times(0)).addSchema("foo_db", "foo_schema");
}
- @Test
- public void assertDeleteDatabase() {
- when(metaDataContexts.getMetaData().getDatabases()).thenReturn(new HashMap<>(Collections.singletonMap("foo_db", mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS))));
- when(metaDataContexts.getOptimizerContext().getFederationMetaData().getDatabases()).thenReturn(new HashMap<>(Collections.singletonMap("foo_db", mock(FederationDatabaseMetaData.class))));
- when(metaDataContexts.getOptimizerContext().getParserContexts()).thenReturn(new HashMap<>(Collections.singletonMap("foo_db", mock(OptimizerParserContext.class))));
- when(metaDataContexts.getOptimizerContext().getPlannerContexts()).thenReturn(new HashMap<>(Collections.singletonMap("foo_db", mock(OptimizerPlannerContext.class))));
- contextManager.deleteDatabase("foo_db");
- assertFalse(contextManager.getMetaDataContexts().getMetaData().getDatabases().containsKey("foo_db"));
- assertFalse(contextManager.getMetaDataContexts().getOptimizerContext().getFederationMetaData().getDatabases().containsKey("foo_db"));
- assertFalse(contextManager.getMetaDataContexts().getOptimizerContext().getParserContexts().containsKey("foo_db"));
- assertFalse(contextManager.getMetaDataContexts().getOptimizerContext().getPlannerContexts().containsKey("foo_db"));
- }
-
@Test
public void assertAddResource() throws SQLException {
ShardingSphereResource resource = mock(ShardingSphereResource.class);
diff --git a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
index dba5ad50b6b..f6d5415a917 100644
--- a/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
+++ b/shardingsphere-mode/shardingsphere-mode-type/shardingsphere-cluster-mode/shardingsphere-cluster-mode-core/src/main/java/org/apache/shardingsphere/mode/manager/cluster/coordinator/ClusterContextManagerCoordinator.java
@@ -100,7 +100,7 @@ public final class ClusterContextManagerCoordinator {
*/
@Subscribe
public synchronized void renew(final DatabaseDeletedEvent event) {
- contextManager.deleteDatabase(event.getDatabaseName());
+ contextManager.dropDatabase(event.getDatabaseName());
}
/**
diff --git a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandler.java b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandler.java
index ffe99c02ae9..4e50582be47 100644
--- a/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandler.java
+++ b/shardingsphere-proxy/shardingsphere-proxy-backend/src/main/java/org/apache/shardingsphere/proxy/backend/text/database/DropDatabaseBackendHandler.java
@@ -51,7 +51,7 @@ public final class DropDatabaseBackendHandler implements TextProtocolBackendHand
if (isDropCurrentDatabase(sqlStatement.getDatabaseName())) {
connectionSession.setCurrentDatabase(null);
}
- ProxyContext.getInstance().getContextManager().deleteDatabase(sqlStatement.getDatabaseName());
+ ProxyContext.getInstance().getContextManager().dropDatabase(sqlStatement.getDatabaseName());
return new UpdateResponseHeader(sqlStatement);
}