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

jackietien pushed a commit to branch force_ci/object_type
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit 21c64b0607ab176c4088103255ec86158709970c
Author: shuwenwei <[email protected]>
AuthorDate: Wed Dec 3 10:48:12 2025 +0800

    Fix  NPE during compaction when disk space is insufficient (#16841)
    
    (cherry picked from commit 45f26455926b91a46c7e960f1ec7a8bd67435947)
---
 .../execute/task/InnerSpaceCompactionTask.java           |  3 +++
 .../inner/InnerSpaceCompactionExceptionTest.java         | 16 ++++++++++++++++
 .../org/apache/iotdb/commons/utils/JVMCommonUtils.java   |  7 ++++++-
 3 files changed, 25 insertions(+), 1 deletion(-)

diff --git 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
index 9bc91bf6bf1..034e4eb48b8 100644
--- 
a/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
+++ 
b/iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java
@@ -662,6 +662,9 @@ public class InnerSpaceCompactionTask extends 
AbstractCompactionTask {
    * selected files to false.
    */
   protected void releaseAllLocks() {
+    if (isHoldingWriteLock == null) {
+      return;
+    }
     for (int i = 0; i < filesView.sourceFilesInLog.size(); ++i) {
       TsFileResource resource = filesView.sourceFilesInLog.get(i);
       if (isHoldingWriteLock[i]) {
diff --git 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/InnerSpaceCompactionExceptionTest.java
 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/InnerSpaceCompactionExceptionTest.java
index d5460586085..f557eddb227 100644
--- 
a/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/InnerSpaceCompactionExceptionTest.java
+++ 
b/iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/InnerSpaceCompactionExceptionTest.java
@@ -19,12 +19,15 @@
 
 package org.apache.iotdb.db.storageengine.dataregion.compaction.inner;
 
+import org.apache.iotdb.commons.conf.CommonDescriptor;
 import org.apache.iotdb.commons.conf.IoTDBConstant;
 import org.apache.iotdb.commons.exception.IllegalPathException;
+import org.apache.iotdb.commons.utils.JVMCommonUtils;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.constant.CompactionTaskType;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.CompactionExceptionHandler;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ICompactionPerformer;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.FastCompactionPerformer;
+import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.InnerSpaceCompactionTask;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.subtask.FastCompactionTaskSummary;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils;
 import 
org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.log.CompactionLogger;
@@ -56,6 +59,19 @@ public class InnerSpaceCompactionExceptionTest extends 
AbstractInnerSpaceCompact
 
   ICompactionPerformer performer = new FastCompactionPerformer(false);
 
+  @Test
+  public void testDiskSpaceInsufficient() throws IOException {
+    JVMCommonUtils.setDiskSpaceWarningThreshold(1);
+    try {
+      InnerSpaceCompactionTask task =
+          new InnerSpaceCompactionTask(0, tsFileManager, seqResources, true, 
performer, 0);
+      Assert.assertFalse(task.start());
+    } finally {
+      JVMCommonUtils.setDiskSpaceWarningThreshold(
+          
CommonDescriptor.getInstance().getConfig().getDiskSpaceWarningThreshold());
+    }
+  }
+
   /**
    * Test when all source files exist, and target file is not complete. System 
should delete target
    * file and its resource at this time.
diff --git 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/JVMCommonUtils.java
 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/JVMCommonUtils.java
index 84f9704e4f0..b23a68886c4 100644
--- 
a/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/JVMCommonUtils.java
+++ 
b/iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/JVMCommonUtils.java
@@ -41,7 +41,7 @@ public class JVMCommonUtils {
 
   private static final int CPUS = Runtime.getRuntime().availableProcessors();
 
-  private static final double diskSpaceWarningThreshold =
+  private static double diskSpaceWarningThreshold =
       
CommonDescriptor.getInstance().getConfig().getDiskSpaceWarningThreshold();
 
   /**
@@ -123,4 +123,9 @@ public class JVMCommonUtils {
   public static int getMaxExecutorPoolSize() {
     return MAX_EXECUTOR_POOL_SIZE;
   }
+
+  @TestOnly
+  public static void setDiskSpaceWarningThreshold(double threshold) {
+    diskSpaceWarningThreshold = threshold;
+  }
 }

Reply via email to