This is an automated email from the ASF dual-hosted git repository. marklau99 pushed a commit to branch fix-compaction-cannot-allocate-memory in repository https://gitbox.apache.org/repos/asf/iotdb.git
commit 9a45f88118ca757cca028154732e4ae70417d06a Author: Liu Xuxin <[email protected]> AuthorDate: Wed Jun 14 20:01:18 2023 +0800 fix always waiting when cannot allocate memory for compaction --- .../cross/rewrite/task/RewriteCrossSpaceCompactionTask.java | 3 ++- .../src/main/java/org/apache/iotdb/db/rescon/SystemInfo.java | 10 ++++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/server/src/main/java/org/apache/iotdb/db/engine/compaction/cross/rewrite/task/RewriteCrossSpaceCompactionTask.java b/server/src/main/java/org/apache/iotdb/db/engine/compaction/cross/rewrite/task/RewriteCrossSpaceCompactionTask.java index fe79edf8269..6907da9d32e 100644 --- a/server/src/main/java/org/apache/iotdb/db/engine/compaction/cross/rewrite/task/RewriteCrossSpaceCompactionTask.java +++ b/server/src/main/java/org/apache/iotdb/db/engine/compaction/cross/rewrite/task/RewriteCrossSpaceCompactionTask.java @@ -89,8 +89,9 @@ public class RewriteCrossSpaceCompactionTask extends AbstractCrossSpaceCompactio protected void doCompaction() throws Exception { try { SystemInfo.getInstance().addCompactionMemoryCost(memoryCost); - } catch (InterruptedException e) { + } catch (Exception e) { logger.error("Thread get interrupted when allocating memory for compaction", e); + releaseAllLock(); return; } try { diff --git a/server/src/main/java/org/apache/iotdb/db/rescon/SystemInfo.java b/server/src/main/java/org/apache/iotdb/db/rescon/SystemInfo.java index e99a2c36ceb..c9716e36437 100644 --- a/server/src/main/java/org/apache/iotdb/db/rescon/SystemInfo.java +++ b/server/src/main/java/org/apache/iotdb/db/rescon/SystemInfo.java @@ -282,10 +282,20 @@ public class SystemInfo { return; } long originSize = this.compactionMemoryCost.get(); + long waittingTime = 0L; while (originSize + memoryCost > memorySizeForCompaction || !compactionMemoryCost.compareAndSet(originSize, originSize + memoryCost)) { Thread.sleep(100); originSize = this.compactionMemoryCost.get(); + waittingTime += 100L; + if (waittingTime >= 60_000L) { + throw new RuntimeException( + "Cannot get enough memory for compaction, want " + + memoryCost + + " bytes but only " + + (memorySizeForCompaction - compactionMemoryCost.get()) + + " bytes left."); + } } }
