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);
     }