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

jt2594838 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/iotdb.git


The following commit(s) were added to refs/heads/master by this push:
     new 45a78ca18e1 Avoid empty pipe metadata sync on retained subscription 
unsubscribe (#19055)
45a78ca18e1 is described below

commit 45a78ca18e1198779ef4fe2b212aa84ce3dba624
Author: Caideyipi <[email protected]>
AuthorDate: Fri Oct 30 10:28:08 2026 +0800

    Avoid empty pipe metadata sync on retained subscription unsubscribe (#19055)
    
    * Fix subscription unsubscribe pipe metadata sync
    
    * Strengthen unsubscribe pipe metadata regression test
---
 .../subscription/DropSubscriptionProcedure.java    | 32 ++++++++++++----------
 .../DropSubscriptionProcedureTest.java             | 19 +++++++++++++
 2 files changed, 36 insertions(+), 15 deletions(-)

diff --git 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/subscription/subscription/DropSubscriptionProcedure.java
 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/subscription/subscription/DropSubscriptionProcedure.java
index a2b2b443331..f2ff6b7301b 100644
--- 
a/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/subscription/subscription/DropSubscriptionProcedure.java
+++ 
b/iotdb-core/confignode/src/main/java/org/apache/iotdb/confignode/procedure/impl/subscription/subscription/DropSubscriptionProcedure.java
@@ -188,21 +188,23 @@ public class DropSubscriptionProcedure extends 
AbstractOperateSubscriptionAndPip
       throws SubscriptionException, IOException {
     
LOGGER.info(ProcedureMessages.DROPSUBSCRIPTIONPROCEDURE_EXECUTEFROMOPERATEONDATANODES);
 
-    // Push pipe meta to data nodes
-    final String exceptionMessage =
-        AbstractOperatePipeProcedureV2.parsePushPipeMetaExceptionForPipe(
-            null, dropMultiPipeOnDataNodes(dropPipeProcedures, env));
-    if (!exceptionMessage.isEmpty()) {
-      // throw exception instead of logging warn, do not rely on metadata 
synchronization
-      throw new SubscriptionException(
-          String.format(
-              ProcedureMessages
-                  
.FAILED_TO_DROP_PIPES_WHEN_DROPPING_SUBSCRIPTION_WITH_REQUEST_BECAUSE,
-              dropPipeProcedures.stream()
-                  .map(DropPipeProcedureV2::getPipeName)
-                  .collect(Collectors.toList()),
-              unsubscribeReq,
-              exceptionMessage));
+    if (!dropPipeProcedures.isEmpty()) {
+      // An empty Pipe metadata batch triggers full reconciliation and drops 
every local Pipe.
+      final String exceptionMessage =
+          AbstractOperatePipeProcedureV2.parsePushPipeMetaExceptionForPipe(
+              null, dropMultiPipeOnDataNodes(dropPipeProcedures, env));
+      if (!exceptionMessage.isEmpty()) {
+        // throw exception instead of logging warn, do not rely on metadata 
synchronization
+        throw new SubscriptionException(
+            String.format(
+                ProcedureMessages
+                    
.FAILED_TO_DROP_PIPES_WHEN_DROPPING_SUBSCRIPTION_WITH_REQUEST_BECAUSE,
+                dropPipeProcedures.stream()
+                    .map(DropPipeProcedureV2::getPipeName)
+                    .collect(Collectors.toList()),
+                unsubscribeReq,
+                exceptionMessage));
+      }
     }
 
     // Push consumer group meta to data nodes
diff --git 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/subscription/subscription/DropSubscriptionProcedureTest.java
 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/subscription/subscription/DropSubscriptionProcedureTest.java
index c00a7ed5f46..3dea42d1e82 100644
--- 
a/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/subscription/subscription/DropSubscriptionProcedureTest.java
+++ 
b/iotdb-core/confignode/src/test/java/org/apache/iotdb/confignode/procedure/impl/subscription/subscription/DropSubscriptionProcedureTest.java
@@ -130,6 +130,25 @@ public class DropSubscriptionProcedureTest {
     }
   }
 
+  @Test
+  public void executeFromOperateOnDataNodesShouldSkipEmptyPipeMetaSync() 
throws Exception {
+    final DropSubscriptionProcedure procedure =
+        new DropSubscriptionProcedure(
+            new TUnsubscribeReq("old_consumer", "test_consumer_group", 
Collections.emptySet()));
+    final AlterConsumerGroupProcedure alterConsumerGroupProcedure =
+        Mockito.mock(AlterConsumerGroupProcedure.class);
+    procedure.setAlterConsumerGroupProcedure(alterConsumerGroupProcedure);
+    procedure.setDropPipeProcedures(Collections.emptyList());
+
+    final ConfigNodeProcedureEnv env = 
Mockito.mock(ConfigNodeProcedureEnv.class);
+
+    procedure.executeFromOperateOnDataNodes(env);
+
+    Mockito.verify(env, 
Mockito.never()).pushMultiPipeMetaToDataNodes(Mockito.anyList());
+    Mockito.verify(env, 
Mockito.never()).dropMultiPipeOnDataNodes(Mockito.anyList());
+    
Mockito.verify(alterConsumerGroupProcedure).executeFromOperateOnDataNodes(env);
+  }
+
   @Test
   public void executeFromValidateShouldResetDropPipeProceduresOnRetry() throws 
Exception {
     final Map<String, String> consumerAttributes = new HashMap<>();

Reply via email to