This is an automated email from the ASF dual-hosted git repository.

jianglongtao 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 90e7d183b45 Add ignore broadcast tables when unregister storage unit 
(#28911)
90e7d183b45 is described below

commit 90e7d183b45e3e2f05a782ff57d1155553c2ae45
Author: jiangML <[email protected]>
AuthorDate: Wed Nov 1 14:41:03 2023 +0800

    Add ignore broadcast tables when unregister storage unit (#28911)
    
    * Add ignore broadcast tables when unregister storage unit
    
    * Fix getInUsedStorageUnitNameAndRulesMap error for RuleMetaData
    
    * Optimize KernelDistSQLStatementVisitor
    
    * Optimize RuleMetaData
---
 .../infra/metadata/database/rule/RuleMetaData.java | 20 ++++++++++++++++--
 .../engine/src/main/antlr4/imports/Keyword.g4      |  4 ++++
 .../engine/src/main/antlr4/imports/RDLStatement.g4 |  8 +++++---
 .../core/kernel/KernelDistSQLStatementVisitor.java |  9 ++++++--
 .../rdl/drop/UnregisterStorageUnitStatement.java   |  6 ++++--
 .../unit/UnregisterStorageUnitBackendHandler.java  | 24 ++++++++++++++++++----
 .../UnregisterStorageUnitBackendHandlerTest.java   | 14 ++++++-------
 7 files changed, 65 insertions(+), 20 deletions(-)

diff --git 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/rule/RuleMetaData.java
 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/rule/RuleMetaData.java
index 97a3254e7d4..5d56abca1a0 100644
--- 
a/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/rule/RuleMetaData.java
+++ 
b/infra/common/src/main/java/org/apache/shardingsphere/infra/metadata/database/rule/RuleMetaData.java
@@ -30,6 +30,7 @@ import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
 import java.util.LinkedList;
 import java.util.Map;
+import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.stream.Collectors;
@@ -106,9 +107,9 @@ public final class RuleMetaData {
         Map<String, Collection<Class<? extends ShardingSphereRule>>> result = 
new LinkedHashMap<>();
         for (ShardingSphereRule each : rules) {
             if (each instanceof DataSourceContainedRule) {
-                result.putAll(getInUsedStorageUnitNameAndRulesMap(each, 
getInUsedStorageUnitNames((DataSourceContainedRule) each)));
+                mergeInUsedStorageUnitNameAndRules(result, 
getInUsedStorageUnitNameAndRulesMap(each, 
getInUsedStorageUnitNames((DataSourceContainedRule) each)));
             } else if (each instanceof DataNodeContainedRule) {
-                result.putAll(getInUsedStorageUnitNameAndRulesMap(each, 
getInUsedStorageUnitNames((DataNodeContainedRule) each)));
+                mergeInUsedStorageUnitNameAndRules(result, 
getInUsedStorageUnitNameAndRulesMap(each, 
getInUsedStorageUnitNames((DataNodeContainedRule) each)));
             }
         }
         return result;
@@ -132,4 +133,19 @@ public final class RuleMetaData {
     private Collection<String> getInUsedStorageUnitNames(final 
DataNodeContainedRule rule) {
         return rule.getAllDataNodes().values().stream().flatMap(each -> 
each.stream().map(DataNode::getDataSourceName).collect(Collectors.toSet()).stream()).collect(Collectors.toSet());
     }
+    
+    private void mergeInUsedStorageUnitNameAndRules(final Map<String, 
Collection<Class<? extends ShardingSphereRule>>> storageUnitNameAndRules,
+                                                    final Map<String, 
Collection<Class<? extends ShardingSphereRule>>> 
toBeMergedStorageUnitNameAndRules) {
+        for (Entry<String, Collection<Class<? extends ShardingSphereRule>>> 
entry : toBeMergedStorageUnitNameAndRules.entrySet()) {
+            if (storageUnitNameAndRules.containsKey(entry.getKey())) {
+                for (Class<? extends ShardingSphereRule> each : 
entry.getValue()) {
+                    if 
(!storageUnitNameAndRules.get(entry.getKey()).contains(each)) {
+                        storageUnitNameAndRules.get(entry.getKey()).add(each);
+                    }
+                }
+            } else {
+                storageUnitNameAndRules.put(entry.getKey(), entry.getValue());
+            }
+        }
+    }
 }
diff --git a/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4 
b/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4
index b81678cff3c..7030a001d3d 100644
--- a/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4
+++ b/parser/distsql/engine/src/main/antlr4/imports/Keyword.g4
@@ -342,3 +342,7 @@ CLUSTER
 LOCK_STRATEGY
     : L O C K UL_ S T R A T E G Y
     ;
+
+BROADCAST
+    : B R O A D C A S T
+    ;
diff --git a/parser/distsql/engine/src/main/antlr4/imports/RDLStatement.g4 
b/parser/distsql/engine/src/main/antlr4/imports/RDLStatement.g4
index 7e4f56acde3..418dd843b7c 100644
--- a/parser/distsql/engine/src/main/antlr4/imports/RDLStatement.g4
+++ b/parser/distsql/engine/src/main/antlr4/imports/RDLStatement.g4
@@ -28,7 +28,7 @@ alterStorageUnit
     ;
 
 unregisterStorageUnit
-    : UNREGISTER STORAGE UNIT ifExists? storageUnitName (COMMA_ 
storageUnitName)* ignoreSingleTables?
+    : UNREGISTER STORAGE UNIT ifExists? storageUnitName (COMMA_ 
storageUnitName)* ignoreTables?
     ;
 
 storageUnitDefinition
@@ -67,8 +67,10 @@ password
     : STRING_
     ;
 
-ignoreSingleTables
-    : IGNORE SINGLE TABLES
+ignoreTables
+    : IGNORE (SINGLE COMMA_ BROADCAST | BROADCAST COMMA_ SINGLE) TABLES # 
ignoreSingleAndBroadcastTables
+    | IGNORE SINGLE TABLES # ignoreSingleTables
+    | IGNORE BROADCAST TABLES # ignoreBroadcastTables
     ;
 
 ifExists
diff --git 
a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
 
b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
index b32716805ff..d0e2f69f7e0 100644
--- 
a/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
+++ 
b/parser/distsql/engine/src/main/java/org/apache/shardingsphere/distsql/parser/core/kernel/KernelDistSQLStatementVisitor.java
@@ -32,6 +32,9 @@ import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementPa
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ExportMetaDataContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ExportStorageNodesContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.FromSegmentContext;
+import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.IgnoreBroadcastTablesContext;
+import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.IgnoreSingleAndBroadcastTablesContext;
+import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.IgnoreSingleTablesContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ImportDatabaseConfigurationContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.ImportMetaDataContext;
 import 
org.apache.shardingsphere.distsql.parser.autogen.KernelDistSQLStatementParser.InstanceIdContext;
@@ -206,9 +209,11 @@ public final class KernelDistSQLStatementVisitor extends 
KernelDistSQLStatementB
     
     @Override
     public ASTNode visitUnregisterStorageUnit(final 
UnregisterStorageUnitContext ctx) {
-        boolean ignoreSingleTables = null != ctx.ignoreSingleTables();
+        boolean ignoreSingleTables = ctx.ignoreTables() instanceof 
IgnoreSingleAndBroadcastTablesContext || ctx.ignoreTables() instanceof 
IgnoreSingleTablesContext;
+        boolean ignoreBroadcastTables = ctx.ignoreTables() instanceof 
IgnoreSingleAndBroadcastTablesContext || ctx.ignoreTables() instanceof 
IgnoreBroadcastTablesContext;
         return new UnregisterStorageUnitStatement(null != ctx.ifExists(),
-                
ctx.storageUnitName().stream().map(ParseTree::getText).map(each -> new 
IdentifierValue(each).getValue()).collect(Collectors.toList()), 
ignoreSingleTables);
+                
ctx.storageUnitName().stream().map(ParseTree::getText).map(each -> new 
IdentifierValue(each).getValue()).collect(Collectors.toList()),
+                ignoreSingleTables, ignoreBroadcastTables);
     }
     
     @Override
diff --git 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rdl/drop/UnregisterStorageUnitStatement.java
 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rdl/drop/UnregisterStorageUnitStatement.java
index 87f6a6a2dbd..d514f58e675 100644
--- 
a/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rdl/drop/UnregisterStorageUnitStatement.java
+++ 
b/parser/distsql/statement/src/main/java/org/apache/shardingsphere/distsql/statement/rdl/drop/UnregisterStorageUnitStatement.java
@@ -36,7 +36,9 @@ public final class UnregisterStorageUnitStatement extends 
StorageUnitDefinitionS
     
     private final boolean ignoreSingleTables;
     
-    public UnregisterStorageUnitStatement(final Collection<String> 
storageUnitNames, final boolean ignoreSingleTables) {
-        this(false, storageUnitNames, ignoreSingleTables);
+    private final boolean ignoreBroadcastTables;
+    
+    public UnregisterStorageUnitStatement(final Collection<String> 
storageUnitNames, final boolean ignoreSingleTables, final boolean 
ignoreBroadcastTables) {
+        this(false, storageUnitNames, ignoreSingleTables, 
ignoreBroadcastTables);
     }
 }
diff --git 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandler.java
 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandler.java
index 860aaae2471..975b50abaa8 100644
--- 
a/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandler.java
+++ 
b/proxy/backend/core/src/main/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandler.java
@@ -18,6 +18,7 @@
 package 
org.apache.shardingsphere.proxy.backend.handler.distsql.rdl.storage.unit;
 
 import lombok.extern.slf4j.Slf4j;
+import org.apache.shardingsphere.broadcast.rule.BroadcastRule;
 import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.InvalidStorageUnitsException;
 import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.MissingRequiredStorageUnitsException;
 import 
org.apache.shardingsphere.distsql.handler.exception.storageunit.StorageUnitInUsedException;
@@ -37,6 +38,7 @@ import java.sql.SQLException;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.Map;
 import java.util.stream.Collectors;
 
@@ -82,8 +84,9 @@ public final class UnregisterStorageUnitBackendHandler 
extends StorageUnitDefini
         Collection<String> inUsedStorageUnitNames = 
inUsedStorageUnits.keySet();
         inUsedStorageUnitNames.retainAll(sqlStatement.getStorageUnitNames());
         if (!inUsedStorageUnitNames.isEmpty()) {
-            if (sqlStatement.isIgnoreSingleTables()) {
-                checkInUsedIgnoreSingleTables(new 
HashSet<>(inUsedStorageUnitNames), inUsedStorageUnits);
+            Collection<Class<? extends ShardingSphereRule>> 
ignoreShardingSphereRules = getIgnoreShardingSphereRules(sqlStatement);
+            if (!ignoreShardingSphereRules.isEmpty()) {
+                checkInUsedIgnoreTables(new HashSet<>(inUsedStorageUnitNames), 
inUsedStorageUnits, ignoreShardingSphereRules);
             } else {
                 String firstResource = 
inUsedStorageUnitNames.iterator().next();
                 throw new StorageUnitInUsedException(firstResource, 
inUsedStorageUnits.get(firstResource));
@@ -91,10 +94,23 @@ public final class UnregisterStorageUnitBackendHandler 
extends StorageUnitDefini
         }
     }
     
-    private void checkInUsedIgnoreSingleTables(final Collection<String> 
inUsedResourceNames, final Map<String, Collection<Class<? extends 
ShardingSphereRule>>> inUsedStorageUnits) {
+    private Collection<Class<? extends ShardingSphereRule>> 
getIgnoreShardingSphereRules(final UnregisterStorageUnitStatement sqlStatement) 
{
+        Collection<Class<? extends ShardingSphereRule>> result = new 
LinkedList<>();
+        if (sqlStatement.isIgnoreSingleTables()) {
+            result.add(SingleRule.class);
+        }
+        if (sqlStatement.isIgnoreBroadcastTables()) {
+            result.add(BroadcastRule.class);
+        }
+        return result;
+    }
+    
+    private void checkInUsedIgnoreTables(final Collection<String> 
inUsedResourceNames,
+                                         final Map<String, Collection<Class<? 
extends ShardingSphereRule>>> inUsedStorageUnits,
+                                         final Collection<Class<? extends 
ShardingSphereRule>> ignoreShardingSphereRules) {
         for (String each : inUsedResourceNames) {
             Collection<Class<? extends ShardingSphereRule>> inUsedRules = 
inUsedStorageUnits.get(each);
-            inUsedRules.remove(SingleRule.class);
+            ignoreShardingSphereRules.forEach(inUsedRules::remove);
             ShardingSpherePreconditions.checkState(inUsedRules.isEmpty(), () 
-> new StorageUnitInUsedException(each, inUsedRules));
         }
     }
diff --git 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandlerTest.java
 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandlerTest.java
index 9d67cb792ec..15c93a1c0fd 100644
--- 
a/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandlerTest.java
+++ 
b/proxy/backend/core/src/test/java/org/apache/shardingsphere/proxy/backend/handler/distsql/rdl/storage/unit/UnregisterStorageUnitBackendHandlerTest.java
@@ -111,7 +111,7 @@ class UnregisterStorageUnitBackendHandlerTest {
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         
when(database.getRuleMetaData().getInUsedStorageUnitNameAndRulesMap()).thenReturn(Collections.emptyMap());
         
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
-        UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false);
+        UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false, false);
         assertThat(handler.execute("foo_db", unregisterStorageUnitStatement), 
instanceOf(UpdateResponseHeader.class));
         verify(modeContextManager).unregisterStorageUnits("foo_db", 
unregisterStorageUnitStatement.getStorageUnitNames());
     }
@@ -119,7 +119,7 @@ class UnregisterStorageUnitBackendHandlerTest {
     @Test
     void assertStorageUnitNameNotExistedExecute() {
         
when(ProxyContext.getInstance().getDatabase("foo_db").getResourceMetaData().getStorageUnits()).thenReturn(Collections.emptyMap());
-        assertThrows(MissingRequiredStorageUnitsException.class, () -> 
handler.execute("foo_db", new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false)));
+        assertThrows(MissingRequiredStorageUnitsException.class, () -> 
handler.execute("foo_db", new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false, false)));
     }
     
     @Test
@@ -132,7 +132,7 @@ class UnregisterStorageUnitBackendHandlerTest {
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
         assertThrows(StorageUnitInUsedException.class,
-                () -> handler.execute("foo_db", new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false)));
+                () -> handler.execute("foo_db", new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false, false)));
     }
     
     @Test
@@ -146,7 +146,7 @@ class UnregisterStorageUnitBackendHandlerTest {
         
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("foo_ds",
 storageUnit));
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
-        assertThrows(StorageUnitInUsedException.class, () -> 
handler.execute("foo_db", new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false)));
+        assertThrows(StorageUnitInUsedException.class, () -> 
handler.execute("foo_db", new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), false, false)));
     }
     
     @Test
@@ -160,14 +160,14 @@ class UnregisterStorageUnitBackendHandlerTest {
         
when(resourceMetaData.getStorageUnits()).thenReturn(Collections.singletonMap("foo_ds",
 storageUnit));
         when(database.getResourceMetaData()).thenReturn(resourceMetaData);
         
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
-        UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), true);
+        UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(Collections.singleton("foo_ds"), true, false);
         assertThat(handler.execute("foo_db", unregisterStorageUnitStatement), 
instanceOf(UpdateResponseHeader.class));
         verify(modeContextManager).unregisterStorageUnits("foo_db", 
unregisterStorageUnitStatement.getStorageUnitNames());
     }
     
     @Test
     void assertExecuteWithIfExists() throws SQLException {
-        UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(true, Collections.singleton("foo_ds"), true);
+        UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(true, Collections.singleton("foo_ds"), true, 
false);
         assertThat(handler.execute("foo_db", unregisterStorageUnitStatement), 
instanceOf(UpdateResponseHeader.class));
         verify(modeContextManager).unregisterStorageUnits("foo_db", 
unregisterStorageUnitStatement.getStorageUnitNames());
     }
@@ -177,7 +177,7 @@ class UnregisterStorageUnitBackendHandlerTest {
         when(database.getRuleMetaData()).thenReturn(new 
RuleMetaData(Collections.singleton(shadowRule)));
         
when(shadowRule.getDataSourceMapper()).thenReturn(Collections.singletonMap("", 
Collections.singleton("foo_ds")));
         
when(contextManager.getMetaDataContexts().getMetaData().getDatabase("foo_db")).thenReturn(database);
-        UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(true, Collections.singleton("foo_ds"), true);
+        UnregisterStorageUnitStatement unregisterStorageUnitStatement = new 
UnregisterStorageUnitStatement(true, Collections.singleton("foo_ds"), true, 
false);
         assertThrows(DistSQLException.class, () -> handler.execute("foo_db", 
unregisterStorageUnitStatement));
     }
 }

Reply via email to