This is an automated email from the ASF dual-hosted git repository.
jackietien 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 45f26455926 Fix NPE during compaction when disk space is insufficient
(#16841)
45f26455926 is described below
commit 45f26455926b91a46c7e960f1ec7a8bd67435947
Author: shuwenwei <[email protected]>
AuthorDate: Wed Dec 3 10:48:12 2025 +0800
Fix NPE during compaction when disk space is insufficient (#16841)
---
.../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 ef4d1d850fd..c61d2275ac1 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
@@ -656,6 +656,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;
+ }
}