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 b2b7cf3f10c IGNITE-24548 Enable speed-based throttling (#5474)
b2b7cf3f10c is described below

commit b2b7cf3f10c0860d77c25ac12b2dd804bba248ae
Author: Ivan Bessonov <[email protected]>
AuthorDate: Mon Mar 31 16:43:18 2025 +0300

    IGNITE-24548 Enable speed-based throttling (#5474)
---
 .../persistence/PersistentPageMemory.java          |   3 +-
 .../persistence/checkpoint/CheckpointManager.java  |   4 +
 .../persistence/checkpoint/Checkpointer.java       |  17 ++++
 .../throttling/PagesWriteSpeedBasedThrottle.java   |   7 +-
 .../throttling/PagesWriteThrottlePolicy.java       |   3 +-
 ...edBasedMemoryConsumptionThrottlingStrategy.java |  30 +++++-
 .../throttling/TargetRatioPagesWriteThrottle.java  |   9 +-
 .../persistence/throttling/ThrottlingType.java     |  32 ++++++
 .../throttling/PageMemoryThrottlingTest.java       |   3 +
 .../persistence/throttling/ThrottlingTest.java     |  31 +++---
 .../partition/replicator/fixtures/Node.java        |   2 +
 .../testframework/TestIgnitionManager.java         |   3 +-
 .../pagememory/PersistentPageMemoryDataRegion.java | 109 ++++++++++++++++++++-
 .../PersistentPageMemoryDataStorageModule.java     |   5 +
 .../PersistentPageMemoryStorageEngine.java         |  11 +++
 .../PersistentPageMemoryMvTableStorageTest.java    |   1 +
 .../PersistentPageMemoryStorageEngineTest.java     |   1 +
 .../PersistentPageMemoryHashIndexStorageTest.java  |   1 +
 ...PersistentPageMemorySortedIndexStorageTest.java |   1 +
 ...ageMemoryMvPartitionStorageConcurrencyTest.java |   1 +
 ...rsistentPageMemoryMvPartitionStorageGcTest.java |   1 +
 ...PersistentPageMemoryMvPartitionStorageTest.java |   1 +
 ...entPageMemoryMvTableStorageConcurrencyTest.java |   1 +
 .../distributed/TableManagerRecoveryTest.java      |  11 +--
 .../table/distributed/TableManagerTest.java        |  13 +--
 .../PersistentPageMemoryGcUpdateHandlerTest.java   |   1 +
 26 files changed, 258 insertions(+), 44 deletions(-)

diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java
index 49d02e88101..d7d6889fbc7 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java
@@ -297,8 +297,7 @@ public class PersistentPageMemory implements PageMemory {
      *
      * @param writeThrottle Page write throttling instance.
      */
-    // TODO IGNITE-24548 Make a proper implementation.
-    @TestOnly
+    // TODO IGNITE-24933 Remove this method.
     public void initThrottling(PagesWriteThrottlePolicy writeThrottle) {
         this.writeThrottle = writeThrottle;
     }
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 28fa84435e8..06a6d5bc912 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
@@ -242,6 +242,10 @@ public class CheckpointManager {
         return checkpointer.currentCheckpointProgress();
     }
 
+    public @Nullable CheckpointProgress 
currentCheckpointProgressForThrottling() {
+        return checkpointer.currentCheckpointProgressForThrottling();
+    }
+
     /**
      * Returns the progress of the last checkpoint, or the current checkpoint 
if in progress, {@code null} if no checkpoint has occurred.
      */
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 15b4305fbc5..0d7933b9a10 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
@@ -152,6 +152,13 @@ public class Checkpointer extends IgniteWorker {
     /** Current checkpoint progress. This field is updated only by checkpoint 
thread. */
     private volatile @Nullable CheckpointProgressImpl 
currentCheckpointProgress;
 
+    /**
+     * Checkpoint progress instance with a more limited range of visibility. 
It is initialized when checkpoint write lick is acquired, and
+     * nullified when checkpoint finishes (unlike {@link 
#currentCheckpointProgress} that is updated before we started notifying 
checkpoint
+     * listeners and is never nullified).
+     */
+    private volatile @Nullable CheckpointProgressImpl 
currentCheckpointProgressForThrottling;
+
     /** Checkpoint progress after releasing write lock. */
     private volatile @Nullable CheckpointProgressImpl 
afterReleaseWriteLockCheckpointProgress;
 
@@ -418,6 +425,8 @@ public class Checkpointer extends IgniteWorker {
             failureManager.process(new FailureContext(CRITICAL_ERROR, e));
 
             throw e;
+        } finally {
+            currentCheckpointProgressForThrottling = null;
         }
     }
 
@@ -684,6 +693,10 @@ public class Checkpointer extends IgniteWorker {
             scheduledCheckpointProgress = new 
CheckpointProgressImpl(MILLISECONDS.toNanos(nextCheckpointInterval()));
 
             currentCheckpointProgress = curr;
+
+            curr.futureFor(LOCK_TAKEN).thenRun(() -> {
+                currentCheckpointProgressForThrottling = curr;
+            });
         }
     }
 
@@ -779,6 +792,10 @@ public class Checkpointer extends IgniteWorker {
         return currentCheckpointProgress;
     }
 
+    public @Nullable CheckpointProgress 
currentCheckpointProgressForThrottling() {
+        return currentCheckpointProgressForThrottling;
+    }
+
     /**
      * Returns the progress of the last checkpoint, or the current checkpoint 
if in progress, {@code null} if no checkpoint has occurred.
      */
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/PagesWriteSpeedBasedThrottle.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/PagesWriteSpeedBasedThrottle.java
index 847c5e796cd..60e99c2f27a 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/PagesWriteSpeedBasedThrottle.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/PagesWriteSpeedBasedThrottle.java
@@ -53,6 +53,8 @@ public class PagesWriteSpeedBasedThrottle implements 
PagesWriteThrottlePolicy {
      */
     static final long NO_THROTTLING_MARKER = Long.MIN_VALUE;
 
+    private final long logThresholdNanos;
+
     private final PersistentPageMemory pageMemory;
 
     private final Supplier<CheckpointProgress> cpProgress;
@@ -95,17 +97,20 @@ public class PagesWriteSpeedBasedThrottle implements 
PagesWriteThrottlePolicy {
     /**
      * Constructor.
      *
+     * @param logThresholdNanos Minimal throttling duration required for 
printing a warning message to the log.
      * @param pageMemory Page memory.
      * @param cpProgress Database manager.
      * @param stateChecker Checkpoint lock state provider.
      * @param metricSource Metric source.
      */
     public PagesWriteSpeedBasedThrottle(
+            long logThresholdNanos,
             PersistentPageMemory pageMemory,
             Supplier<CheckpointProgress> cpProgress,
             CheckpointLockStateChecker stateChecker,
             PersistentPageMemoryMetricSource metricSource
     ) {
+        this.logThresholdNanos = logThresholdNanos;
         this.pageMemory = pageMemory;
         this.cpProgress = cpProgress;
         cpLockStateChecker = stateChecker;
@@ -187,7 +192,7 @@ public class PagesWriteSpeedBasedThrottle implements 
PagesWriteThrottlePolicy {
             return;
         }
 
-        if (throttleParkTimeNs > LOGGING_THRESHOLD) {
+        if (throttleParkTimeNs > logThresholdNanos) {
             LOG.warn("Parking thread={} for timeout(ms)={}", 
Thread.currentThread().getName(), throttleParkTimeNs / 1_000_000);
         }
 
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/PagesWriteThrottlePolicy.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/PagesWriteThrottlePolicy.java
index 85cbfb888fb..7cafa5e65f1 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/PagesWriteThrottlePolicy.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/PagesWriteThrottlePolicy.java
@@ -60,9 +60,8 @@ import java.util.concurrent.TimeUnit;
  * </ul>
  */
 public interface PagesWriteThrottlePolicy {
-    // TODO Maybe make it configurable in IGNITE-24548
     /** Min park time which triggers logging. */
-    long LOGGING_THRESHOLD = TimeUnit.SECONDS.toNanos(1);
+    long DEFAULT_LOGGING_THRESHOLD = TimeUnit.SECONDS.toNanos(1);
 
     /** Checkpoint buffer fullfill upper bound. */
     float CP_BUF_FILL_THRESHOLD = 2f / 3;
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/SpeedBasedMemoryConsumptionThrottlingStrategy.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/SpeedBasedMemoryConsumptionThrottlingStrategy.java
index 8f74b2071f4..8904b92bcef 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/SpeedBasedMemoryConsumptionThrottlingStrategy.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/SpeedBasedMemoryConsumptionThrottlingStrategy.java
@@ -187,17 +187,19 @@ class SpeedBasedMemoryConsumptionThrottlingStrategy {
         detectCpPagesWriteStart(cpWrittenPages, dirtyPagesRatio);
 
         if (dirtyPagesRatio >= MAX_DIRTY_PAGES) {
-            return 0; // too late to throttle, will wait on safe to update 
instead.
+            return 0; // Too late to throttle, will wait on safe to update 
instead.
         } else {
             return getParkTime(dirtyPagesRatio,
                     donePages,
-                    notEvictedPagesTotal(cpTotalPages),
+                    // TODO IGNITE-24937 Should be a 
"notEvictedPagesTotal(cpTotalPages)" call.
+                    cpTotalPages,
                     threadIds.size(),
                     instantaneousMarkDirtySpeed,
                     avgCpWriteSpeed);
         }
     }
 
+    // TODO IGNITE-24937 Leads to negative estimations in some cases. Should 
be fixed.
     private int notEvictedPagesTotal(int cpTotalPages) {
         return Math.max(cpTotalPages - cpEvictedPages(), 0);
     }
@@ -375,7 +377,13 @@ class SpeedBasedMemoryConsumptionThrottlingStrategy {
      * Returns counter for fsynced checkpoint pages.
      */
     int cpSyncedPages() {
-        AtomicInteger syncedPagesCounter = 
cpProgress.get().syncedPagesCounter();
+        CheckpointProgress progress = cpProgress.get();
+
+        if (progress == null) {
+            return 0;
+        }
+
+        AtomicInteger syncedPagesCounter = progress.syncedPagesCounter();
 
         // Null-check simplifies testing, we don't have to mock this counter.
         return syncedPagesCounter == null ? 0 : syncedPagesCounter.get();
@@ -385,14 +393,26 @@ class SpeedBasedMemoryConsumptionThrottlingStrategy {
      * Return a number of pages in current checkpoint.
      */
     int cpTotalPages() {
-        return cpProgress.get().currentCheckpointPagesCount();
+        CheckpointProgress progress = cpProgress.get();
+
+        if (progress == null) {
+            return 0;
+        }
+
+        return progress.currentCheckpointPagesCount();
     }
 
     /**
      * Returns a number of evicted pages.
      */
     int cpEvictedPages() {
-        AtomicInteger evictedPagesCounter = 
cpProgress.get().evictedPagesCounter();
+        CheckpointProgress progress = cpProgress.get();
+
+        if (progress == null) {
+            return 0;
+        }
+
+        AtomicInteger evictedPagesCounter = progress.evictedPagesCounter();
 
         // Null-check simplifies testing, we don't have to mock this counter.
         return evictedPagesCounter == null ? 0 : evictedPagesCounter.get();
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/TargetRatioPagesWriteThrottle.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/TargetRatioPagesWriteThrottle.java
index 7bb0afe9e59..6405115e4eb 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/TargetRatioPagesWriteThrottle.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/TargetRatioPagesWriteThrottle.java
@@ -36,6 +36,8 @@ public class TargetRatioPagesWriteThrottle implements 
PagesWriteThrottlePolicy {
     /** Logger. */
     private static final IgniteLogger LOG = 
Loggers.forClass(TargetRatioPagesWriteThrottle.class);
 
+    private final long logThresholdNanos;
+
     /** Page memory. */
     private final PersistentPageMemory pageMemory;
 
@@ -68,17 +70,20 @@ public class TargetRatioPagesWriteThrottle implements 
PagesWriteThrottlePolicy {
     /**
      * Constructor.
      *
+     * @param logThresholdNanos Minimal throttling duration required for 
printing a warning message to the log.
      * @param pageMemory Page memory.
      * @param cpProgress Database manager.
      * @param stateChecker checkpoint lock state checker.
      * @param metricSource Metric source.
      */
     public TargetRatioPagesWriteThrottle(
+            long logThresholdNanos,
             PersistentPageMemory pageMemory,
             Supplier<CheckpointProgress> cpProgress,
             CheckpointLockStateChecker stateChecker,
             PersistentPageMemoryMetricSource metricSource
     ) {
+        this.logThresholdNanos = logThresholdNanos;
         this.pageMemory = pageMemory;
         this.cpProgress = cpProgress;
         this.stateChecker = stateChecker;
@@ -132,7 +137,7 @@ public class TargetRatioPagesWriteThrottle implements 
PagesWriteThrottlePolicy {
 
             Thread curThread = Thread.currentThread();
 
-            if (throttleParkTimeNs > LOGGING_THRESHOLD) {
+            if (throttleParkTimeNs > logThresholdNanos) {
                 LOG.warn("Parking thread=" + curThread.getName()
                         + " for timeout(ms)=" + 
TimeUnit.NANOSECONDS.toMillis(throttleParkTimeNs));
             }
@@ -147,7 +152,7 @@ public class TargetRatioPagesWriteThrottle implements 
PagesWriteThrottlePolicy {
                 } finally {
                     cpBufThrottledThreads.remove(curThread.getId());
 
-                    if (throttleParkTimeNs > LOGGING_THRESHOLD) {
+                    if (throttleParkTimeNs > logThresholdNanos) {
                         LOG.warn("Unparking thread=" + curThread.getName()
                                 + " with park timeout(ms)=" + 
TimeUnit.NANOSECONDS.toMillis(throttleParkTimeNs));
                     }
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/ThrottlingType.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/ThrottlingType.java
new file mode 100644
index 00000000000..87cc6c7ef1a
--- /dev/null
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/throttling/ThrottlingType.java
@@ -0,0 +1,32 @@
+/*
+ * 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.persistence.throttling;
+
+/**
+ * Available throttling types.
+ */
+public enum ThrottlingType {
+    /** Corresponds to no throttling. */
+    DISABLED,
+
+    /** Corresponds to {@link TargetRatioPagesWriteThrottle}. */
+    TARGET_RATIO,
+
+    /** Corresponds to {@link PagesWriteSpeedBasedThrottle}. */
+    SPEED_BASED
+}
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 31a56eccd33..de02151335e 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
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.pagememory.persistence.throttling;
 
 import static 
org.apache.ignite.internal.configuration.ConfigurationTestUtils.fixConfiguration;
+import static 
org.apache.ignite.internal.pagememory.persistence.throttling.PagesWriteThrottlePolicy.DEFAULT_LOGGING_THRESHOLD;
 import static 
org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertNotEquals;
@@ -372,6 +373,7 @@ public class PageMemoryThrottlingTest extends 
IgniteAbstractTest {
         PagesWriteThrottlePolicy writeThrottle;
         if (speedBasedThrottling) {
             writeThrottle = new PagesWriteSpeedBasedThrottle(
+                    DEFAULT_LOGGING_THRESHOLD,
                     pageMemory,
                     checkpointManager::currentCheckpointProgress,
                     
checkpointManager.checkpointTimeoutLock()::checkpointLockIsHeldByThread,
@@ -379,6 +381,7 @@ public class PageMemoryThrottlingTest extends 
IgniteAbstractTest {
             );
         } else {
             writeThrottle = new TargetRatioPagesWriteThrottle(
+                    DEFAULT_LOGGING_THRESHOLD,
                     pageMemory,
                     checkpointManager::currentCheckpointProgress,
                     
checkpointManager.checkpointTimeoutLock()::checkpointLockIsHeldByThread,
diff --git 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/ThrottlingTest.java
 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/ThrottlingTest.java
index 6662fc08dd2..a61cab029ac 100644
--- 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/ThrottlingTest.java
+++ 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/throttling/ThrottlingTest.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.pagememory.persistence.throttling;
 
 import static java.lang.Thread.State.TIMED_WAITING;
+import static 
org.apache.ignite.internal.pagememory.persistence.throttling.PagesWriteThrottlePolicy.DEFAULT_LOGGING_THRESHOLD;
 import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.waitForCondition;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.greaterThan;
@@ -71,7 +72,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
      */
     @Test
     public void shouldThrottleWhenWritingTooFast() {
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, null, 
stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, null, 
stateChecker, metricSource);
 
         long parkTime = throttle.getCleanPagesProtectionParkTime(0.67, (362584 
+ 67064) / 2, 328787, 1, 60184, 23103);
 
@@ -80,7 +81,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
 
     @Test
     public void shouldNotThrottleWhenWritingSlowly() {
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, null, 
stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, null, 
stateChecker, metricSource);
 
         long parkTime = throttle.getCleanPagesProtectionParkTime(0.47, 
((362584 + 67064) / 2), 328787, 1, 20103, 23103);
 
@@ -93,7 +94,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
      */
     @Test
     public void shouldNotThrottleWhenThereArePlentyCleanPages() {
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, null, 
stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, null, 
stateChecker, metricSource);
 
         long parkTime = throttle.getCleanPagesProtectionParkTime(0.0, (362584 
+ 67064) / 2, 328787, 1, 60184, 23103);
 
@@ -105,7 +106,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
      */
     @Test
     public void testCorrectTimeToPark() {
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, null, 
stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, null, 
stateChecker, metricSource);
 
         int markDirtySpeed = 34422;
         int cpWriteSpeed = 19416;
@@ -174,7 +175,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
 
     @Test
     public void beginOfCp() {
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, null, 
stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, null, 
stateChecker, metricSource);
 
         assertEquals(0, throttle.getCleanPagesProtectionParkTime(0.01, 100, 
400000, 1, 20103, 23103));
 
@@ -187,7 +188,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
 
     @Test
     public void enforceThrottleAtTheEndOfCp() {
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, null, 
stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, null, 
stateChecker, metricSource);
 
         long time1 = throttle.getCleanPagesProtectionParkTime(0.70, 300000, 
400000, 1, 20200, 23000);
         long time2 = throttle.getCleanPagesProtectionParkTime(0.71, 300000, 
400000, 1, 20200, 23000);
@@ -203,7 +204,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
 
     @Test
     public void doNotThrottleWhenDirtyPagesRatioIsTooHigh() {
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, null, 
stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, null, 
stateChecker, metricSource);
 
         // 363308 350004 348976 10604
         long time = throttle.getCleanPagesProtectionParkTime(0.75, ((350004 + 
348976) / 2), 350004 - 10604, 4, 279, 23933);
@@ -220,7 +221,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
         Supplier<CheckpointProgress> cpProgress = mock(Supplier.class);
         when(cpProgress.get()).thenReturn(cl0);
 
-        PagesWriteThrottlePolicy plc = new 
PagesWriteSpeedBasedThrottle(pageMemory2g, cpProgress, stateChecker, 
metricSource) {
+        var plc = new PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, 
pageMemory2g, cpProgress, stateChecker, metricSource) {
             @Override protected void doPark(long throttleParkTimeNs) {
                 // Force parking to long time.
                 super.doPark(TimeUnit.SECONDS.toNanos(1));
@@ -280,7 +281,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
         simulateCheckpointProgressIsStarted();
         simulateCheckpointBufferInDangerZoneSituation();
 
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, 
cpProvider, stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, 
cpProvider, stateChecker, metricSource);
 
         throttle.onMarkDirty(true);
 
@@ -301,7 +302,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
         simulateCheckpointProgressNotYetStarted();
         simulateCheckpointBufferInDangerZoneSituation();
 
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, 
cpProvider, stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, 
cpProvider, stateChecker, metricSource);
 
         throttle.onMarkDirty(true);
 
@@ -317,7 +318,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
         simulateCheckpointProgressNotYetStarted();
         simulateCheckpointBufferInSafeZoneSituation();
 
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, 
cpProvider, stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, 
cpProvider, stateChecker, metricSource);
 
         throttle.onMarkDirty(true);
 
@@ -334,7 +335,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
         // Preparations.
         simulateCheckpointProgressIsStarted();
         AtomicLong parkTimeNanos = new AtomicLong();
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, 
cpProvider, stateChecker, metricSource) {
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, 
cpProvider, stateChecker, metricSource) {
             @Override protected void doPark(long throttleParkTimeNs) {
                 super.doPark(1);
                 parkTimeNanos.set(throttleParkTimeNs);
@@ -368,7 +369,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
         // Preparations.
         simulateCheckpointProgressIsStarted();
         AtomicLong parkTimeNanos = new AtomicLong();
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, 
cpProvider, stateChecker, metricSource) {
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, 
cpProvider, stateChecker, metricSource) {
             @Override protected void doPark(long throttleParkTimeNs) {
                 super.doPark(1);
                 parkTimeNanos.set(throttleParkTimeNs);
@@ -395,7 +396,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
 
     @Test
     public void 
speedBasedThrottleShouldReportCpWriteSpeedWhenThePageIsNotInCheckpointAndProgressIsReported()
 throws InterruptedException {
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, 
cpProvider, stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, 
cpProvider, stateChecker, metricSource);
 
         simulateCheckpointProgressIsStarted();
         allowSomeTimeToPass();
@@ -410,7 +411,7 @@ public class ThrottlingTest extends IgniteAbstractTest {
 
     @Test
     public void 
speedBasedThrottleShouldResetCpProgressToZeroOnCheckpointStart() throws 
InterruptedException {
-        var throttle = new PagesWriteSpeedBasedThrottle(pageMemory2g, 
cpProvider, stateChecker, metricSource);
+        var throttle = new 
PagesWriteSpeedBasedThrottle(DEFAULT_LOGGING_THRESHOLD, pageMemory2g, 
cpProvider, stateChecker, metricSource);
 
         simulateCheckpointProgressIsStarted();
         allowSomeTimeToPass();
diff --git 
a/modules/partition-replicator/src/integrationTest/java/org/apache/ignite/internal/partition/replicator/fixtures/Node.java
 
b/modules/partition-replicator/src/integrationTest/java/org/apache/ignite/internal/partition/replicator/fixtures/Node.java
index 86d0a323847..57a98c5dd1e 100644
--- 
a/modules/partition-replicator/src/integrationTest/java/org/apache/ignite/internal/partition/replicator/fixtures/Node.java
+++ 
b/modules/partition-replicator/src/integrationTest/java/org/apache/ignite/internal/partition/replicator/fixtures/Node.java
@@ -78,6 +78,7 @@ import 
org.apache.ignite.internal.configuration.SystemDistributedConfiguration;
 import 
org.apache.ignite.internal.configuration.SystemDistributedExtensionConfiguration;
 import 
org.apache.ignite.internal.configuration.SystemDistributedExtensionConfigurationSchema;
 import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
+import 
org.apache.ignite.internal.configuration.SystemLocalExtensionConfigurationSchema;
 import 
org.apache.ignite.internal.configuration.storage.DistributedConfigurationStorage;
 import 
org.apache.ignite.internal.configuration.storage.LocalFileConfigurationStorage;
 import 
org.apache.ignite.internal.configuration.validation.TestConfigurationValidator;
@@ -341,6 +342,7 @@ public class Node {
                 List.of(
                         NetworkExtensionConfigurationSchema.class,
                         StorageExtensionConfigurationSchema.class,
+                        SystemLocalExtensionConfigurationSchema.class,
                         
PersistentPageMemoryStorageEngineExtensionConfigurationSchema.class,
                         
VolatilePageMemoryStorageEngineExtensionConfigurationSchema.class
                 ),
diff --git 
a/modules/runner/src/testFixtures/java/org/apache/ignite/internal/testframework/TestIgnitionManager.java
 
b/modules/runner/src/testFixtures/java/org/apache/ignite/internal/testframework/TestIgnitionManager.java
index eee0c74ff73..5a5bda06e2b 100644
--- 
a/modules/runner/src/testFixtures/java/org/apache/ignite/internal/testframework/TestIgnitionManager.java
+++ 
b/modules/runner/src/testFixtures/java/org/apache/ignite/internal/testframework/TestIgnitionManager.java
@@ -66,7 +66,8 @@ public class TestIgnitionManager {
             "ignite.storage.profiles.default_aimem.initSize", 
Integer.toString(256 * MiB),
             "ignite.storage.profiles.default_aimem.maxSize", 
Integer.toString(256 * MiB),
             "ignite.storage.profiles.default.engine", "aipersist",
-            "ignite.storage.profiles.default.size", Integer.toString(256 * MiB)
+            "ignite.storage.profiles.default.size", Integer.toString(256 * 
MiB),
+            "ignite.system.properties.aipersistThrottling", "disabled"
     );
 
     /** Map with default cluster configuration values. */
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataRegion.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataRegion.java
index 3dd5e942512..9d0bf90128a 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataRegion.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataRegion.java
@@ -18,13 +18,20 @@
 package org.apache.ignite.internal.storage.pagememory;
 
 import static 
org.apache.ignite.internal.storage.pagememory.PersistentPageMemoryStorageEngine.ENGINE_NAME;
+import static 
org.apache.ignite.internal.storage.pagememory.PersistentPageMemoryStorageEngine.THROTTLING_LOG_THRESHOLD_SYSTEM_PROPERTY;
+import static 
org.apache.ignite.internal.storage.pagememory.PersistentPageMemoryStorageEngine.THROTTLING_TYPE_SYSTEM_PROPERTY;
 import static org.apache.ignite.internal.util.Constants.GiB;
 import static org.apache.ignite.internal.util.Constants.MiB;
 
 import java.nio.ByteBuffer;
 import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
+import org.apache.ignite.internal.configuration.SystemPropertyView;
 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.DataRegion;
 import org.apache.ignite.internal.pagememory.FullPageId;
@@ -37,13 +44,21 @@ import 
org.apache.ignite.internal.pagememory.persistence.PersistentPageMemoryMet
 import 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointManager;
 import 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointProgress;
 import 
org.apache.ignite.internal.pagememory.persistence.store.FilePageStoreManager;
+import 
org.apache.ignite.internal.pagememory.persistence.throttling.PagesWriteSpeedBasedThrottle;
+import 
org.apache.ignite.internal.pagememory.persistence.throttling.PagesWriteThrottlePolicy;
+import 
org.apache.ignite.internal.pagememory.persistence.throttling.TargetRatioPagesWriteThrottle;
+import 
org.apache.ignite.internal.pagememory.persistence.throttling.ThrottlingType;
 import org.apache.ignite.internal.storage.StorageException;
 import org.apache.ignite.internal.util.OffheapReadWriteLock;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Implementation of {@link DataRegion} for persistent case.
  */
 class PersistentPageMemoryDataRegion implements 
DataRegion<PersistentPageMemory> {
+    /** Logger. */
+    private static final IgniteLogger LOG = 
Loggers.forClass(PersistentPageMemoryDataRegion.class);
+
     /**
      * Threshold to calculate limit for pages list on-heap caches.
      *
@@ -63,6 +78,9 @@ class PersistentPageMemoryDataRegion implements 
DataRegion<PersistentPageMemory>
 
     private final PersistentPageMemoryProfileConfiguration cfg;
 
+    /** Can only be null in tests. Saves us from a bunch of mocking. */
+    private final @Nullable SystemLocalConfiguration systemLocalConfig;
+
     private final PageIoRegistry ioRegistry;
 
     private final int pageSize;
@@ -84,15 +102,17 @@ class PersistentPageMemoryDataRegion implements 
DataRegion<PersistentPageMemory>
      *
      * @param metricManager Metric manager.
      * @param cfg Data region configuration.
+     * @param systemLocalConfig Local system configuration.
      * @param ioRegistry IO registry.
      * @param filePageStoreManager File page store manager.
      * @param partitionMetaManager Partition meta information manager.
      * @param checkpointManager Checkpoint manager.
      * @param pageSize Page size in bytes.
      */
-    public PersistentPageMemoryDataRegion(
+    PersistentPageMemoryDataRegion(
             MetricManager metricManager,
             PersistentPageMemoryProfileConfiguration cfg,
+            @Nullable SystemLocalConfiguration systemLocalConfig,
             PageIoRegistry ioRegistry,
             FilePageStoreManager filePageStoreManager,
             PartitionMetaManager partitionMetaManager,
@@ -101,6 +121,7 @@ class PersistentPageMemoryDataRegion implements 
DataRegion<PersistentPageMemory>
     ) {
         this.metricManager = metricManager;
         this.cfg = cfg;
+        this.systemLocalConfig = systemLocalConfig;
         this.ioRegistry = ioRegistry;
         this.pageSize = pageSize;
 
@@ -130,6 +151,8 @@ class PersistentPageMemoryDataRegion implements 
DataRegion<PersistentPageMemory>
                 new 
OffheapReadWriteLock(OffheapReadWriteLock.DEFAULT_CONCURRENCY_LEVEL)
         );
 
+        initThrottling(pageMemory);
+
         pageMemory.start();
 
         metricManager.registerSource(metricSource);
@@ -140,6 +163,90 @@ class PersistentPageMemoryDataRegion implements 
DataRegion<PersistentPageMemory>
         this.pageMemory = pageMemory;
     }
 
+    // TODO IGNITE-24933 refactor.
+    private void initThrottling(PersistentPageMemory pageMemory) {
+        ThrottlingType throttlingType = getThrottlingType();
+
+        long logThresholdNanos = getLoggingThreshold();
+
+        switch (throttlingType) {
+            case DISABLED:
+                break;
+
+            case TARGET_RATIO:
+                pageMemory.initThrottling(new TargetRatioPagesWriteThrottle(
+                        logThresholdNanos,
+                        pageMemory,
+                        
checkpointManager::currentCheckpointProgressForThrottling,
+                        
checkpointManager.checkpointTimeoutLock()::checkpointLockIsHeldByThread,
+                        metricSource
+                ));
+                break;
+
+            case SPEED_BASED:
+                pageMemory.initThrottling(new PagesWriteSpeedBasedThrottle(
+                        logThresholdNanos,
+                        pageMemory,
+                        
checkpointManager::currentCheckpointProgressForThrottling,
+                        
checkpointManager.checkpointTimeoutLock()::checkpointLockIsHeldByThread,
+                        metricSource
+                ));
+                break;
+
+            default:
+                assert false : "Impossible throttling type: " + throttlingType;
+        }
+    }
+
+    private ThrottlingType getThrottlingType() {
+        SystemPropertyView throttlingTypeCfg = systemLocalConfig == null
+                ? null
+                : 
systemLocalConfig.value().properties().get(THROTTLING_TYPE_SYSTEM_PROPERTY);
+
+        ThrottlingType throttlingType = ThrottlingType.SPEED_BASED;
+
+        if (throttlingTypeCfg != null) {
+            try {
+                throttlingType = 
ThrottlingType.valueOf(throttlingTypeCfg.name().toUpperCase());
+            } catch (IllegalArgumentException e) {
+                LOG.warn(
+                        "Invalid throttling configuration {}={}, using default 
value {}",
+                        THROTTLING_LOG_THRESHOLD_SYSTEM_PROPERTY,
+                        throttlingTypeCfg.propertyValue(),
+                        throttlingType
+                );
+            }
+        }
+        return throttlingType;
+    }
+
+    private long getLoggingThreshold() {
+        SystemPropertyView logThresholdCfg = systemLocalConfig == null
+                ? null
+                : 
systemLocalConfig.value().properties().get(THROTTLING_LOG_THRESHOLD_SYSTEM_PROPERTY);
+
+        long logThresholdNanos = 
PagesWriteThrottlePolicy.DEFAULT_LOGGING_THRESHOLD;
+        try {
+            if (logThresholdCfg != null) {
+                long logThresholdMillis = 
Long.parseLong(logThresholdCfg.name());
+
+                if (logThresholdMillis <= 0) {
+                    throw new IllegalArgumentException();
+                }
+
+                logThresholdNanos = 
TimeUnit.MILLISECONDS.toNanos(logThresholdMillis);
+            }
+        } catch (Exception e) {
+            LOG.warn(
+                    "Invalid throttling configuration {}={}, using default 
value {}",
+                    THROTTLING_LOG_THRESHOLD_SYSTEM_PROPERTY,
+                    logThresholdCfg.propertyValue(),
+                    TimeUnit.NANOSECONDS.toMillis(logThresholdNanos)
+            );
+        }
+        return logThresholdNanos;
+    }
+
     /**
      * Stops a persistent data region.
      */
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataStorageModule.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataStorageModule.java
index bba04e7329a..bf240511a62 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataStorageModule.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataStorageModule.java
@@ -25,6 +25,8 @@ import java.util.concurrent.ScheduledExecutorService;
 import org.apache.ignite.internal.components.LogSyncer;
 import org.apache.ignite.internal.components.LongJvmPauseDetector;
 import org.apache.ignite.internal.configuration.ConfigurationRegistry;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
+import 
org.apache.ignite.internal.configuration.SystemLocalExtensionConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.hlc.HybridClock;
 import org.apache.ignite.internal.metrics.MetricManager;
@@ -60,6 +62,8 @@ public class PersistentPageMemoryDataStorageModule implements 
DataStorageModule
     ) throws StorageException {
         StorageConfiguration storageConfig = 
configRegistry.getConfiguration(StorageExtensionConfiguration.KEY).storage();
 
+        SystemLocalConfiguration systemLocalConfig = 
configRegistry.getConfiguration(SystemLocalExtensionConfiguration.KEY).system();
+
         PageIoRegistry ioRegistry = new PageIoRegistry();
 
         ioRegistry.loadFromServiceLoader();
@@ -68,6 +72,7 @@ public class PersistentPageMemoryDataStorageModule implements 
DataStorageModule
                 igniteInstanceName,
                 metricManager,
                 storageConfig,
+                systemLocalConfig,
                 ioRegistry,
                 storagePath,
                 longJvmPauseDetector,
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 e908f60adab..3f7eba7dfb3 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
@@ -31,6 +31,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.Stream;
 import org.apache.ignite.internal.components.LogSyncer;
 import org.apache.ignite.internal.components.LongJvmPauseDetector;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.fileio.AsyncFileIoFactory;
 import org.apache.ignite.internal.fileio.FileIoFactory;
@@ -70,6 +71,10 @@ public class PersistentPageMemoryStorageEngine extends 
AbstractPageMemoryStorage
      */
     public static final int MAX_DESTRUCTION_WORK_UNITS = 1_000;
 
+    public static final String THROTTLING_TYPE_SYSTEM_PROPERTY = 
"aipersistThrottling";
+
+    public static final String THROTTLING_LOG_THRESHOLD_SYSTEM_PROPERTY = 
"aipersistThrottlingLogThresholdMillis";
+
     private static final IgniteLogger LOG = 
Loggers.forClass(PersistentPageMemoryStorageEngine.class);
 
     private final String igniteInstanceName;
@@ -80,6 +85,8 @@ public class PersistentPageMemoryStorageEngine extends 
AbstractPageMemoryStorage
 
     private final StorageConfiguration storageConfig;
 
+    private final @Nullable SystemLocalConfiguration systemLocalConfig;
+
     private final PageIoRegistry ioRegistry;
 
     private final Path storagePath;
@@ -109,6 +116,7 @@ public class PersistentPageMemoryStorageEngine extends 
AbstractPageMemoryStorage
      *
      * @param igniteInstanceName Ignite instance name.
      * @param storageConfig Storage engine and storage profiles configurations.
+     * @param systemLocalConfig Local system configuration.
      * @param ioRegistry IO registry.
      * @param storagePath Storage path.
      * @param longJvmPauseDetector Long JVM pause detector.
@@ -120,6 +128,7 @@ public class PersistentPageMemoryStorageEngine extends 
AbstractPageMemoryStorage
             String igniteInstanceName,
             MetricManager metricManager,
             StorageConfiguration storageConfig,
+            @Nullable SystemLocalConfiguration systemLocalConfig,
             PageIoRegistry ioRegistry,
             Path storagePath,
             @Nullable LongJvmPauseDetector longJvmPauseDetector,
@@ -133,6 +142,7 @@ public class PersistentPageMemoryStorageEngine extends 
AbstractPageMemoryStorage
         this.metricManager = metricManager;
         this.storageConfig = storageConfig;
         this.engineConfig = 
((PersistentPageMemoryStorageEngineExtensionConfiguration) 
storageConfig.engines()).aipersist();
+        this.systemLocalConfig = systemLocalConfig;
         this.ioRegistry = ioRegistry;
         this.storagePath = storagePath;
         this.longJvmPauseDetector = longJvmPauseDetector;
@@ -305,6 +315,7 @@ public class PersistentPageMemoryStorageEngine extends 
AbstractPageMemoryStorage
         PersistentPageMemoryDataRegion dataRegion = new 
PersistentPageMemoryDataRegion(
                 metricManager,
                 storageProfileConfiguration,
+                systemLocalConfig,
                 ioRegistry,
                 filePageStoreManager,
                 partitionMetaManager,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryMvTableStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryMvTableStorageTest.java
index 2ec430baf6f..ec2796ac441 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryMvTableStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryMvTableStorageTest.java
@@ -69,6 +69,7 @@ public class PersistentPageMemoryMvTableStorageTest extends 
AbstractMvTableStora
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
+                null,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/PersistentPageMemoryStorageEngineTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/PersistentPageMemoryStorageEngineTest.java
index e5b52f27808..33e0509d1d4 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/PersistentPageMemoryStorageEngineTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/PersistentPageMemoryStorageEngineTest.java
@@ -53,6 +53,7 @@ public class PersistentPageMemoryStorageEngineTest extends 
AbstractStorageEngine
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
+                null,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemoryHashIndexStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemoryHashIndexStorageTest.java
index 21a8fc7fcc3..5f49f8e7fb1 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemoryHashIndexStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemoryHashIndexStorageTest.java
@@ -61,6 +61,7 @@ class PersistentPageMemoryHashIndexStorageTest extends 
AbstractPageMemoryHashInd
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
+                null,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemorySortedIndexStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemorySortedIndexStorageTest.java
index fd604a06ee7..d680fd97365 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemorySortedIndexStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemorySortedIndexStorageTest.java
@@ -60,6 +60,7 @@ class PersistentPageMemorySortedIndexStorageTest extends 
AbstractPageMemorySorte
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
+                null,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageConcurrencyTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageConcurrencyTest.java
index db0f9bad631..f64c3c263c8 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageConcurrencyTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageConcurrencyTest.java
@@ -60,6 +60,7 @@ class PersistentPageMemoryMvPartitionStorageConcurrencyTest 
extends AbstractMvPa
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
+                null,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageGcTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageGcTest.java
index 127bc5c0d1f..1b50124ca63 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageGcTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageGcTest.java
@@ -60,6 +60,7 @@ class PersistentPageMemoryMvPartitionStorageGcTest extends 
AbstractMvPartitionSt
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
+                null,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
index feda3c9ee70..28e325b928a 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
@@ -71,6 +71,7 @@ class PersistentPageMemoryMvPartitionStorageTest extends 
AbstractPageMemoryMvPar
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
+                null,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvTableStorageConcurrencyTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvTableStorageConcurrencyTest.java
index 66ff8fa6c29..96b02dae1b1 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvTableStorageConcurrencyTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvTableStorageConcurrencyTest.java
@@ -57,6 +57,7 @@ class PersistentPageMemoryMvTableStorageConcurrencyTest 
extends AbstractMvTableS
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
+                null,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerRecoveryTest.java
 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerRecoveryTest.java
index 713d4b4aa52..fc80606ee9d 100644
--- 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerRecoveryTest.java
+++ 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerRecoveryTest.java
@@ -122,7 +122,6 @@ import 
org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.storage.DataStorageModule;
 import org.apache.ignite.internal.storage.DataStorageModules;
 import org.apache.ignite.internal.storage.StorageException;
-import org.apache.ignite.internal.storage.configurations.StorageConfiguration;
 import 
org.apache.ignite.internal.storage.configurations.StorageExtensionConfiguration;
 import org.apache.ignite.internal.storage.engine.MvTableStorage;
 import org.apache.ignite.internal.storage.engine.StorageEngine;
@@ -169,8 +168,8 @@ public class TableManagerRecoveryTest extends 
IgniteAbstractTest {
     private static final long WAIT_TIMEOUT = SECONDS.toMillis(10);
 
     // Configuration
-    @InjectConfiguration("mock.profiles.default = {engine = aipersist}")
-    private StorageConfiguration storageConfiguration;
+    @InjectConfiguration("mock.storage = {profiles.default = {engine = 
\"aipersist\"}}")
+    private NodeConfiguration nodeConfiguration;
     @InjectConfiguration
     private GcConfiguration gcConfig;
     @InjectConfiguration
@@ -497,9 +496,7 @@ public class TableManagerRecoveryTest extends 
IgniteAbstractTest {
     private DataStorageManager createDataStorageManager() {
         ConfigurationRegistry mockedRegistry = 
mock(ConfigurationRegistry.class);
 
-        StorageExtensionConfiguration mock = 
mock(StorageExtensionConfiguration.class);
-        
when(mockedRegistry.getConfiguration(NodeConfiguration.KEY)).thenReturn(mock);
-        when(mock.storage()).thenReturn(storageConfiguration);
+        
when(mockedRegistry.getConfiguration(NodeConfiguration.KEY)).thenReturn(nodeConfiguration);
 
         DataStorageModules dataStorageModules = new 
DataStorageModules(List.of(dataStorageModule));
 
@@ -515,7 +512,7 @@ public class TableManagerRecoveryTest extends 
IgniteAbstractTest {
                         clock,
                         scheduledExecutor
                 ),
-                storageConfiguration
+                ((StorageExtensionConfiguration) nodeConfiguration).storage()
         );
 
         assertThat(manager.startAsync(new ComponentContext()), 
willCompleteSuccessfully());
diff --git 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
index 05258392587..aa3be3db92c 100644
--- 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
+++ 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/TableManagerTest.java
@@ -127,7 +127,6 @@ import 
org.apache.ignite.internal.storage.DataStorageManager;
 import org.apache.ignite.internal.storage.DataStorageModules;
 import org.apache.ignite.internal.storage.MvPartitionStorage;
 import org.apache.ignite.internal.storage.PartitionTimestampCursor;
-import org.apache.ignite.internal.storage.configurations.StorageConfiguration;
 import 
org.apache.ignite.internal.storage.configurations.StorageExtensionConfiguration;
 import org.apache.ignite.internal.storage.engine.MvTableStorage;
 import 
org.apache.ignite.internal.storage.pagememory.PersistentPageMemoryDataStorageModule;
@@ -237,12 +236,12 @@ public class TableManagerTest extends IgniteAbstractTest {
     @InjectConfiguration
     private ReplicationConfiguration replicationConfiguration;
 
-    @InjectConfiguration("mock = {profiles.default = {engine = 
\"aipersist\"}}")
-    private StorageConfiguration storageConfiguration;
-
     @InjectConfiguration
     private SystemDistributedConfiguration systemDistributedConfiguration;
 
+    @InjectConfiguration("mock.storage = {profiles.default = {engine = 
\"aipersist\"}}")
+    private NodeConfiguration nodeConfiguration;
+
     @Mock
     private ConfigurationRegistry configRegistry;
 
@@ -934,9 +933,7 @@ public class TableManagerTest extends IgniteAbstractTest {
             ConfigurationRegistry mockedRegistry,
             Path storagePath
     ) {
-        StorageExtensionConfiguration mock = 
mock(StorageExtensionConfiguration.class);
-        
when(mockedRegistry.getConfiguration(NodeConfiguration.KEY)).thenReturn(mock);
-        when(mock.storage()).thenReturn(storageConfiguration);
+        
when(mockedRegistry.getConfiguration(NodeConfiguration.KEY)).thenReturn(nodeConfiguration);
 
         DataStorageModules dataStorageModules = new DataStorageModules(
                 List.of(new PersistentPageMemoryDataStorageModule())
@@ -954,7 +951,7 @@ public class TableManagerTest extends IgniteAbstractTest {
                         clock,
                         scheduledExecutor
                 ),
-                storageConfiguration
+                ((StorageExtensionConfiguration) nodeConfiguration).storage()
         );
 
         assertThat(manager.startAsync(new ComponentContext()), 
willCompleteSuccessfully());
diff --git 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/PersistentPageMemoryGcUpdateHandlerTest.java
 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/PersistentPageMemoryGcUpdateHandlerTest.java
index 8e0f16ac6f3..349003016f1 100644
--- 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/PersistentPageMemoryGcUpdateHandlerTest.java
+++ 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/PersistentPageMemoryGcUpdateHandlerTest.java
@@ -67,6 +67,7 @@ class PersistentPageMemoryGcUpdateHandlerTest extends 
AbstractGcUpdateHandlerTes
                 nodeName,
                 mock(MetricManager.class),
                 storageConfig,
+                null,
                 ioRegistry,
                 workDir,
                 new LongJvmPauseDetector(nodeName),

Reply via email to