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 <[email protected]>
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);
     }
     

Reply via email to