Skip to content

Commit 45f2645

Browse files
authored
Fix NPE during compaction when disk space is insufficient (#16841)
1 parent 263c23b commit 45f2645

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed

iotdb-core/datanode/src/main/java/org/apache/iotdb/db/storageengine/dataregion/compaction/execute/task/InnerSpaceCompactionTask.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,6 +656,9 @@ public boolean equals(Object other) {
656656
* selected files to false.
657657
*/
658658
protected void releaseAllLocks() {
659+
if (isHoldingWriteLock == null) {
660+
return;
661+
}
659662
for (int i = 0; i < filesView.sourceFilesInLog.size(); ++i) {
660663
TsFileResource resource = filesView.sourceFilesInLog.get(i);
661664
if (isHoldingWriteLock[i]) {

iotdb-core/datanode/src/test/java/org/apache/iotdb/db/storageengine/dataregion/compaction/inner/InnerSpaceCompactionExceptionTest.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,15 @@
1919

2020
package org.apache.iotdb.db.storageengine.dataregion.compaction.inner;
2121

22+
import org.apache.iotdb.commons.conf.CommonDescriptor;
2223
import org.apache.iotdb.commons.conf.IoTDBConstant;
2324
import org.apache.iotdb.commons.exception.IllegalPathException;
25+
import org.apache.iotdb.commons.utils.JVMCommonUtils;
2426
import org.apache.iotdb.db.storageengine.dataregion.compaction.constant.CompactionTaskType;
2527
import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.exception.CompactionExceptionHandler;
2628
import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.ICompactionPerformer;
2729
import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.performer.impl.FastCompactionPerformer;
30+
import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.InnerSpaceCompactionTask;
2831
import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.task.subtask.FastCompactionTaskSummary;
2932
import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.CompactionUtils;
3033
import org.apache.iotdb.db.storageengine.dataregion.compaction.execute.utils.log.CompactionLogger;
@@ -56,6 +59,19 @@ public class InnerSpaceCompactionExceptionTest extends AbstractInnerSpaceCompact
5659

5760
ICompactionPerformer performer = new FastCompactionPerformer(false);
5861

62+
@Test
63+
public void testDiskSpaceInsufficient() throws IOException {
64+
JVMCommonUtils.setDiskSpaceWarningThreshold(1);
65+
try {
66+
InnerSpaceCompactionTask task =
67+
new InnerSpaceCompactionTask(0, tsFileManager, seqResources, true, performer, 0);
68+
Assert.assertFalse(task.start());
69+
} finally {
70+
JVMCommonUtils.setDiskSpaceWarningThreshold(
71+
CommonDescriptor.getInstance().getConfig().getDiskSpaceWarningThreshold());
72+
}
73+
}
74+
5975
/**
6076
* Test when all source files exist, and target file is not complete. System should delete target
6177
* file and its resource at this time.

iotdb-core/node-commons/src/main/java/org/apache/iotdb/commons/utils/JVMCommonUtils.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ public class JVMCommonUtils {
4141

4242
private static final int CPUS = Runtime.getRuntime().availableProcessors();
4343

44-
private static final double diskSpaceWarningThreshold =
44+
private static double diskSpaceWarningThreshold =
4545
CommonDescriptor.getInstance().getConfig().getDiskSpaceWarningThreshold();
4646

4747
/**
@@ -123,4 +123,9 @@ public static int getCpuCores() {
123123
public static int getMaxExecutorPoolSize() {
124124
return MAX_EXECUTOR_POOL_SIZE;
125125
}
126+
127+
@TestOnly
128+
public static void setDiskSpaceWarningThreshold(double threshold) {
129+
diskSpaceWarningThreshold = threshold;
130+
}
126131
}

0 commit comments

Comments
 (0)