You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ib...@apache.org on 2025/06/26 11:18:21 UTC

(ignite-3) branch main updated: IGNITE-25770 Remove checkpoint configuration schema from page-memory (#6127)

This is an automated email from the ASF dual-hosted git repository.

ibessonov pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/ignite-3.git


The following commit(s) were added to refs/heads/main by this push:
     new 5db6ae384a2 IGNITE-25770 Remove checkpoint configuration schema from page-memory (#6127)
5db6ae384a2 is described below

commit 5db6ae384a20539f13cc7627078a7e169e9841e1
Author: Ivan Bessonov <be...@gmail.com>
AuthorDate: Thu Jun 26 14:18:11 2025 +0300

    IGNITE-25770 Remove checkpoint configuration schema from page-memory (#6127)
---
 .../configuration/CheckpointConfiguration.java     | 162 +++++++++++++++++++++
 .../persistence/checkpoint/CheckpointManager.java  |  13 +-
 .../persistence/checkpoint/Checkpointer.java       |  15 +-
 .../persistence/compaction/Compactor.java          |  11 +-
 .../checkpoint/CheckpointManagerTest.java          |   9 +-
 .../persistence/checkpoint/CheckpointerTest.java   |  37 +++--
 .../persistence/compaction/CompactorTest.java      |  21 +--
 .../replacement/AbstractPageReplacementTest.java   |   7 +-
 .../throttling/PageMemoryThrottlingTest.java       |   8 +-
 .../PersistentPageMemoryStorageEngine.java         |  15 +-
 .../PageMemoryCheckpointConfigurationSchema.java   |  15 +-
 ...PageMemoryStorageEngineConfigurationSchema.java |   1 -
 .../pagememory/PersistentPageMemoryNoLoadTest.java |  32 ++--
 13 files changed, 247 insertions(+), 99 deletions(-)

diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/CheckpointConfiguration.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/CheckpointConfiguration.java
new file mode 100644
index 00000000000..a6c64281a61
--- /dev/null
+++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/CheckpointConfiguration.java
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.pagememory.configuration;
+
+import java.util.function.IntSupplier;
+import java.util.function.LongSupplier;
+
+/** Checkpoint configuration. */
+public class CheckpointConfiguration {
+    /** Default value for {@link #checkpointThreads()}. */
+    public static final int DEFAULT_CHECKPOINT_THREADS = 4;
+
+    /** Default value for {@link #compactionThreads()}. */
+    public static final int DEFAULT_COMPACTION_THREADS = 4;
+
+    /** Default value for {@link #intervalMillis()}. */
+    public static final long DEFAULT_CHECKPOINT_INTERVAL = 180_000L;
+
+    /** Default value for {@link #intervalDeviationPercent()}. */
+    public static final int DEFAULT_CHECKPOINT_INTERVAL_DEVIATION = 40;
+
+    /** Default value for {@link #readLockTimeoutMillis()}. */
+    public static final int DEFAULT_CHECKPOINT_READ_LOCK_TIMEOUT = 10_000;
+
+    /** Default value for {@link #logReadLockThresholdTimeoutMillis()}. */
+    public static final int DEFAULT_CHECKPOINT_LOG_READ_LOCK_THRESHOLD_TIMEOUT = 0;
+
+    private final int checkpointThreads;
+    private final int compactionThreads;
+
+    private final LongSupplier intervalMillis;
+    private final IntSupplier intervalDeviationPercent;
+
+    private final LongSupplier readLockTimeoutMillis;
+    private final LongSupplier logReadLockThresholdTimeoutMillis;
+
+    private CheckpointConfiguration(
+            int checkpointThreads,
+            int compactionThreads,
+            LongSupplier intervalMillis,
+            IntSupplier intervalDeviationPercent,
+            LongSupplier readLockTimeoutMillis,
+            LongSupplier logReadLockThresholdTimeoutMillis
+    ) {
+        this.checkpointThreads = checkpointThreads;
+        this.compactionThreads = compactionThreads;
+        this.intervalMillis = intervalMillis;
+        this.intervalDeviationPercent = intervalDeviationPercent;
+        this.readLockTimeoutMillis = readLockTimeoutMillis;
+        this.logReadLockThresholdTimeoutMillis = logReadLockThresholdTimeoutMillis;
+    }
+
+    /** Number of checkpoint threads. */
+    public int checkpointThreads() {
+        return checkpointThreads;
+    }
+
+    /** Number of threads to compact delta files. */
+    public int compactionThreads() {
+        return compactionThreads;
+    }
+
+    /** Interval between checkpoints in milliseconds. */
+    public long intervalMillis() {
+        return intervalMillis.getAsLong();
+    }
+
+    /**
+     * Max deviation (in percent) of intervals between checkpoints. If this is 20 and {@link #intervalMillis()} is 1000, then the effective
+     * checkpoint interval values will be between 900 and 1100.
+     */
+    public int intervalDeviationPercent() {
+        return intervalDeviationPercent.getAsInt();
+    }
+
+    /** Timeout for checkpoint read lock acquisition in milliseconds. */
+    public long readLockTimeoutMillis() {
+        return readLockTimeoutMillis.getAsLong();
+    }
+
+    /** Threshold for logging (if greater than zero) read lock holders in milliseconds. */
+    public long logReadLockThresholdTimeoutMillis() {
+        return logReadLockThresholdTimeoutMillis.getAsLong();
+    }
+
+    /** Creates a builder for {@link CheckpointConfiguration} instance. */
+    public static CheckpointConfigurationBuilder builder() {
+        return new CheckpointConfigurationBuilder();
+    }
+
+    /** Builder for {@link CheckpointConfiguration}. */
+    public static final class CheckpointConfigurationBuilder {
+        private int checkpointThreads = DEFAULT_CHECKPOINT_THREADS;
+        private int compactionThreads = DEFAULT_COMPACTION_THREADS;
+
+        private LongSupplier intervalMillis = () -> DEFAULT_CHECKPOINT_INTERVAL;
+        private IntSupplier intervalDeviationPercent = () -> DEFAULT_CHECKPOINT_INTERVAL_DEVIATION;
+
+        private LongSupplier readLockTimeoutMillis = () -> DEFAULT_CHECKPOINT_READ_LOCK_TIMEOUT;
+        private LongSupplier logReadLockThresholdTimeoutMillis = () -> DEFAULT_CHECKPOINT_LOG_READ_LOCK_THRESHOLD_TIMEOUT;
+
+        CheckpointConfigurationBuilder() {
+        }
+
+        public CheckpointConfigurationBuilder checkpointThreads(int checkpointThreads) {
+            this.checkpointThreads = checkpointThreads;
+            return this;
+        }
+
+        public CheckpointConfigurationBuilder compactionThreads(int compactionThreads) {
+            this.compactionThreads = compactionThreads;
+            return this;
+        }
+
+        public CheckpointConfigurationBuilder intervalMillis(LongSupplier intervalMillis) {
+            this.intervalMillis = intervalMillis;
+            return this;
+        }
+
+        public CheckpointConfigurationBuilder intervalDeviationPercent(IntSupplier intervalDeviationPercent) {
+            this.intervalDeviationPercent = intervalDeviationPercent;
+            return this;
+        }
+
+        public CheckpointConfigurationBuilder readLockTimeoutMillis(LongSupplier readLockTimeoutMillis) {
+            this.readLockTimeoutMillis = readLockTimeoutMillis;
+            return this;
+        }
+
+        public CheckpointConfigurationBuilder logReadLockThresholdTimeoutMillis(LongSupplier logReadLockThresholdTimeoutMillis) {
+            this.logReadLockThresholdTimeoutMillis = logReadLockThresholdTimeoutMillis;
+            return this;
+        }
+
+        /** Builds a {@link CheckpointConfiguration} instance. */
+        public CheckpointConfiguration build() {
+            return new CheckpointConfiguration(
+                    checkpointThreads,
+                    compactionThreads,
+                    intervalMillis,
+                    intervalDeviationPercent,
+                    readLockTimeoutMillis,
+                    logReadLockThresholdTimeoutMillis
+            );
+        }
+    }
+}
diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManager.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManager.java
index 824f6fc303c..06b1bbea067 100644
--- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManager.java
+++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManager.java
@@ -33,8 +33,7 @@ import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.pagememory.DataRegion;
 import org.apache.ignite.internal.pagememory.FullPageId;
 import org.apache.ignite.internal.pagememory.PageMemory;
-import org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
-import org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointView;
+import org.apache.ignite.internal.pagememory.configuration.CheckpointConfiguration;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
 import org.apache.ignite.internal.pagememory.persistence.CheckpointUrgency;
 import org.apache.ignite.internal.pagememory.persistence.GroupPartitionId;
@@ -102,7 +101,7 @@ public class CheckpointManager {
             String igniteInstanceName,
             @Nullable LongJvmPauseDetector longJvmPauseDetector,
             FailureManager failureManager,
-            PageMemoryCheckpointConfiguration checkpointConfig,
+            CheckpointConfiguration checkpointConfig,
             FilePageStoreManager filePageStoreManager,
             PartitionMetaManager partitionMetaManager,
             Collection<? extends DataRegion<PersistentPageMemory>> dataRegions,
@@ -114,9 +113,7 @@ public class CheckpointManager {
     ) throws IgniteInternalCheckedException {
         this.filePageStoreManager = filePageStoreManager;
 
-        PageMemoryCheckpointView checkpointConfigView = checkpointConfig.value();
-
-        long logReadLockThresholdTimeout = checkpointConfigView.logReadLockThresholdTimeoutMillis();
+        long logReadLockThresholdTimeout = checkpointConfig.logReadLockThresholdTimeoutMillis();
 
         ReentrantReadWriteLockWithTracking reentrantReadWriteLockWithTracking = logReadLockThresholdTimeout > 0
                 ? new ReentrantReadWriteLockWithTracking(Loggers.forClass(CheckpointReadWriteLock.class), logReadLockThresholdTimeout)
@@ -131,7 +128,7 @@ public class CheckpointManager {
                 igniteInstanceName,
                 checkpointReadWriteLock,
                 dataRegions,
-                checkpointConfigView.checkpointThreads()
+                checkpointConfig.checkpointThreads()
         );
 
         checkpointPagesWriterFactory = new CheckpointPagesWriterFactory(
@@ -165,7 +162,7 @@ public class CheckpointManager {
 
         checkpointTimeoutLock = new CheckpointTimeoutLock(
                 checkpointReadWriteLock,
-                checkpointConfigView.readLockTimeoutMillis(),
+                checkpointConfig.readLockTimeoutMillis(),
                 () -> checkpointUrgency(dataRegions),
                 checkpointer,
                 failureManager
diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java
index e4097c84fa1..063f8f3f33c 100644
--- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java
+++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/Checkpointer.java
@@ -57,8 +57,7 @@ import org.apache.ignite.internal.lang.NodeStoppingException;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.pagememory.DataRegion;
-import org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
-import org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointView;
+import org.apache.ignite.internal.pagememory.configuration.CheckpointConfiguration;
 import org.apache.ignite.internal.pagememory.persistence.GroupPartitionId;
 import org.apache.ignite.internal.pagememory.persistence.PersistentPageMemory;
 import org.apache.ignite.internal.pagememory.persistence.WriteSpeedFormatter;
@@ -135,7 +134,7 @@ public class Checkpointer extends IgniteWorker {
     private final int pageSize;
 
     /** Checkpoint config. */
-    private final PageMemoryCheckpointConfiguration checkpointConfig;
+    private final CheckpointConfiguration checkpointConfig;
 
     /** Strategy of where and how to get the pages. */
     private final CheckpointWorkflow checkpointWorkflow;
@@ -202,7 +201,7 @@ public class Checkpointer extends IgniteWorker {
             FilePageStoreManager filePageStoreManager,
             Compactor compactor,
             int pageSize,
-            PageMemoryCheckpointConfiguration checkpointConfig,
+            CheckpointConfiguration checkpointConfig,
             LogSyncer logSyncer
     ) {
         super(LOG, igniteInstanceName, "checkpoint-thread");
@@ -219,7 +218,7 @@ public class Checkpointer extends IgniteWorker {
 
         scheduledCheckpointProgress = new CheckpointProgressImpl(MILLISECONDS.toNanos(nextCheckpointInterval()));
 
-        int checkpointWritePageThreads = checkpointConfig.checkpointThreads().value();
+        int checkpointWritePageThreads = checkpointConfig.checkpointThreads();
 
         if (checkpointWritePageThreads > 1) {
             checkpointWritePagesPool = new ThreadPoolExecutor(
@@ -820,10 +819,8 @@ public class Checkpointer extends IgniteWorker {
      * <p>It helps when the cluster makes a checkpoint in the same time in every node.
      */
     long nextCheckpointInterval() {
-        PageMemoryCheckpointView checkpointConfigView = checkpointConfig.value();
-
-        long interval = checkpointConfigView.intervalMillis();
-        int deviation = checkpointConfigView.intervalDeviationPercent();
+        long interval = checkpointConfig.intervalMillis();
+        int deviation = checkpointConfig.intervalDeviationPercent();
 
         if (deviation == 0) {
             return interval;
diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java
index 33cf21e92ae..0e19bbf556a 100644
--- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java
+++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/compaction/Compactor.java
@@ -32,7 +32,6 @@ import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
-import org.apache.ignite.configuration.ConfigurationValue;
 import org.apache.ignite.internal.failure.FailureContext;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.lang.IgniteInternalException;
@@ -100,7 +99,7 @@ public class Compactor extends IgniteWorker {
     public Compactor(
             IgniteLogger log,
             String igniteInstanceName,
-            ConfigurationValue<Integer> threads,
+            int threads,
             FilePageStoreManager filePageStoreManager,
             int pageSize,
             FailureManager failureManager
@@ -110,12 +109,10 @@ public class Compactor extends IgniteWorker {
         this.filePageStoreManager = filePageStoreManager;
         this.failureManager = failureManager;
 
-        int threadCount = threads.value();
-
-        if (threadCount > 1) {
+        if (threads > 1) {
             threadPoolExecutor = new ThreadPoolExecutor(
-                    threadCount,
-                    threadCount,
+                    threads,
+                    threads,
                     30,
                     SECONDS,
                     new LinkedBlockingQueue<>(),
diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManagerTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManagerTest.java
index 9ab3b68ed1f..12b7f7a3840 100644
--- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManagerTest.java
+++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointManagerTest.java
@@ -48,11 +48,10 @@ import java.util.function.Supplier;
 import java.util.stream.IntStream;
 import org.apache.ignite.internal.components.LogSyncer;
 import org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
-import org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.pagememory.DataRegion;
 import org.apache.ignite.internal.pagememory.FullPageId;
-import org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
+import org.apache.ignite.internal.pagememory.configuration.CheckpointConfiguration;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
 import org.apache.ignite.internal.pagememory.persistence.CheckpointUrgency;
 import org.apache.ignite.internal.pagememory.persistence.GroupPartitionId;
@@ -73,8 +72,6 @@ import org.mockito.invocation.InvocationOnMock;
  */
 @ExtendWith({ConfigurationExtension.class, ExecutorServiceExtension.class})
 public class CheckpointManagerTest extends BaseIgniteAbstractTest {
-    @InjectConfiguration
-    private PageMemoryCheckpointConfiguration checkpointConfig;
 
     @InjectExecutorService
     private ExecutorService executorService;
@@ -89,7 +86,7 @@ public class CheckpointManagerTest extends BaseIgniteAbstractTest {
                 "test",
                 null,
                 mock(FailureManager.class),
-                checkpointConfig,
+                CheckpointConfiguration.builder().build(),
                 mock(FilePageStoreManager.class),
                 mock(PartitionMetaManager.class),
                 List.of(dataRegion),
@@ -202,7 +199,7 @@ public class CheckpointManagerTest extends BaseIgniteAbstractTest {
                 "test",
                 null,
                 mock(FailureManager.class),
-                checkpointConfig,
+                CheckpointConfiguration.builder().build(),
                 filePageStoreManager,
                 mock(PartitionMetaManager.class),
                 List.of(),
diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointerTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointerTest.java
index 010b43b6ac4..84102e790fb 100644
--- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointerTest.java
+++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointerTest.java
@@ -59,13 +59,14 @@ import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
 import org.apache.ignite.internal.components.LogSyncer;
 import org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
-import org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.lang.NodeStoppingException;
 import org.apache.ignite.internal.pagememory.FullPageId;
-import org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
+import org.apache.ignite.internal.pagememory.configuration.CheckpointConfiguration;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
 import org.apache.ignite.internal.pagememory.persistence.FakePartitionMeta;
 import org.apache.ignite.internal.pagememory.persistence.GroupPartitionId;
@@ -91,8 +92,15 @@ public class CheckpointerTest extends BaseIgniteAbstractTest {
 
     private static PageIoRegistry ioRegistry;
 
-    @InjectConfiguration("mock : {checkpointThreads=1, intervalMillis=1000, intervalDeviationPercent=0}")
-    private PageMemoryCheckpointConfiguration checkpointConfig;
+    private final AtomicLong intervalMillis = new AtomicLong(1_000L);
+
+    private final AtomicInteger intervalDeviationPercent = new AtomicInteger(0);
+
+    private final CheckpointConfiguration checkpointConfig = CheckpointConfiguration.builder()
+            .checkpointThreads(1)
+            .intervalMillis(intervalMillis::get)
+            .intervalDeviationPercent(intervalDeviationPercent::get)
+            .build();
 
     @BeforeAll
     static void beforeAll() {
@@ -245,7 +253,7 @@ public class CheckpointerTest extends BaseIgniteAbstractTest {
 
     @Test
     void testWaitCheckpointEvent() throws Exception {
-        checkpointConfig.intervalMillis().update(200L).get(100, MILLISECONDS);
+        intervalMillis.set(200L);
 
         Checkpointer checkpointer = new Checkpointer(
                 "test",
@@ -275,7 +283,7 @@ public class CheckpointerTest extends BaseIgniteAbstractTest {
 
     @Test
     void testCheckpointBody() throws Exception {
-        checkpointConfig.intervalMillis().update(100L).get(100, MILLISECONDS);
+        intervalMillis.set(100L);
 
         Checkpointer checkpointer = spy(new Checkpointer(
                 "test",
@@ -290,11 +298,11 @@ public class CheckpointerTest extends BaseIgniteAbstractTest {
                 mock(LogSyncer.class)
         ));
 
-        ((CheckpointProgressImpl) checkpointer.scheduledProgress())
+        checkpointer.scheduledProgress()
                 .futureFor(FINISHED)
                 .whenComplete((unused, throwable) -> {
                     try {
-                        checkpointConfig.intervalMillis().update(10_000L).get(100, MILLISECONDS);
+                        intervalMillis.set(10_000L);
 
                         verify(checkpointer, times(1)).doCheckpoint();
 
@@ -439,25 +447,24 @@ public class CheckpointerTest extends BaseIgniteAbstractTest {
         );
 
         // Checks case 0 deviation.
+        intervalDeviationPercent.set(0);
 
-        checkpointConfig.intervalDeviationPercent().update(0).get(100, MILLISECONDS);
-
-        checkpointConfig.intervalMillis().update(1_000L).get(100, MILLISECONDS);
+        intervalMillis.set(1_000L);
         assertEquals(1_000, checkpointer.nextCheckpointInterval());
 
-        checkpointConfig.intervalMillis().update(2_000L).get(100, MILLISECONDS);
+        intervalMillis.set(2_000L);
         assertEquals(2_000, checkpointer.nextCheckpointInterval());
 
         // Checks for non-zero deviation.
 
-        checkpointConfig.intervalDeviationPercent().update(10).get(100, MILLISECONDS);
+        intervalDeviationPercent.set(10);
 
         assertThat(
                 checkpointer.nextCheckpointInterval(),
                 allOf(greaterThanOrEqualTo(1_900L), lessThanOrEqualTo(2_100L))
         );
 
-        checkpointConfig.intervalDeviationPercent().update(20).get(100, MILLISECONDS);
+        intervalDeviationPercent.set(20);
 
         assertThat(
                 checkpointer.nextCheckpointInterval(),
@@ -469,7 +476,7 @@ public class CheckpointerTest extends BaseIgniteAbstractTest {
         return new CheckpointDirtyPages(List.of(createDirtyPagesAndPartitions(pageMemory, pageIds)));
     }
 
-    private CheckpointWorkflow createCheckpointWorkflow(CheckpointDirtyPages dirtyPages) throws Exception {
+    private static CheckpointWorkflow createCheckpointWorkflow(CheckpointDirtyPages dirtyPages) throws Exception {
         CheckpointWorkflow mock = mock(CheckpointWorkflow.class);
 
         when(mock.markCheckpointBegin(
diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/compaction/CompactorTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/compaction/CompactorTest.java
index f96bcb91f66..fd2917c41bf 100644
--- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/compaction/CompactorTest.java
+++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/compaction/CompactorTest.java
@@ -42,7 +42,6 @@ import java.nio.ByteBuffer;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicReference;
-import org.apache.ignite.configuration.ConfigurationValue;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.pagememory.io.PageIo;
 import org.apache.ignite.internal.pagememory.persistence.GroupPartitionId;
@@ -65,7 +64,7 @@ public class CompactorTest extends BaseIgniteAbstractTest {
         var compactor = new Compactor(
                 log,
                 "test",
-                threadsConfig(1),
+                1,
                 mock(FilePageStoreManager.class),
                 PAGE_SIZE,
                 mock(FailureManager.class)
@@ -99,7 +98,7 @@ public class CompactorTest extends BaseIgniteAbstractTest {
         Compactor compactor = new Compactor(
                 log,
                 "test",
-                threadsConfig(1),
+                1,
                 mock(FilePageStoreManager.class),
                 PAGE_SIZE,
                 mock(FailureManager.class));
@@ -151,7 +150,7 @@ public class CompactorTest extends BaseIgniteAbstractTest {
         Compactor compactor = spy(new Compactor(
                 log,
                 "test",
-                threadsConfig(1),
+                1,
                 filePageStoreManager,
                 PAGE_SIZE,
                 mock(FailureManager.class)));
@@ -183,7 +182,7 @@ public class CompactorTest extends BaseIgniteAbstractTest {
         Compactor compactor = spy(new Compactor(
                 log,
                 "test",
-                threadsConfig(1),
+                1,
                 mock(FilePageStoreManager.class),
                 PAGE_SIZE,
                 mock(FailureManager.class)));
@@ -208,7 +207,7 @@ public class CompactorTest extends BaseIgniteAbstractTest {
         Compactor compactor = spy(new Compactor(
                 log,
                 "test",
-                threadsConfig(1),
+                1,
                 mock(FilePageStoreManager.class),
                 PAGE_SIZE,
                 mock(FailureManager.class)));
@@ -227,7 +226,7 @@ public class CompactorTest extends BaseIgniteAbstractTest {
         Compactor compactor = spy(new Compactor(
                 log,
                 "test",
-                threadsConfig(1),
+                1,
                 mock(FilePageStoreManager.class),
                 PAGE_SIZE,
                 mock(FailureManager.class)));
@@ -245,12 +244,4 @@ public class CompactorTest extends BaseIgniteAbstractTest {
 
         waitDeltaFilesFuture.get(100, MILLISECONDS);
     }
-
-    private static ConfigurationValue<Integer> threadsConfig(int threads) {
-        ConfigurationValue<Integer> configValue = mock(ConfigurationValue.class);
-
-        when(configValue.value()).thenReturn(threads);
-
-        return configValue;
-    }
 }
diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/AbstractPageReplacementTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/AbstractPageReplacementTest.java
index 6a4f477d503..8d699e4ea47 100644
--- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/AbstractPageReplacementTest.java
+++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/replacement/AbstractPageReplacementTest.java
@@ -54,7 +54,7 @@ import org.apache.ignite.internal.lang.RunnableX;
 import org.apache.ignite.internal.pagememory.DataRegion;
 import org.apache.ignite.internal.pagememory.TestPageIoModule.TestSimpleValuePageIo;
 import org.apache.ignite.internal.pagememory.TestPageIoRegistry;
-import org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
+import org.apache.ignite.internal.pagememory.configuration.CheckpointConfiguration;
 import org.apache.ignite.internal.pagememory.configuration.schema.PersistentPageMemoryProfileChange;
 import org.apache.ignite.internal.pagememory.configuration.schema.PersistentPageMemoryProfileConfiguration;
 import org.apache.ignite.internal.pagememory.configuration.schema.PersistentPageMemoryProfileConfigurationSchema;
@@ -99,9 +99,6 @@ public abstract class AbstractPageReplacementTest extends IgniteAbstractTest {
 
     private static final int MAX_MEMORY_SIZE = PAGE_COUNT * PAGE_SIZE;
 
-    @InjectConfiguration("mock.checkpointThreads = 1")
-    private PageMemoryCheckpointConfiguration checkpointConfig;
-
     @InjectConfiguration(
             polymorphicExtensions = PersistentPageMemoryProfileConfigurationSchema.class,
             value = "mock = {"
@@ -148,7 +145,7 @@ public abstract class AbstractPageReplacementTest extends IgniteAbstractTest {
                 NODE_NAME,
                 null,
                 failureManager,
-                checkpointConfig,
+                CheckpointConfiguration.builder().checkpointThreads(1).build(),
                 filePageStoreManager,
                 partitionMetaManager,
                 dataRegionList,
diff --git a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/PageMemoryThrottlingTest.java b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/PageMemoryThrottlingTest.java
index 51d881f67ff..0d77d385e90 100644
--- a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/PageMemoryThrottlingTest.java
+++ b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/PageMemoryThrottlingTest.java
@@ -54,7 +54,7 @@ import org.apache.ignite.internal.lang.IgniteInternalCheckedException;
 import org.apache.ignite.internal.lang.RunnableX;
 import org.apache.ignite.internal.pagememory.DataRegion;
 import org.apache.ignite.internal.pagememory.PageIdAllocator;
-import org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
+import org.apache.ignite.internal.pagememory.configuration.CheckpointConfiguration;
 import org.apache.ignite.internal.pagememory.configuration.schema.PersistentPageMemoryProfileConfiguration;
 import org.apache.ignite.internal.pagememory.freelist.io.PagesListNodeIo;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
@@ -102,8 +102,10 @@ public class PageMemoryThrottlingTest extends IgniteAbstractTest {
     private static PageIoRegistry ioRegistry;
 
     // We use very small readLock timeout here on purpose.
-    @InjectConfiguration("mock {checkpointThreads = 1, readLockTimeoutMillis = 50}")
-    private PageMemoryCheckpointConfiguration checkpointConfig;
+    private CheckpointConfiguration checkpointConfig = CheckpointConfiguration.builder()
+            .checkpointThreads(1)
+            .readLockTimeoutMillis(() -> 50)
+            .build();
 
     @InjectConfiguration("mock.engine = aipersist")
     private StorageProfileConfiguration profileConfig;
diff --git a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
index e297713a0c4..fd1d26cb170 100644
--- a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
+++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
@@ -45,6 +45,7 @@ import org.apache.ignite.internal.lang.IgniteInternalCheckedException;
 import org.apache.ignite.internal.logger.IgniteLogger;
 import org.apache.ignite.internal.logger.Loggers;
 import org.apache.ignite.internal.metrics.MetricManager;
+import org.apache.ignite.internal.pagememory.configuration.CheckpointConfiguration;
 import org.apache.ignite.internal.pagememory.configuration.schema.PersistentPageMemoryProfileConfiguration;
 import org.apache.ignite.internal.pagememory.configuration.schema.PersistentPageMemoryProfileView;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
@@ -60,6 +61,7 @@ import org.apache.ignite.internal.storage.engine.MvTableStorage;
 import org.apache.ignite.internal.storage.engine.StorageEngine;
 import org.apache.ignite.internal.storage.engine.StorageTableDescriptor;
 import org.apache.ignite.internal.storage.index.StorageIndexDescriptorSupplier;
+import org.apache.ignite.internal.storage.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
 import org.apache.ignite.internal.storage.pagememory.configuration.schema.PersistentPageMemoryStorageEngineConfiguration;
 import org.apache.ignite.internal.storage.pagememory.configuration.schema.PersistentPageMemoryStorageEngineExtensionConfiguration;
 import org.apache.ignite.internal.thread.NamedThreadFactory;
@@ -201,7 +203,7 @@ public class PersistentPageMemoryStorageEngine extends AbstractPageMemoryStorage
                     igniteInstanceName,
                     longJvmPauseDetector,
                     failureManager,
-                    engineConfig.checkpoint(),
+                    checkpointConfiguration(engineConfig.checkpoint()),
                     filePageStoreManager,
                     partitionMetaManager,
                     regions.values(),
@@ -243,6 +245,17 @@ public class PersistentPageMemoryStorageEngine extends AbstractPageMemoryStorage
         destructionExecutor = executor;
     }
 
+    private static CheckpointConfiguration checkpointConfiguration(PageMemoryCheckpointConfiguration checkpointCfg) {
+        return CheckpointConfiguration.builder()
+                .checkpointThreads(checkpointCfg.value().checkpointThreads())
+                .compactionThreads(checkpointCfg.value().compactionThreads())
+                .intervalMillis(checkpointCfg.intervalMillis()::value)
+                .intervalDeviationPercent(checkpointCfg.intervalDeviationPercent()::value)
+                .readLockTimeoutMillis(checkpointCfg.readLockTimeoutMillis()::value)
+                .logReadLockThresholdTimeoutMillis(checkpointCfg.logReadLockThresholdTimeoutMillis()::value)
+                .build();
+    }
+
     @Override
     public void stop() throws StorageException {
         try {
diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/schema/PageMemoryCheckpointConfigurationSchema.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/schema/PageMemoryCheckpointConfigurationSchema.java
similarity index 77%
rename from modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/schema/PageMemoryCheckpointConfigurationSchema.java
rename to modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/schema/PageMemoryCheckpointConfigurationSchema.java
index 31c93db7c6e..31b8c3f0ea1 100644
--- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/schema/PageMemoryCheckpointConfigurationSchema.java
+++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/schema/PageMemoryCheckpointConfigurationSchema.java
@@ -15,12 +15,13 @@
  * limitations under the License.
  */
 
-package org.apache.ignite.internal.pagememory.configuration.schema;
+package org.apache.ignite.internal.storage.pagememory.configuration.schema;
 
 import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.PublicName;
 import org.apache.ignite.configuration.annotation.Value;
 import org.apache.ignite.configuration.validation.Range;
+import org.apache.ignite.internal.pagememory.configuration.CheckpointConfiguration;
 
 /**
  * Checkpoint configuration schema for persistent page memory.
@@ -31,7 +32,7 @@ public class PageMemoryCheckpointConfigurationSchema {
     @Range(min = 0)
     @Value(hasDefault = true)
     @PublicName(legacyNames = "interval")
-    public long intervalMillis = 180_000;
+    public long intervalMillis = CheckpointConfiguration.DEFAULT_CHECKPOINT_INTERVAL;
 
     /**
      * Max deviation (in percent) of intervals between checkpoints. If this is 20 and {@link #intervalMillis} is 1000, then the effective
@@ -40,7 +41,7 @@ public class PageMemoryCheckpointConfigurationSchema {
     @Range(min = 0, max = 100)
     @Value(hasDefault = true)
     @PublicName(legacyNames = "intervalDeviation")
-    public int intervalDeviationPercent = 40;
+    public int intervalDeviationPercent = CheckpointConfiguration.DEFAULT_CHECKPOINT_INTERVAL_DEVIATION;
 
     /** Delay before executing a checkpoint triggered by RAFT. */
     @Range(min = 0)
@@ -50,24 +51,24 @@ public class PageMemoryCheckpointConfigurationSchema {
     /** Number of checkpoint threads. */
     @Range(min = 1)
     @Value(hasDefault = true)
-    public int checkpointThreads = 4;
+    public int checkpointThreads = CheckpointConfiguration.DEFAULT_CHECKPOINT_THREADS;
 
     /** Number of threads to compact delta files. */
     @Range(min = 1)
     @Value(hasDefault = true)
-    public int compactionThreads = 4;
+    public int compactionThreads = CheckpointConfiguration.DEFAULT_COMPACTION_THREADS;
 
     /** Timeout for checkpoint read lock acquisition in milliseconds. */
     @Range(min = 0)
     @Value(hasDefault = true)
     @PublicName(legacyNames = "readLockTimeout")
-    public long readLockTimeoutMillis = 10_000;
+    public long readLockTimeoutMillis = CheckpointConfiguration.DEFAULT_CHECKPOINT_READ_LOCK_TIMEOUT;
 
     /** Threshold for logging (if greater than zero) read lock holders in milliseconds. */
     @Range(min = 0)
     @Value(hasDefault = true)
     @PublicName(legacyNames = "logReadLockThresholdTimeout")
-    public long logReadLockThresholdTimeoutMillis = 0;
+    public long logReadLockThresholdTimeoutMillis = CheckpointConfiguration.DEFAULT_CHECKPOINT_LOG_READ_LOCK_THRESHOLD_TIMEOUT;
 
     /** Use an asynchronous file I/O operations provider. */
     @Value(hasDefault = true)
diff --git a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/schema/PersistentPageMemoryStorageEngineConfigurationSchema.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/schema/PersistentPageMemoryStorageEngineConfigurationSchema.java
index d8e82188edd..6d1ac110398 100644
--- a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/schema/PersistentPageMemoryStorageEngineConfigurationSchema.java
+++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/schema/PersistentPageMemoryStorageEngineConfigurationSchema.java
@@ -24,7 +24,6 @@ import org.apache.ignite.configuration.annotation.Value;
 import org.apache.ignite.configuration.validation.Immutable;
 import org.apache.ignite.configuration.validation.PowerOfTwo;
 import org.apache.ignite.configuration.validation.Range;
-import org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfigurationSchema;
 import org.apache.ignite.internal.storage.pagememory.PersistentPageMemoryStorageEngine;
 
 /**
diff --git a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java
index 96779b0a8ca..d955eddf775 100644
--- a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java
+++ b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryNoLoadTest.java
@@ -63,7 +63,7 @@ import org.apache.ignite.internal.pagememory.AbstractPageMemoryNoLoadSelfTest;
 import org.apache.ignite.internal.pagememory.DataRegion;
 import org.apache.ignite.internal.pagememory.FullPageId;
 import org.apache.ignite.internal.pagememory.PageMemory;
-import org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
+import org.apache.ignite.internal.pagememory.configuration.CheckpointConfiguration;
 import org.apache.ignite.internal.pagememory.configuration.schema.PersistentPageMemoryProfileChange;
 import org.apache.ignite.internal.pagememory.configuration.schema.PersistentPageMemoryProfileConfiguration;
 import org.apache.ignite.internal.pagememory.configuration.schema.PersistentPageMemoryProfileConfigurationSchema;
@@ -145,10 +145,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
     }
 
     @Test
-    void testDirtyPages(
-            @InjectConfiguration PageMemoryCheckpointConfiguration checkpointConfig,
-            @WorkDirectory Path workDir
-    ) throws Exception {
+    void testDirtyPages(@WorkDirectory Path workDir) throws Exception {
         FilePageStoreManager filePageStoreManager = createFilePageStoreManager(workDir);
 
         PartitionMetaManager partitionMetaManager = new PartitionMetaManager(ioRegistry, PAGE_SIZE, StoragePartitionMeta.FACTORY);
@@ -156,7 +153,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
         Collection<DataRegion<PersistentPageMemory>> dataRegions = new ArrayList<>();
 
         CheckpointManager checkpointManager = createCheckpointManager(
-                checkpointConfig,
+                CheckpointConfiguration.builder().build(),
                 filePageStoreManager,
                 partitionMetaManager,
                 dataRegions
@@ -207,10 +204,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
     }
 
     @Test
-    void testCheckpointUrgency(
-            @InjectConfiguration PageMemoryCheckpointConfiguration checkpointConfig,
-            @WorkDirectory Path workDir
-    ) throws Exception {
+    void testCheckpointUrgency(@WorkDirectory Path workDir) throws Exception {
         FilePageStoreManager filePageStoreManager = createFilePageStoreManager(workDir);
 
         PartitionMetaManager partitionMetaManager = new PartitionMetaManager(ioRegistry, PAGE_SIZE, StoragePartitionMeta.FACTORY);
@@ -218,7 +212,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
         Collection<DataRegion<PersistentPageMemory>> dataRegions = new ArrayList<>();
 
         CheckpointManager checkpointManager = createCheckpointManager(
-                checkpointConfig,
+                CheckpointConfiguration.builder().build(),
                 filePageStoreManager,
                 partitionMetaManager,
                 dataRegions
@@ -297,10 +291,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
     }
 
     @Test
-    void testDeltaFilePageStore(
-            @InjectConfiguration PageMemoryCheckpointConfiguration checkpointConfig,
-            @WorkDirectory Path workDir
-    ) throws Exception {
+    void testDeltaFilePageStore(@WorkDirectory Path workDir) throws Exception {
         FilePageStoreManager filePageStoreManager = spy(createFilePageStoreManager(workDir));
 
         PartitionMetaManager partitionMetaManager = new PartitionMetaManager(ioRegistry, PAGE_SIZE, StoragePartitionMeta.FACTORY);
@@ -308,7 +299,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
         Collection<DataRegion<PersistentPageMemory>> dataRegions = new ArrayList<>();
 
         CheckpointManager checkpointManager = createCheckpointManager(
-                checkpointConfig,
+                CheckpointConfiguration.builder().build(),
                 filePageStoreManager,
                 partitionMetaManager,
                 dataRegions
@@ -361,10 +352,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
     }
 
     @Test
-    void testPageReplacement(
-            @InjectConfiguration("mock.checkpointThreads=1") PageMemoryCheckpointConfiguration checkpointConfig,
-            @WorkDirectory Path workDir
-    ) throws Exception {
+    void testPageReplacement(@WorkDirectory Path workDir) throws Exception {
         FilePageStoreManager filePageStoreManager = createFilePageStoreManager(workDir);
 
         PartitionMetaManager partitionMetaManager = new PartitionMetaManager(ioRegistry, PAGE_SIZE, StoragePartitionMeta.FACTORY);
@@ -373,7 +361,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
         Collection<DataRegion<PersistentPageMemory>> dataRegions = new ArrayList<>();
 
         CheckpointManager checkpointManager = createCheckpointManager(
-                checkpointConfig,
+                CheckpointConfiguration.builder().checkpointThreads(1).build(),
                 filePageStoreManager,
                 partitionMetaManager,
                 dataRegions
@@ -506,7 +494,7 @@ public class PersistentPageMemoryNoLoadTest extends AbstractPageMemoryNoLoadSelf
     }
 
     private CheckpointManager createCheckpointManager(
-            PageMemoryCheckpointConfiguration checkpointConfig,
+            CheckpointConfiguration checkpointConfig,
             FilePageStoreManager filePageStoreManager,
             PartitionMetaManager partitionMetaManager,
             Collection<DataRegion<PersistentPageMemory>> dataRegions