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:48:45 UTC

[shardingsphere] branch master updated: Add ShardingSphereMetaData.dropDatabase (#18735)

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 980226a6071 Add ShardingSphereMetaData.dropDatabase (#18735)
980226a6071 is described below

commit 980226a6071ff2b6cfb3aafff99d74594d539aca
Author: Liang Zhang <zh...@apache.org>
AuthorDate: Thu Jun 30 17:48:33 2022 +0800

    Add ShardingSphereMetaData.dropDatabase (#18735)
---
 .../statement/impl/SelectStatementContextTest.java     | 16 ++++++++--------
 .../infra/metadata/ShardingSphereMetaData.java         | 18 ++++++++++++++++++
 .../shardingsphere/mode/manager/ContextManager.java    |  4 +---
 .../mode/manager/ContextManagerTest.java               | 12 +++++++++---
 4 files changed, 36 insertions(+), 14 deletions(-)

diff --git a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/SelectStatementContextTest.java b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/SelectStatementContextTest.java
index 609dd315ed4..8adea321a76 100644
--- a/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/SelectStatementContextTest.java
+++ b/shardingsphere-infra/shardingsphere-infra-binder/src/test/java/org/apache/shardingsphere/infra/binder/statement/impl/SelectStatementContextTest.java
@@ -488,7 +488,7 @@ public final class SelectStatementContextTest {
         assertTrue(new SelectStatementContext(
                 Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class)), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME).isContainsSubquery());
     }
-
+    
     @Test
     public void assertContainsDollarParameterMarkerForMySQL() {
         assertContainsDollarParameterMarker(new MySQLSelectStatement());
@@ -529,32 +529,32 @@ public final class SelectStatementContextTest {
                 Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class)), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
         assertTrue(selectStatementContext.isContainsDollarParameterMarker());
     }
-
+    
     @Test
     public void assertContainsPartialDistinctAggregationForMySQL() {
         assertContainsPartialDistinctAggregation(new MySQLSelectStatement());
     }
-
+    
     @Test
     public void assertContainsPartialDistinctAggregationForOracle() {
         assertContainsPartialDistinctAggregation(new OracleSelectStatement());
     }
-
+    
     @Test
     public void assertContainsPartialDistinctAggregationForPostgreSQL() {
         assertContainsPartialDistinctAggregation(new PostgreSQLSelectStatement());
     }
-
+    
     @Test
     public void assertContainsPartialDistinctAggregationForSQL92() {
         assertContainsPartialDistinctAggregation(new SQL92SelectStatement());
     }
-
+    
     @Test
     public void assertContainsPartialDistinctAggregationForSQLServer() {
         assertContainsPartialDistinctAggregation(new SQLServerSelectStatement());
     }
-
+    
     private void assertContainsPartialDistinctAggregation(final SelectStatement selectStatement) {
         ProjectionsSegment projectionsSegment = new ProjectionsSegment(0, 0);
         projectionsSegment.getProjections().add(new AggregationProjectionSegment(0, 0, AggregationType.COUNT, "(*)"));
@@ -564,7 +564,7 @@ public final class SelectStatementContextTest {
                 Collections.singletonMap(DefaultDatabase.LOGIC_NAME, mock(ShardingSphereDatabase.class)), Collections.emptyList(), selectStatement, DefaultDatabase.LOGIC_NAME);
         assertTrue(selectStatementContext.isContainsPartialDistinctAggregation());
     }
-
+    
     private OrderByItemSegment createOrderByItemSegment(final String type) {
         switch (type) {
             case INDEX_ORDER_BY:
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 3f177ea684e..8b746e6b8c3 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
@@ -61,4 +61,22 @@ public final class ShardingSphereMetaData {
         databases.put(databaseName, database);
         globalRuleMetaData.findRules(ResourceHeldRule.class).forEach(each -> each.addResource(database));
     }
+    
+    /**
+     * Drop database.
+     *
+     * @param databaseName database name
+     */
+    public void dropDatabase(final String databaseName) {
+        closeResources(databases.remove(databaseName));
+    }
+    
+    private void closeResources(final ShardingSphereDatabase database) {
+        if (null != database.getResource()) {
+            database.getResource().getDataSources().values().forEach(each -> database.getResource().close(each));
+        }
+        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-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 45c08f5bbf4..4def6fb484b 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
@@ -135,9 +135,7 @@ public final class ContextManager implements AutoCloseable {
         if (!metaDataContexts.getMetaData().getDatabases().containsKey(databaseName)) {
             return;
         }
-        ShardingSphereDatabase tobeRemovedDatabase = metaDataContexts.getMetaData().getDatabases().remove(databaseName);
-        closeDataSources(tobeRemovedDatabase);
-        removeAndCloseResource(databaseName, tobeRemovedDatabase);
+        metaDataContexts.getMetaData().dropDatabase(databaseName);
         metaDataContexts.getOptimizerContext().dropDatabase(databaseName);
         metaDataContexts.getPersistService().ifPresent(optional -> optional.getSchemaMetaDataService().deleteDatabase(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 a85d0306278..48f5cdfa625 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
@@ -48,7 +48,6 @@ import java.util.Optional;
 import java.util.Properties;
 
 import static org.hamcrest.CoreMatchers.is;
-import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.assertTrue;
@@ -115,12 +114,19 @@ public final class ContextManagerTest {
     
     @Test
     public void assertDropDatabase() {
-        when(metaDataContexts.getMetaData().getDatabases()).thenReturn(new HashMap<>(Collections.singletonMap("foo_db", mock(ShardingSphereDatabase.class, RETURNS_DEEP_STUBS))));
+        when(metaDataContexts.getMetaData().getDatabases().containsKey("foo_db")).thenReturn(true);
         contextManager.dropDatabase("foo_db");
-        assertFalse(contextManager.getMetaDataContexts().getMetaData().getDatabases().containsKey("foo_db"));
+        verify(metaDataContexts.getMetaData()).dropDatabase("foo_db");
         verify(metaDataContexts.getOptimizerContext()).dropDatabase("foo_db");
     }
     
+    @Test
+    public void assertDropNotExistedDatabase() {
+        contextManager.dropDatabase("foo_db");
+        verify(metaDataContexts.getMetaData(), times(0)).dropDatabase("foo_db");
+        verify(metaDataContexts.getOptimizerContext(), times(0)).dropDatabase("foo_db");
+    }
+    
     @Test
     public void assertAddSchema() {
         contextManager.addSchema("foo_db", "bar_schema");