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

JackieTien97 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 741a13a5d24 Remove some printed errMsg when stop DN (#18799)
741a13a5d24 is described below

commit 741a13a5d24b24423409dcd25239401f4bc81aab
Author: Weihao Li <[email protected]>
AuthorDate: Sat Oct 10 19:20:21 2026 +0800

    Remove some printed errMsg when stop DN (#18799)
---
 .../fragment/FragmentInstanceExecution.java        | 11 ++-
 .../execution/schedule/DriverScheduler.java        |  9 ++-
 .../iotdb/db/service/DataNodeShutdownHook.java     |  2 +-
 .../execution/exchange/SourceHandleTest.java       | 80 ++++++++++++++++++++++
 4 files changed, 96 insertions(+), 6 deletions(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecution.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecution.java
index 0b6e376d3b8..b2fdeaac4f1 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecution.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/fragment/FragmentInstanceExecution.java
@@ -20,6 +20,7 @@
 package org.apache.iotdb.db.queryengine.execution.fragment;
 
 import org.apache.iotdb.calc.exception.MemoryNotEnoughException;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.utils.FileUtils;
 import org.apache.iotdb.db.conf.IoTDBConfig;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
@@ -332,7 +333,9 @@ public class FragmentInstanceExecution {
             try {
               clearShuffleSinkHandle(newState);
             } catch (Throwable t) {
-              LOGGER.error(DataNodeQueryMessages.ERRORS_RELEASING_SINK, t);
+              if (!CommonDescriptor.getInstance().getConfig().isStopping()) {
+                LOGGER.error(DataNodeQueryMessages.ERRORS_RELEASING_SINK, t);
+              }
             }
 
             // close the driver after sink is aborted or closed because in 
driver.close() it
@@ -358,8 +361,10 @@ public class FragmentInstanceExecution {
               exchangeManager.deRegisterFragmentInstanceFromMemoryPool(
                   instanceId.getQueryId().getId(), 
instanceId.getFragmentInstanceId(), true);
             } catch (Throwable t) {
-              LOGGER.error(
-                  DataNodeQueryMessages.ERRORS_DEREGISTER_FI_FROM_MEMORY_POOL, 
newState, t);
+              if (!CommonDescriptor.getInstance().getConfig().isStopping()) {
+                LOGGER.error(
+                    
DataNodeQueryMessages.ERRORS_DEREGISTER_FI_FROM_MEMORY_POOL, newState, t);
+              }
             }
 
             try {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/schedule/DriverScheduler.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/schedule/DriverScheduler.java
index 0485de570fe..7f84e3ee761 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/schedule/DriverScheduler.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/queryengine/execution/schedule/DriverScheduler.java
@@ -23,6 +23,7 @@ import 
org.apache.iotdb.calc.exception.MemoryNotEnoughException;
 import org.apache.iotdb.calc.execution.schedule.queue.IndexedBlockingQueue;
 import 
org.apache.iotdb.calc.execution.schedule.queue.IndexedBlockingReserveQueue;
 import org.apache.iotdb.commons.concurrent.ThreadName;
+import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.StartupException;
 import org.apache.iotdb.commons.queryengine.common.SessionInfo;
@@ -394,7 +395,9 @@ public class DriverScheduler implements IDriverScheduler, 
IService {
           try {
             task.getDriver().failed(task.getAbortCause().get());
           } catch (Exception e) {
-            logger.error(DataNodeQueryMessages.CLEAR_DRIVERTASK_FAILED, e);
+            if (!CommonDescriptor.getInstance().getConfig().isStopping()) {
+              logger.error(DataNodeQueryMessages.CLEAR_DRIVERTASK_FAILED, e);
+            }
           }
         }
         if (task.getStatus() == DriverTaskStatus.ABORTED) {
@@ -405,7 +408,9 @@ public class DriverScheduler implements IDriverScheduler, 
IService {
                     task.getDriverTaskId().getFragmentId().getId(),
                     
task.getDriverTaskId().getFragmentInstanceId().getInstanceId()));
           } catch (Exception e) {
-            logger.error(DataNodeQueryMessages.CLEAR_DRIVERTASK_FAILED, e);
+            if (!CommonDescriptor.getInstance().getConfig().isStopping()) {
+              logger.error(DataNodeQueryMessages.CLEAR_DRIVERTASK_FAILED, e);
+            }
           }
         }
       } finally {
diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNodeShutdownHook.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNodeShutdownHook.java
index 16f17916eb0..828c4b811ac 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNodeShutdownHook.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/service/DataNodeShutdownHook.java
@@ -112,11 +112,11 @@ public class DataNodeShutdownHook extends Thread {
     DNAuditLogger.getInstance().log(fields, () -> logMessage);
 
     startWatcher();
+    CommonDescriptor.getInstance().getConfig().setStopping(true);
     // Stop external rpc service firstly.
     ExternalRPCService.getInstance().stop();
 
     // Reject write operations to make sure all tsfiles will be sealed
-    CommonDescriptor.getInstance().getConfig().setStopping(true);
     CommonDescriptor.getInstance()
         .getConfig()
         .setNodeStatusWithReason(NodeStatus.ReadOnly, NodeStatus.STOPPING);
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/exchange/SourceHandleTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/exchange/SourceHandleTest.java
index af96360b12e..2d9e5683cfd 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/exchange/SourceHandleTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/queryengine/execution/exchange/SourceHandleTest.java
@@ -25,6 +25,7 @@ import 
org.apache.iotdb.commons.client.exception.ClientManagerException;
 import 
org.apache.iotdb.commons.client.sync.SyncDataNodeMPPDataExchangeServiceClient;
 import org.apache.iotdb.commons.memory.MemoryManager;
 import org.apache.iotdb.db.conf.IoTDBDescriptor;
+import org.apache.iotdb.db.exception.runtime.MemoryLeakException;
 import org.apache.iotdb.db.queryengine.common.FragmentInstanceId;
 import 
org.apache.iotdb.db.queryengine.execution.exchange.MPPDataExchangeManager.SourceHandleListener;
 import org.apache.iotdb.db.queryengine.execution.exchange.source.SourceHandle;
@@ -47,10 +48,12 @@ import java.nio.ByteBuffer;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
 import java.util.concurrent.Future;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicReference;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
@@ -83,6 +86,83 @@ public class SourceHandleTest {
     testCancellationStopsFragmentFetchAfterInFlightRpc(true);
   }
 
+  @Test
+  public void reproduceAbortAfterFragmentInstanceMemoryIsForceDeregistered() 
throws Exception {
+    final String queryId = "q0";
+    final String fragmentInstanceId = "0.0";
+    final String localPlanNodeId = "exchange_0";
+    final TEndPoint remoteEndpoint =
+        new TEndPoint("remote", 
IoTDBDescriptor.getInstance().getConfig().getMppDataExchangePort());
+    final TFragmentInstanceId remoteFragmentInstanceId = new 
TFragmentInstanceId(queryId, 1, "0");
+    final TFragmentInstanceId localFragmentInstanceId = new 
TFragmentInstanceId(queryId, 0, "0");
+    final MemoryPool memoryPool =
+        new MemoryPool("test", new MemoryManager(2 * MOCK_TSBLOCK_SIZE), 2 * 
MOCK_TSBLOCK_SIZE);
+    final LocalMemoryManager localMemoryManager = 
Mockito.mock(LocalMemoryManager.class);
+    Mockito.when(localMemoryManager.getQueryPool()).thenReturn(memoryPool);
+    final ExecutorService executorService = 
Mockito.mock(ExecutorService.class);
+    final SourceHandle sourceHandle =
+        new SourceHandle(
+            remoteEndpoint,
+            remoteFragmentInstanceId,
+            localFragmentInstanceId,
+            localPlanNodeId,
+            0,
+            localMemoryManager,
+            executorService,
+            Utils.createMockTsBlockSerde(MOCK_TSBLOCK_SIZE),
+            Mockito.mock(SourceHandleListener.class),
+            Mockito.mock(IClientManager.class));
+
+    sourceHandle.isBlocked();
+    sourceHandle.updatePendingDataBlockInfo(0, List.of(MOCK_TSBLOCK_SIZE));
+    Assert.assertEquals(MOCK_TSBLOCK_SIZE, 
sourceHandle.getBufferRetainedSizeInBytes());
+    Assert.assertEquals(MOCK_TSBLOCK_SIZE, memoryPool.getReservedBytes());
+
+    final CountDownLatch memoryDeregistered = new CountDownLatch(1);
+    final AtomicReference<Throwable> deregisterFailure = new 
AtomicReference<>();
+    final AtomicReference<Throwable> abortFailure = new AtomicReference<>();
+    final Thread fragmentInstanceCleanupThread =
+        new Thread(
+            () -> {
+              try {
+                memoryPool.deRegisterFragmentInstanceFromQueryMemoryMap(
+                    queryId, fragmentInstanceId, true);
+              } catch (Throwable t) {
+                deregisterFailure.set(t);
+              } finally {
+                memoryDeregistered.countDown();
+              }
+            });
+    final Thread driverSchedulerCleanupThread =
+        new Thread(
+            () -> {
+              try {
+                if (!memoryDeregistered.await(10, TimeUnit.SECONDS)) {
+                  abortFailure.set(
+                      new AssertionError("Timed out waiting for FI memory 
deregistration"));
+                  return;
+                }
+                sourceHandle.abort();
+              } catch (Throwable t) {
+                abortFailure.set(t);
+              }
+            });
+
+    fragmentInstanceCleanupThread.start();
+    driverSchedulerCleanupThread.start();
+    fragmentInstanceCleanupThread.join(TimeUnit.SECONDS.toMillis(10));
+    driverSchedulerCleanupThread.join(TimeUnit.SECONDS.toMillis(10));
+
+    Assert.assertFalse(fragmentInstanceCleanupThread.isAlive());
+    Assert.assertFalse(driverSchedulerCleanupThread.isAlive());
+    Assert.assertTrue(deregisterFailure.get() instanceof MemoryLeakException);
+    Assert.assertTrue(abortFailure.get() instanceof IllegalArgumentException);
+    Assert.assertEquals(
+        "RelatedMemoryReserved can't be null when freeing memory", 
abortFailure.get().getMessage());
+    Assert.assertEquals(MOCK_TSBLOCK_SIZE, 
sourceHandle.getBufferRetainedSizeInBytes());
+    Assert.assertEquals(MOCK_TSBLOCK_SIZE, memoryPool.getReservedBytes());
+  }
+
   private void testCancellationStopsFragmentFetchAfterInFlightRpc(boolean 
abort) throws Exception {
     final String queryId = "q0";
     final TEndPoint remoteEndpoint =

Reply via email to