diff --git a/h2/src/main/org/h2/mvstore/MVStore.java b/h2/src/main/org/h2/mvstore/MVStore.java index 658e8ddee1..ec500ca2cd 100644 --- a/h2/src/main/org/h2/mvstore/MVStore.java +++ b/h2/src/main/org/h2/mvstore/MVStore.java @@ -123,7 +123,7 @@ to a map (possibly the metadata map) - /** * A persistent storage for maps. */ -public class MVStore implements AutoCloseable { +public final class MVStore implements AutoCloseable { /** * Store is open. @@ -1265,8 +1265,8 @@ void beforeWrite(MVMap map) { fileStore.isRegularMap(map)) { saveNeeded = false; // check again, because it could have been written by now - if (autoCommitMemory > 0 && needStore()) { - // if unsaved memory creation rate is to high, + if (needStore()) { + // if unsaved memory creation rate is too high, // some back pressure need to be applied // to slow things down and avoid OOME if (requireStore() && !map.isSingleWriter()) { diff --git a/h2/src/main/org/h2/mvstore/RandomAccessStore.java b/h2/src/main/org/h2/mvstore/RandomAccessStore.java index 2497b09696..90b41d5410 100644 --- a/h2/src/main/org/h2/mvstore/RandomAccessStore.java +++ b/h2/src/main/org/h2/mvstore/RandomAccessStore.java @@ -43,7 +43,7 @@ public abstract class RandomAccessStore extends FileStore private long reservedLow; private long reservedHigh; - + private boolean stopIdleHousekeeping; public RandomAccessStore(Map config) { super(config); @@ -702,10 +702,13 @@ private void shrinkIfPossible(int minPercent) { @Override protected void doHousekeeping(MVStore mvStore) throws InterruptedException { + boolean idle = isIdle(); + if (idle && stopIdleHousekeeping) { + return; + } int autoCommitMemory = mvStore.getAutoCommitMemory(); int fillRate = getFillRate(); if (isFragmented() && fillRate < getAutoCompactFillRate()) { - mvStore.tryExecuteUnderStoreLock(() -> { int moveSize = 2 * autoCommitMemory; if (isIdle()) { @@ -731,6 +734,7 @@ protected void doHousekeeping(MVStore mvStore) throws InterruptedException { return true; }); } + stopIdleHousekeeping = idle && getFillRate() <= fillRate && getRewritableChunksFillRate() <= chunksFillRate; } private int getTargetFillRate() {