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; + } }
