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 c63f70190 IGNITE-16998 [Native Persistence 3.0] Add configuration for 
checkpoint (#812)
c63f70190 is described below

commit c63f701900a9429d7064669512380c9fb146bde0
Author: Kirill Tkalenko <[email protected]>
AuthorDate: Thu May 26 13:39:50 2022 +0300

    IGNITE-16998 [Native Persistence 3.0] Add configuration for checkpoint 
(#812)
---
 .../ClientConnectorConfigurationSchema.java        | 12 ++-
 .../compute/ComputeConfigurationSchema.java        |  6 +-
 .../network/InboundConfigurationSchema.java        |  8 +-
 .../network/NetworkConfigurationSchema.java        | 12 ++-
 .../network/OutboundConfigurationSchema.java       |  6 +-
 .../schemas/rest/RestConfigurationSchema.java      |  8 +-
 .../table/ColumnTypeConfigurationSchema.java       |  8 +-
 .../schemas/table/TableConfigurationSchema.java    |  8 +-
 .../configuration/validation/ExceptKeys.java       |  2 -
 .../ignite/configuration/validation/OneOf.java     |  4 -
 .../validation/{Min.java => PowerOfTwo.java}       | 19 ++---
 .../validation/{Max.java => Range.java}            | 22 +++---
 .../configuration/ConfigurationRegistry.java       | 12 +--
 ...{MaxValidator.java => PowerOfTwoValidator.java} | 14 ++--
 .../{MinValidator.java => RangeValidator.java}     | 20 +++--
 .../sample/AutoAdjustConfigurationSchema.java      |  4 +-
 .../sample/CacheConfigurationSchema.java           |  4 +-
 .../validation/PowerOfTwoValidatorTest.java        | 52 +++++++++++++
 .../validation/RangeValidatorTest.java             | 90 ++++++++++++++++++++++
 .../apache/ignite/internal/util/IgniteUtils.java   |  9 +++
 .../ignite/internal/util/IgniteUtilsTest.java      | 23 ++++++
 .../persistence/ItBplusTreePageMemoryImplTest.java |  7 +-
 .../ItBplusTreeReuseListPageMemoryImplTest.java    |  7 +-
 .../tree/ItBplusTreeReplaceRemoveRaceTest.java     |  7 +-
 .../pagememory/tree/ItBplusTreeSelfTest.java       |  7 +-
 .../PageMemoryCheckpointConfigurationSchema.java   | 75 ++++++++++++++++++
 .../PageMemoryDataRegionConfigurationSchema.java   | 13 ++--
 .../pagememory/impl/PageMemoryNoStoreImpl.java     | 33 ++++----
 .../pagememory/persistence/PageMemoryImpl.java     | 47 +++++------
 .../checkpoint/CheckpointPagesWriterFactory.java   |  1 +
 .../persistence/checkpoint/CheckpointWorkflow.java | 21 ++---
 .../persistence/checkpoint/Checkpointer.java       | 32 +++-----
 .../replacement/DelayedDirtyPageStoreWrite.java    |  1 +
 .../replacement/DelayedPageReplacementTracker.java |  1 +
 .../pagememory/freelist/AbstractFreeListTest.java  |  7 +-
 .../pagememory/impl/PageMemoryNoLoadSelfTest.java  | 11 ++-
 .../persistence/PageMemoryImplNoLoadTest.java      |  9 ++-
 .../checkpoint/CheckpointWorkflowTest.java         | 24 ++++--
 .../persistence/checkpoint/CheckpointerTest.java   | 63 +++++++--------
 .../pagememory/AbstractPageMemoryDataRegion.java   |  6 +-
 .../pagememory/PageMemoryStorageEngine.java        | 13 +++-
 .../pagememory/VolatilePageMemoryDataRegion.java   | 17 +++-
 ...PageMemoryStorageEngineConfigurationSchema.java | 11 +++
 .../pagememory/PageMemoryPartitionStorageTest.java |  2 +-
 .../RocksDbDataRegionConfigurationSchema.java      |  6 +-
 45 files changed, 511 insertions(+), 253 deletions(-)

diff --git 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/clientconnector/ClientConnectorConfigurationSchema.java
 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/clientconnector/ClientConnectorConfigurationSchema.java
index 23fdd1d5b..8fc511fb6 100644
--- 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/clientconnector/ClientConnectorConfigurationSchema.java
+++ 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/clientconnector/ClientConnectorConfigurationSchema.java
@@ -20,8 +20,7 @@ package 
org.apache.ignite.configuration.schemas.clientconnector;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.ConfigurationType;
 import org.apache.ignite.configuration.annotation.Value;
-import org.apache.ignite.configuration.validation.Max;
-import org.apache.ignite.configuration.validation.Min;
+import org.apache.ignite.configuration.validation.Range;
 
 /**
  * Configuration schema for thin client connector.
@@ -30,23 +29,22 @@ import org.apache.ignite.configuration.validation.Min;
 @ConfigurationRoot(rootName = "clientConnector", type = 
ConfigurationType.LOCAL)
 public class ClientConnectorConfigurationSchema {
     /** TCP port. */
-    @Min(1024)
-    @Max(0xFFFF)
+    @Range(min = 1024, max = 0xFFFF)
     @Value(hasDefault = true)
     public final int port = 10800;
 
     /** TCP port range. */
-    @Min(0)
+    @Range(min = 0)
     @Value(hasDefault = true)
     public final int portRange = 100;
 
     /** Connect timeout. */
-    @Min(0)
+    @Range(min = 0)
     @Value(hasDefault = true)
     public final int connectTimeout = 5000;
 
     /** Idle timeout. */
-    @Min(0)
+    @Range(min = 0)
     @Value(hasDefault = true)
     public final long idleTimeout = 0;
 }
diff --git 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/compute/ComputeConfigurationSchema.java
 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/compute/ComputeConfigurationSchema.java
index 9146f5785..604cd534e 100644
--- 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/compute/ComputeConfigurationSchema.java
+++ 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/compute/ComputeConfigurationSchema.java
@@ -22,7 +22,7 @@ import static java.lang.Math.max;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.ConfigurationType;
 import org.apache.ignite.configuration.annotation.Value;
-import org.apache.ignite.configuration.validation.Min;
+import org.apache.ignite.configuration.validation.Range;
 
 /**
  * Configuration schema for Compute functionality.
@@ -31,12 +31,12 @@ import org.apache.ignite.configuration.validation.Min;
 @ConfigurationRoot(rootName = "compute", type = ConfigurationType.LOCAL)
 public class ComputeConfigurationSchema {
     /** Job thread pool size. */
-    @Min(1)
+    @Range(min = 1)
     @Value(hasDefault = true)
     public final int threadPoolSize = 
max(Runtime.getRuntime().availableProcessors(), 8);
 
     /** Job thread pool stop timeout (milliseconds). */
-    @Min(1)
+    @Range(min = 1)
     @Value(hasDefault = true)
     public final long threadPoolStopTimeoutMillis = 10_000;
 }
diff --git 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/InboundConfigurationSchema.java
 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/InboundConfigurationSchema.java
index 752313a61..95c536f0a 100644
--- 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/InboundConfigurationSchema.java
+++ 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/InboundConfigurationSchema.java
@@ -19,8 +19,7 @@ package org.apache.ignite.configuration.schemas.network;
 
 import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.Value;
-import org.apache.ignite.configuration.validation.Max;
-import org.apache.ignite.configuration.validation.Min;
+import org.apache.ignite.configuration.validation.Range;
 
 /**
  * Server socket configuration. See <a 
href="https://man7.org/linux/man-pages/man7/tcp.7.html";>TCP docs</a> and
@@ -29,7 +28,7 @@ import org.apache.ignite.configuration.validation.Min;
 @Config
 public class InboundConfigurationSchema {
     /** Backlog value. */
-    @Min(0)
+    @Range(min = 0)
     @Value(hasDefault = true)
     public final int soBacklog = 128;
 
@@ -42,8 +41,7 @@ public class InboundConfigurationSchema {
     public final boolean soKeepAlive = true;
 
     /** Socket close linger value. */
-    @Min(0)
-    @Max(0xFFFF)
+    @Range(min = 0, max = 0xFFFF)
     @Value(hasDefault = true)
     public final int soLinger = 0;
 
diff --git 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/NetworkConfigurationSchema.java
 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/NetworkConfigurationSchema.java
index dcdd3477e..69679a64e 100644
--- 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/NetworkConfigurationSchema.java
+++ 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/NetworkConfigurationSchema.java
@@ -21,8 +21,7 @@ import org.apache.ignite.configuration.annotation.ConfigValue;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.ConfigurationType;
 import org.apache.ignite.configuration.annotation.Value;
-import org.apache.ignite.configuration.validation.Max;
-import org.apache.ignite.configuration.validation.Min;
+import org.apache.ignite.configuration.validation.Range;
 
 /**
  * Configuration schema for network endpoint subtree.
@@ -30,13 +29,12 @@ import org.apache.ignite.configuration.validation.Min;
 @ConfigurationRoot(rootName = "network", type = ConfigurationType.LOCAL)
 public class NetworkConfigurationSchema {
     /** Network port. */
-    @Min(1024)
-    @Max(0xFFFF)
+    @Range(min = 1024, max = 0xFFFF)
     @Value(hasDefault = true)
     public final int port = 47500;
 
     /** Network port range. */
-    @Min(0)
+    @Range(min = 0)
     @Value(hasDefault = true)
     public final int portRange = 0;
 
@@ -45,7 +43,7 @@ public class NetworkConfigurationSchema {
      * <i>'the quiet period'</i> before it shuts itself down. If a task is 
submitted during the quiet period,
      * it is guaranteed to be accepted and the quiet period will start over.
      */
-    @Min(0)
+    @Range(min = 0)
     @Value(hasDefault = true)
     public final long shutdownQuietPeriod = 0;
 
@@ -53,7 +51,7 @@ public class NetworkConfigurationSchema {
      * The maximum amount of time to wait until each Netty's 
EventExecutorGroup is shutdown regardless if a new network message was
      * submitted during the quiet period.
      */
-    @Min(0)
+    @Range(min = 0)
     @Value(hasDefault = true)
     public final long shutdownTimeout = 15_000;
 
diff --git 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/OutboundConfigurationSchema.java
 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/OutboundConfigurationSchema.java
index ece724bea..dd0d591b8 100644
--- 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/OutboundConfigurationSchema.java
+++ 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/network/OutboundConfigurationSchema.java
@@ -19,8 +19,7 @@ package org.apache.ignite.configuration.schemas.network;
 
 import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.Value;
-import org.apache.ignite.configuration.validation.Max;
-import org.apache.ignite.configuration.validation.Min;
+import org.apache.ignite.configuration.validation.Range;
 
 /** Client socket configuration. See <a 
href="https://man7.org/linux/man-pages/man7/tcp.7.html";>TCP docs</a> and
  * <a href="https://man7.org/linux/man-pages/man7/socket.7.html";>socket 
docs</a>.
@@ -32,8 +31,7 @@ public class OutboundConfigurationSchema {
     public final boolean soKeepAlive = true;
 
     /** Socket close linger value. */
-    @Min(0)
-    @Max(0xFFFF)
+    @Range(min = 0, max = 0xFFFF)
     @Value(hasDefault = true)
     public final int soLinger = 0;
 
diff --git 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/rest/RestConfigurationSchema.java
 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/rest/RestConfigurationSchema.java
index 54a765762..39bd3691b 100644
--- 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/rest/RestConfigurationSchema.java
+++ 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/rest/RestConfigurationSchema.java
@@ -20,8 +20,7 @@ package org.apache.ignite.configuration.schemas.rest;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.ConfigurationType;
 import org.apache.ignite.configuration.annotation.Value;
-import org.apache.ignite.configuration.validation.Max;
-import org.apache.ignite.configuration.validation.Min;
+import org.apache.ignite.configuration.validation.Range;
 
 /**
  * Configuration schema for REST endpoint subtree.
@@ -30,13 +29,12 @@ import org.apache.ignite.configuration.validation.Min;
 @ConfigurationRoot(rootName = "rest", type = ConfigurationType.LOCAL)
 public class RestConfigurationSchema {
     /** TCP port. */
-    @Min(1024)
-    @Max(0xFFFF)
+    @Range(min = 1024, max = 0xFFFF)
     @Value(hasDefault = true)
     public final int port = 10300;
 
     /** TCP port range. */
-    @Min(0)
+    @Range(min = 0)
     @Value(hasDefault = true)
     public final int portRange = 100;
 }
diff --git 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/ColumnTypeConfigurationSchema.java
 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/ColumnTypeConfigurationSchema.java
index e9ec6477b..f0edbe7aa 100644
--- 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/ColumnTypeConfigurationSchema.java
+++ 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/ColumnTypeConfigurationSchema.java
@@ -20,7 +20,7 @@ package org.apache.ignite.configuration.schemas.table;
 import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.Value;
 import org.apache.ignite.configuration.validation.Immutable;
-import org.apache.ignite.configuration.validation.Min;
+import org.apache.ignite.configuration.validation.Range;
 
 /**
  * Configuration for SQL table column type.
@@ -35,18 +35,18 @@ public class ColumnTypeConfigurationSchema {
     /** Length. */
     @Value(hasDefault = true)
     @Immutable
-    @Min(0)
+    @Range(min = 0)
     public int length = 0;
 
     /** Precision. */
     @Value(hasDefault = true)
     @Immutable
-    @Min(0)
+    @Range(min = 0)
     public int precision = 0;
 
     /** Scale. */
     @Value(hasDefault = true)
     @Immutable
-    @Min(0)
+    @Range(min = 0)
     public int scale = 0;
 }
diff --git 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/TableConfigurationSchema.java
 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/TableConfigurationSchema.java
index 1cbe32bc1..2844c564c 100644
--- 
a/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/TableConfigurationSchema.java
+++ 
b/modules/api/src/main/java/org/apache/ignite/configuration/schemas/table/TableConfigurationSchema.java
@@ -24,8 +24,7 @@ import 
org.apache.ignite.configuration.annotation.NamedConfigValue;
 import org.apache.ignite.configuration.annotation.Value;
 import 
org.apache.ignite.configuration.schemas.store.DataStorageConfigurationSchema;
 import org.apache.ignite.configuration.schemas.store.KnownDataStorage;
-import org.apache.ignite.configuration.validation.Max;
-import org.apache.ignite.configuration.validation.Min;
+import org.apache.ignite.configuration.validation.Range;
 
 /**
  * Table configuration schema class.
@@ -37,13 +36,12 @@ public class TableConfigurationSchema {
     public String name;
 
     /** Table partitions. */
-    @Min(0)
-    @Max(65000)
+    @Range(min = 0, max = 65_000)
     @Value(hasDefault = true)
     public int partitions = 25;
 
     /** Count of table partition replicas. */
-    @Min(1)
+    @Range(min = 1)
     @Value(hasDefault = true)
     public int replicas = 1;
 
diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/ExceptKeys.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/ExceptKeys.java
index 4de060bbd..0a03b8adc 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/ExceptKeys.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/ExceptKeys.java
@@ -32,8 +32,6 @@ import 
org.apache.ignite.configuration.annotation.NamedConfigValue;
 public @interface ExceptKeys {
     /**
      * Returns list of reserved names.
-     *
-     * @return List of reserved names.
      */
     String[] value();
 }
diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/OneOf.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/OneOf.java
index 510cfe921..5a13158d0 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/OneOf.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/OneOf.java
@@ -31,15 +31,11 @@ import java.lang.annotation.Target;
 public @interface OneOf {
     /**
      * Returns list of possible values.
-     *
-     * @return List of possible values.
      */
     String[] value();
 
     /**
      * Returns {@code true} if list is case-sensitive.
-     *
-     * @return {@code true} if list is case-sensitive.
      */
     boolean caseSensitive() default false;
 }
diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/Min.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/PowerOfTwo.java
similarity index 73%
rename from 
modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/Min.java
rename to 
modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/PowerOfTwo.java
index 6a5c5191e..c4b417f26 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/Min.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/PowerOfTwo.java
@@ -17,24 +17,17 @@
 
 package org.apache.ignite.configuration.validation;
 
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
 import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * Signifies that this value has lower limit (inclusive).
+ * Signifies that this value must be a power of two.
  */
-@Target(FIELD)
-@Retention(RUNTIME)
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
 @Documented
-public @interface Min {
-    /**
-     * Returns the lower bound for the value.
-     *
-     * @return lower bound for the value.
-     */
-    long value();
+public @interface PowerOfTwo {
 }
diff --git 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/Max.java
 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/Range.java
similarity index 72%
rename from 
modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/Max.java
rename to 
modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/Range.java
index b14dc9d4f..31faa32f5 100644
--- 
a/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/Max.java
+++ 
b/modules/configuration-api/src/main/java/org/apache/ignite/configuration/validation/Range.java
@@ -17,24 +17,26 @@
 
 package org.apache.ignite.configuration.validation;
 
-import static java.lang.annotation.ElementType.FIELD;
-import static java.lang.annotation.RetentionPolicy.RUNTIME;
-
 import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
 import java.lang.annotation.Target;
 
 /**
- * Signifies that this value has upper limit (inclusive).
+ * Signifies that this value has lower limit (inclusive) and has upper limit 
(inclusive).
  */
-@Target(FIELD)
-@Retention(RUNTIME)
+@Target(ElementType.FIELD)
+@Retention(RetentionPolicy.RUNTIME)
 @Documented
-public @interface Max {
+public @interface Range {
+    /**
+     * Returns the lower bound for the value.
+     */
+    long min() default Long.MIN_VALUE;
+
     /**
      * Returns the upper bound for the value.
-     *
-     * @return upper bound for the value.
      */
-    long value();
+    long max() default Long.MAX_VALUE;
 }
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java
index ea3312647..b0237f827 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/ConfigurationRegistry.java
@@ -57,9 +57,9 @@ import 
org.apache.ignite.configuration.notifications.ConfigurationNamedListListe
 import 
org.apache.ignite.configuration.notifications.ConfigurationNotificationEvent;
 import org.apache.ignite.configuration.validation.ExceptKeys;
 import org.apache.ignite.configuration.validation.Immutable;
-import org.apache.ignite.configuration.validation.Max;
-import org.apache.ignite.configuration.validation.Min;
 import org.apache.ignite.configuration.validation.OneOf;
+import org.apache.ignite.configuration.validation.PowerOfTwo;
+import org.apache.ignite.configuration.validation.Range;
 import org.apache.ignite.configuration.validation.Validator;
 import org.apache.ignite.internal.configuration.asm.ConfigurationAsmGenerator;
 import 
org.apache.ignite.internal.configuration.notifications.ConfigurationStorageRevisionListener;
@@ -73,9 +73,9 @@ import 
org.apache.ignite.internal.configuration.util.ConfigurationUtil;
 import org.apache.ignite.internal.configuration.util.KeyNotFoundException;
 import org.apache.ignite.internal.configuration.validation.ExceptKeysValidator;
 import org.apache.ignite.internal.configuration.validation.ImmutableValidator;
-import org.apache.ignite.internal.configuration.validation.MaxValidator;
-import org.apache.ignite.internal.configuration.validation.MinValidator;
 import org.apache.ignite.internal.configuration.validation.OneOfValidator;
+import org.apache.ignite.internal.configuration.validation.PowerOfTwoValidator;
+import org.apache.ignite.internal.configuration.validation.RangeValidator;
 import org.apache.ignite.internal.manager.IgniteComponent;
 import org.apache.ignite.lang.IgniteLogger;
 import org.jetbrains.annotations.Nullable;
@@ -134,11 +134,11 @@ public class ConfigurationRegistry implements 
IgniteComponent, ConfigurationStor
 
         Map<Class<? extends Annotation>, Set<Validator<?, ?>>> validators0 = 
new HashMap<>(validators);
 
-        addDefaultValidator(validators0, Min.class, new MinValidator());
-        addDefaultValidator(validators0, Max.class, new MaxValidator());
         addDefaultValidator(validators0, Immutable.class, new 
ImmutableValidator());
         addDefaultValidator(validators0, OneOf.class, new OneOfValidator());
         addDefaultValidator(validators0, ExceptKeys.class, new 
ExceptKeysValidator());
+        addDefaultValidator(validators0, PowerOfTwo.class, new 
PowerOfTwoValidator());
+        addDefaultValidator(validators0, Range.class, new RangeValidator());
 
         changer = new ConfigurationChanger(this::notificator, rootKeys, 
validators0, storage) {
             /** {@inheritDoc} */
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/MaxValidator.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/PowerOfTwoValidator.java
similarity index 74%
rename from 
modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/MaxValidator.java
rename to 
modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/PowerOfTwoValidator.java
index 62d8fc0c6..0ca22d172 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/MaxValidator.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/PowerOfTwoValidator.java
@@ -17,21 +17,23 @@
 
 package org.apache.ignite.internal.configuration.validation;
 
-import org.apache.ignite.configuration.validation.Max;
+import static org.apache.ignite.internal.util.IgniteUtils.isPow2;
+
+import org.apache.ignite.configuration.validation.PowerOfTwo;
 import org.apache.ignite.configuration.validation.ValidationContext;
 import org.apache.ignite.configuration.validation.ValidationIssue;
 import org.apache.ignite.configuration.validation.Validator;
 
 /**
- * Validate that field value is not greater than some maximum value.
+ * Implementing a validator for {@link PowerOfTwo}.
  */
-public class MaxValidator implements Validator<Max, Number> {
+public class PowerOfTwoValidator implements Validator<PowerOfTwo, Number> {
     /** {@inheritDoc} */
     @Override
-    public void validate(Max annotation, ValidationContext<Number> ctx) {
-        if (ctx.getNewValue().longValue() > annotation.value()) {
+    public void validate(PowerOfTwo annotation, ValidationContext<Number> ctx) 
{
+        if (!isPow2(ctx.getNewValue().longValue())) {
             ctx.addIssue(new ValidationIssue(
-                    "Configuration value '" + ctx.currentKey() + "' must not 
be greater than " + annotation.value()
+                    "Configuration value '" + ctx.currentKey() + "' must not 
be power of two"
             ));
         }
     }
diff --git 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/MinValidator.java
 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/RangeValidator.java
similarity index 66%
rename from 
modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/MinValidator.java
rename to 
modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/RangeValidator.java
index 00e4eb9c9..cffcaed57 100644
--- 
a/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/MinValidator.java
+++ 
b/modules/configuration/src/main/java/org/apache/ignite/internal/configuration/validation/RangeValidator.java
@@ -17,21 +17,29 @@
 
 package org.apache.ignite.internal.configuration.validation;
 
-import org.apache.ignite.configuration.validation.Min;
+import org.apache.ignite.configuration.validation.Range;
 import org.apache.ignite.configuration.validation.ValidationContext;
 import org.apache.ignite.configuration.validation.ValidationIssue;
 import org.apache.ignite.configuration.validation.Validator;
 
 /**
- * Validate that field value is not less than some minimal value.
+ * Implementing a validator for {@link Range}.
  */
-public class MinValidator implements Validator<Min, Number> {
+public class RangeValidator implements Validator<Range, Number> {
     /** {@inheritDoc} */
     @Override
-    public void validate(Min annotation, ValidationContext<Number> ctx) {
-        if (ctx.getNewValue().longValue() < annotation.value()) {
+    public void validate(Range annotation, ValidationContext<Number> ctx) {
+        long longValue = ctx.getNewValue().longValue();
+
+        if (longValue < annotation.min()) {
+            ctx.addIssue(new ValidationIssue(
+                    "Configuration value '" + ctx.currentKey() + "' must not 
be less than " + annotation.min()
+            ));
+        }
+
+        if (longValue > annotation.max()) {
             ctx.addIssue(new ValidationIssue(
-                    "Configuration value '" + ctx.currentKey() + "' must not 
be less than " + annotation.value()
+                    "Configuration value '" + ctx.currentKey() + "' must not 
be greater than " + annotation.max()
             ));
         }
     }
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/sample/AutoAdjustConfigurationSchema.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/sample/AutoAdjustConfigurationSchema.java
index 24f50ce00..b8a32fe8a 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/sample/AutoAdjustConfigurationSchema.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/sample/AutoAdjustConfigurationSchema.java
@@ -19,7 +19,7 @@ package org.apache.ignite.internal.configuration.sample;
 
 import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.Value;
-import org.apache.ignite.configuration.validation.Min;
+import org.apache.ignite.configuration.validation.Range;
 
 /**
  * Test auto adjust configuration schema.
@@ -28,7 +28,7 @@ import org.apache.ignite.configuration.validation.Min;
 public class AutoAdjustConfigurationSchema {
     /** Timeout. */
     @Value(hasDefault = true)
-    @Min(0)
+    @Range(min = 0)
     public long timeout = 0L;
 
     /** Enabled. */
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/sample/CacheConfigurationSchema.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/sample/CacheConfigurationSchema.java
index 56f5fe7f7..cbd88cce9 100644
--- 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/sample/CacheConfigurationSchema.java
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/sample/CacheConfigurationSchema.java
@@ -19,7 +19,7 @@ package org.apache.ignite.internal.configuration.sample;
 
 import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.Value;
-import org.apache.ignite.configuration.validation.Min;
+import org.apache.ignite.configuration.validation.Range;
 
 /**
  * Test cache configuration schema.
@@ -28,6 +28,6 @@ import org.apache.ignite.configuration.validation.Min;
 public class CacheConfigurationSchema {
     /** Size. */
     @Value
-    @Min(1)
+    @Range(min = 1)
     public int size;
 }
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/PowerOfTwoValidatorTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/PowerOfTwoValidatorTest.java
new file mode 100644
index 000000000..1c99b4e6a
--- /dev/null
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/PowerOfTwoValidatorTest.java
@@ -0,0 +1,52 @@
+/*
+ * 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.configuration.validation;
+
+import static 
org.apache.ignite.internal.configuration.validation.TestValidationUtil.mockValidationContext;
+import static 
org.apache.ignite.internal.configuration.validation.TestValidationUtil.validate;
+import static org.mockito.Mockito.mock;
+
+import org.apache.ignite.configuration.validation.PowerOfTwo;
+import org.junit.jupiter.api.Test;
+
+/**
+ * For {@link PowerOfTwoValidator} testing.
+ */
+public class PowerOfTwoValidatorTest {
+    @Test
+    void testValidationSuccess() {
+        PowerOfTwo powerOfTwo = mock(PowerOfTwo.class);
+
+        PowerOfTwoValidator validator = new PowerOfTwoValidator();
+
+        validate(validator, powerOfTwo, mockValidationContext(null, 1), null);
+        validate(validator, powerOfTwo, mockValidationContext(null, 1L), null);
+    }
+
+    @Test
+    void testValidationFail() {
+        PowerOfTwo powerOfTwo = mock(PowerOfTwo.class);
+
+        PowerOfTwoValidator validator = new PowerOfTwoValidator();
+
+        String errorMessagePrefix = "Configuration value 'null' must not be 
power of two";
+
+        validate(validator, powerOfTwo, mockValidationContext(null, 3), 
errorMessagePrefix);
+        validate(validator, powerOfTwo, mockValidationContext(null, 3L), 
errorMessagePrefix);
+    }
+}
diff --git 
a/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/RangeValidatorTest.java
 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/RangeValidatorTest.java
new file mode 100644
index 000000000..7799873d6
--- /dev/null
+++ 
b/modules/configuration/src/test/java/org/apache/ignite/internal/configuration/validation/RangeValidatorTest.java
@@ -0,0 +1,90 @@
+/*
+ * 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.configuration.validation;
+
+import static 
org.apache.ignite.internal.configuration.validation.TestValidationUtil.mockValidationContext;
+import static 
org.apache.ignite.internal.configuration.validation.TestValidationUtil.validate;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.apache.ignite.configuration.validation.Range;
+import org.jetbrains.annotations.Nullable;
+import org.junit.jupiter.api.Test;
+
+/**
+ * For {@link RangeValidator} testing.
+ */
+public class RangeValidatorTest {
+    @Test
+    void testValidationSuccess() {
+        Range range0 = createRange(0L, 100L);
+
+        RangeValidator validator = new RangeValidator();
+
+        validate(validator, range0, mockValidationContext(null, 0), null);
+        validate(validator, range0, mockValidationContext(null, 50), null);
+        validate(validator, range0, mockValidationContext(null, 100), null);
+
+        Range range1 = createRange(0L, null);
+
+        validate(validator, range1, mockValidationContext(null, 0), null);
+        validate(validator, range1, mockValidationContext(null, 50), null);
+        validate(validator, range1, mockValidationContext(null, 100), null);
+        validate(validator, range1, mockValidationContext(null, 
Long.MAX_VALUE), null);
+
+        Range range2 = createRange(null, 100L);
+
+        validate(validator, range2, mockValidationContext(null, 0), null);
+        validate(validator, range2, mockValidationContext(null, 50), null);
+        validate(validator, range2, mockValidationContext(null, 100), null);
+        validate(validator, range2, mockValidationContext(null, 
Long.MIN_VALUE), null);
+    }
+
+    @Test
+    void testValidationFail() {
+        RangeValidator validator = new RangeValidator();
+
+        String lessThanErrorPrefix = "Configuration value 'null' must not be 
less than";
+        String greaterThanErrorPrefix = "Configuration value 'null' must not 
be greater than";
+
+        Range range0 = createRange(0L, 100L);
+
+        validate(validator, range0, mockValidationContext(null, -1), 
lessThanErrorPrefix);
+        validate(validator, range0, mockValidationContext(null, 101), 
greaterThanErrorPrefix);
+
+        Range range1 = createRange(0L, null);
+
+        validate(validator, range1, mockValidationContext(null, -1), 
lessThanErrorPrefix);
+        validate(validator, range1, mockValidationContext(null, 
Long.MIN_VALUE), lessThanErrorPrefix);
+
+        Range range2 = createRange(null, 100L);
+
+        validate(validator, range2, mockValidationContext(null, 101), 
greaterThanErrorPrefix);
+        validate(validator, range2, mockValidationContext(null, 
Long.MAX_VALUE), greaterThanErrorPrefix);
+    }
+
+    private Range createRange(@Nullable Long min, @Nullable Long max) {
+        Range range = mock(Range.class);
+
+        when(range.min()).then(answer -> min == null ? 
answer.getMethod().getDefaultValue() : min);
+
+        when(range.max()).then(answer -> max == null ? 
answer.getMethod().getDefaultValue() : max);
+
+        return range;
+    }
+}
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index 82be92eca..07e7c7f8e 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -709,6 +709,15 @@ public class IgniteUtils {
         return i > 0 && (i & (i - 1)) == 0;
     }
 
+    /**
+     * Returns {@code true} If the given value is power of 2 (0 is not power 
of 2).
+     *
+     * @param i Value.
+     */
+    public static boolean isPow2(long i) {
+        return i > 0 && (i & (i - 1)) == 0;
+    }
+
     /**
      * Waits if necessary for this future to complete, and then returns its 
result ignoring interrupts.
      *
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsTest.java
index d8d6fb592..2bce7b83b 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/util/IgniteUtilsTest.java
@@ -73,6 +73,8 @@ class IgniteUtilsTest {
 
     @Test
     public void testIsPow2() {
+        // Checks int value.
+
         assertTrue(isPow2(1));
         assertTrue(isPow2(2));
         assertTrue(isPow2(4));
@@ -91,6 +93,27 @@ class IgniteUtilsTest {
         assertFalse(isPow2(6));
         assertFalse(isPow2(7));
         assertFalse(isPow2(9));
+
+        // Checks long value.
+
+        assertTrue(isPow2(1L));
+        assertTrue(isPow2(2L));
+        assertTrue(isPow2(4L));
+        assertTrue(isPow2(8L));
+        assertTrue(isPow2(16L));
+        assertTrue(isPow2(16L * 16L));
+        assertTrue(isPow2(32L * 32L));
+
+        assertFalse(isPow2(-4L));
+        assertFalse(isPow2(-3L));
+        assertFalse(isPow2(-2L));
+        assertFalse(isPow2(-1L));
+        assertFalse(isPow2(0L));
+        assertFalse(isPow2(3L));
+        assertFalse(isPow2(5L));
+        assertFalse(isPow2(6L));
+        assertFalse(isPow2(7L));
+        assertFalse(isPow2(9L));
     }
 
     @Test
diff --git 
a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/persistence/ItBplusTreePageMemoryImplTest.java
 
b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/persistence/ItBplusTreePageMemoryImplTest.java
index f2170c290..18f9e2db0 100644
--- 
a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/persistence/ItBplusTreePageMemoryImplTest.java
+++ 
b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/persistence/ItBplusTreePageMemoryImplTest.java
@@ -34,9 +34,7 @@ public class ItBplusTreePageMemoryImplTest extends 
ItBplusTreeSelfTest {
     /** {@inheritDoc} */
     @Override
     protected PageMemory createPageMemory() throws Exception {
-        dataRegionCfg
-                .change(c -> 
c.changePageSize(PAGE_SIZE).changeInitSize(MAX_MEMORY_SIZE).changeMaxSize(MAX_MEMORY_SIZE))
-                .get(1, TimeUnit.SECONDS);
+        dataRegionCfg.change(c -> 
c.changeInitSize(MAX_MEMORY_SIZE).changeMaxSize(MAX_MEMORY_SIZE)).get(1, 
TimeUnit.SECONDS);
 
         long[] sizes = LongStream.range(0, CPUS + 1).map(i -> MAX_MEMORY_SIZE 
/ CPUS).toArray();
 
@@ -55,7 +53,8 @@ public class ItBplusTreePageMemoryImplTest extends 
ItBplusTreeSelfTest {
                 (page, fullPageId, pageMemoryEx) -> {
                 },
                 (fullPageId, buf, tag) -> {
-                }
+                },
+                PAGE_SIZE
         );
     }
 
diff --git 
a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/persistence/ItBplusTreeReuseListPageMemoryImplTest.java
 
b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/persistence/ItBplusTreeReuseListPageMemoryImplTest.java
index b68c1b834..9324f29e3 100644
--- 
a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/persistence/ItBplusTreeReuseListPageMemoryImplTest.java
+++ 
b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/persistence/ItBplusTreeReuseListPageMemoryImplTest.java
@@ -33,9 +33,7 @@ public class ItBplusTreeReuseListPageMemoryImplTest extends 
ItBplusTreeReuseSelf
     /** {@inheritDoc} */
     @Override
     protected PageMemory createPageMemory() throws Exception {
-        dataRegionCfg
-                .change(c -> 
c.changePageSize(PAGE_SIZE).changeInitSize(MAX_MEMORY_SIZE).changeMaxSize(MAX_MEMORY_SIZE))
-                .get(1, TimeUnit.SECONDS);
+        dataRegionCfg.change(c -> 
c.changeInitSize(MAX_MEMORY_SIZE).changeMaxSize(MAX_MEMORY_SIZE)).get(1, 
TimeUnit.SECONDS);
 
         long[] sizes = LongStream.range(0, CPUS + 1).map(i -> MAX_MEMORY_SIZE 
/ CPUS).toArray();
 
@@ -54,7 +52,8 @@ public class ItBplusTreeReuseListPageMemoryImplTest extends 
ItBplusTreeReuseSelf
                 (page, fullPageId, pageMemoryEx) -> {
                 },
                 (fullPageId, buf, tag) -> {
-                }
+                },
+                PAGE_SIZE
         );
     }
 
diff --git 
a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/ItBplusTreeReplaceRemoveRaceTest.java
 
b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/ItBplusTreeReplaceRemoveRaceTest.java
index 015f73ec1..952fec989 100644
--- 
a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/ItBplusTreeReplaceRemoveRaceTest.java
+++ 
b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/ItBplusTreeReplaceRemoveRaceTest.java
@@ -88,9 +88,7 @@ public class ItBplusTreeReplaceRemoveRaceTest extends 
BaseIgniteAbstractTest {
     }
 
     protected PageMemory createPageMemory() throws Exception {
-        dataRegionCfg
-                .change(c -> c.changePageSize(512).changeInitSize(1024 * 
MiB).changeMaxSize(1024 * MiB))
-                .get(1, TimeUnit.SECONDS);
+        dataRegionCfg.change(c -> c.changeInitSize(1024 * 
MiB).changeMaxSize(1024 * MiB)).get(1, TimeUnit.SECONDS);
 
         TestPageIoRegistry ioRegistry = new TestPageIoRegistry();
 
@@ -99,7 +97,8 @@ public class ItBplusTreeReplaceRemoveRaceTest extends 
BaseIgniteAbstractTest {
         return new PageMemoryNoStoreImpl(
                 new UnsafeMemoryProvider(null),
                 dataRegionCfg,
-                ioRegistry
+                ioRegistry,
+                512
         );
     }
 
diff --git 
a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/ItBplusTreeSelfTest.java
 
b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/ItBplusTreeSelfTest.java
index b523bebcd..d062e8a41 100644
--- 
a/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/ItBplusTreeSelfTest.java
+++ 
b/modules/page-memory/src/integrationTest/java/org/apache/ignite/internal/pagememory/tree/ItBplusTreeSelfTest.java
@@ -2733,9 +2733,7 @@ public class ItBplusTreeSelfTest extends 
BaseIgniteAbstractTest {
      * @throws Exception If failed.
      */
     protected PageMemory createPageMemory() throws Exception {
-        dataRegionCfg
-                .change(c -> 
c.changePageSize(PAGE_SIZE).changeInitSize(MAX_MEMORY_SIZE).changeMaxSize(MAX_MEMORY_SIZE))
-                .get(1, TimeUnit.SECONDS);
+        dataRegionCfg.change(c -> 
c.changeInitSize(MAX_MEMORY_SIZE).changeMaxSize(MAX_MEMORY_SIZE)).get(1, 
TimeUnit.SECONDS);
 
         TestPageIoRegistry ioRegistry = new TestPageIoRegistry();
 
@@ -2744,7 +2742,8 @@ public class ItBplusTreeSelfTest extends 
BaseIgniteAbstractTest {
         return new PageMemoryNoStoreImpl(
                 new UnsafeMemoryProvider(null),
                 dataRegionCfg,
-                ioRegistry
+                ioRegistry,
+                PAGE_SIZE
         );
     }
 
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/schema/PageMemoryCheckpointConfigurationSchema.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/schema/PageMemoryCheckpointConfigurationSchema.java
new file mode 100644
index 000000000..0ee7ba82f
--- /dev/null
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/schema/PageMemoryCheckpointConfigurationSchema.java
@@ -0,0 +1,75 @@
+/*
+ * 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.schema;
+
+import org.apache.ignite.configuration.annotation.Config;
+import org.apache.ignite.configuration.annotation.Value;
+import org.apache.ignite.configuration.validation.OneOf;
+import org.apache.ignite.configuration.validation.Range;
+import 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointWriteOrder;
+
+/**
+ * Checkpoint configuration schema for persistent page memory.
+ */
+@Config
+public class PageMemoryCheckpointConfigurationSchema {
+    /** See description of {@link CheckpointWriteOrder#RANDOM}. */
+    public static final String RANDOM_WRITE_ORDER = "RANDOM";
+
+    /** See description of {@link CheckpointWriteOrder#SEQUENTIAL}. */
+    public static final String SEQUENTIAL_WRITE_ORDER = "SEQUENTIAL";
+
+    /** Checkpoint frequency in milliseconds. */
+    @Range(min = 0)
+    @Value(hasDefault = true)
+    public long frequency = 180_000;
+
+    /** Checkpoint frequency deviation. */
+    @Range(min = 0, max = 100)
+    @Value(hasDefault = true)
+    public int frequencyDeviation = 40;
+
+    /** Number of checkpoint threads. */
+    @Range(min = 1)
+    @Value(hasDefault = true)
+    public int threads = 4;
+
+    /** Checkpoint write order. */
+    @OneOf({RANDOM_WRITE_ORDER, SEQUENTIAL_WRITE_ORDER})
+    @Value(hasDefault = true)
+    public String writeOrder = SEQUENTIAL_WRITE_ORDER;
+
+    /**
+     * Starting from this number of dirty pages in checkpoint, they will be 
sorted in parallel in case of {@link #SEQUENTIAL_WRITE_ORDER}.
+     */
+    @Value(hasDefault = true)
+    public int parallelSortThreshold = 512 * 1024;
+
+    /** Timeout for checkpoint read lock acquisition in milliseconds. */
+    @Range(min = 0)
+    @Value(hasDefault = true)
+    public long readLockTimeout = 10_000;
+
+    /** Enables log checkpoint read lock holders. */
+    @Value(hasDefault = true)
+    public boolean logReadLockHolders = false;
+
+    /** Use an asynchronous file I/O operations provider. */
+    @Value(hasDefault = true)
+    public boolean useAsyncFileIoFactory = true;
+}
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/schema/PageMemoryDataRegionConfigurationSchema.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/schema/PageMemoryDataRegionConfigurationSchema.java
index a3ed26554..045df71da 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/schema/PageMemoryDataRegionConfigurationSchema.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/configuration/schema/PageMemoryDataRegionConfigurationSchema.java
@@ -21,7 +21,6 @@ import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.ConfigValue;
 import org.apache.ignite.configuration.annotation.InjectedName;
 import org.apache.ignite.configuration.annotation.Value;
-import org.apache.ignite.configuration.validation.Immutable;
 import org.apache.ignite.configuration.validation.OneOf;
 
 /**
@@ -57,10 +56,6 @@ public class PageMemoryDataRegionConfigurationSchema {
     @InjectedName
     public String name;
 
-    @Immutable
-    @Value(hasDefault = true)
-    public int pageSize = 16 * 1024;
-
     @Value(hasDefault = true)
     public boolean persistent = false;
 
@@ -92,4 +87,12 @@ public class PageMemoryDataRegionConfigurationSchema {
 
     @Value(hasDefault = true)
     public boolean lazyMemoryAllocation = true;
+
+    /**
+     * Write to the page store without holding the segment lock (with a delay).
+     *
+     * <p>Because other thread may require exactly the same page to be loaded 
from page store, reads are protected by locking.
+     */
+    @Value(hasDefault = true)
+    public boolean delayedReplacedPageWrite = true;
 }
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/impl/PageMemoryNoStoreImpl.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/impl/PageMemoryNoStoreImpl.java
index 7136ecbb6..17359e50d 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/impl/PageMemoryNoStoreImpl.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/impl/PageMemoryNoStoreImpl.java
@@ -127,7 +127,7 @@ public class PageMemoryNoStoreImpl implements PageMemory {
     private final DirectMemoryProvider directMemoryProvider;
 
     /** Data region configuration view. */
-    private final PageMemoryDataRegionView dataRegionCfg;
+    private final PageMemoryDataRegionView dataRegionConfigView;
 
     /** Head of the singly linked list of free pages. */
     private final AtomicLong freePageListHead = new 
AtomicLong(INVALID_REL_PTR);
@@ -168,26 +168,27 @@ public class PageMemoryNoStoreImpl implements PageMemory {
      * Constructor.
      *
      * @param directMemoryProvider Memory allocator to use.
-     * @param dataRegionCfg Data region configuration.
+     * @param dataRegionConfig Data region configuration.
      * @param ioRegistry IO registry.
+     * @param pageSize Page size in bytes.
      */
     public PageMemoryNoStoreImpl(
             DirectMemoryProvider directMemoryProvider,
-            PageMemoryDataRegionConfiguration dataRegionCfg,
-            PageIoRegistry ioRegistry
+            PageMemoryDataRegionConfiguration dataRegionConfig,
+            PageIoRegistry ioRegistry,
+            // TODO: IGNITE-17017 Move to common config
+            int pageSize
     ) {
         this.directMemoryProvider = directMemoryProvider;
         this.ioRegistry = ioRegistry;
         this.trackAcquiredPages = false;
-        this.dataRegionCfg = dataRegionCfg.value();
-
-        int pageSize = this.dataRegionCfg.pageSize();
+        this.dataRegionConfigView = dataRegionConfig.value();
 
         sysPageSize = pageSize + PAGE_OVERHEAD;
 
         assert sysPageSize % 8 == 0 : sysPageSize;
 
-        totalPages = (int) (this.dataRegionCfg.maxSize() / sysPageSize);
+        totalPages = (int) (this.dataRegionConfigView.maxSize() / sysPageSize);
 
         rwLock = new OffheapReadWriteLock(lockConcLvl);
     }
@@ -201,8 +202,8 @@ public class PageMemoryNoStoreImpl implements PageMemory {
 
             started = true;
 
-            long startSize = dataRegionCfg.initSize();
-            long maxSize = dataRegionCfg.maxSize();
+            long startSize = dataRegionConfigView.initSize();
+            long maxSize = dataRegionConfigView.maxSize();
 
             long[] chunks = new long[SEG_CNT];
 
@@ -301,10 +302,10 @@ public class PageMemoryNoStoreImpl implements PageMemory {
 
         if (relPtr == INVALID_REL_PTR) {
             IgniteOutOfMemoryException oom = new 
IgniteOutOfMemoryException("Out of memory in data region ["
-                    + "name=" + dataRegionCfg.name()
-                    + ", initSize=" + 
IgniteUtils.readableSize(dataRegionCfg.initSize(), false)
-                    + ", maxSize=" + 
IgniteUtils.readableSize(dataRegionCfg.maxSize(), false)
-                    + ", persistenceEnabled=" + dataRegionCfg.persistent() + 
"] Try the following:\n"
+                    + "name=" + dataRegionConfigView.name()
+                    + ", initSize=" + 
IgniteUtils.readableSize(dataRegionConfigView.initSize(), false)
+                    + ", maxSize=" + 
IgniteUtils.readableSize(dataRegionConfigView.maxSize(), false)
+                    + ", persistenceEnabled=" + 
dataRegionConfigView.persistent() + "] Try the following:\n"
                     + "  ^-- Increase maximum off-heap memory size 
(DataRegionConfiguration.maxSize)\n"
                     + "  ^-- Enable Ignite persistence 
(DataRegionConfiguration.persistenceEnabled)\n"
                     + "  ^-- Enable eviction or expiration policies"
@@ -674,8 +675,8 @@ public class PageMemoryNoStoreImpl implements PageMemory {
 
             if (oldRef != null) {
                 if (LOG.isInfoEnabled()) {
-                    LOG.info("Allocated next memory segment [plcName=" + 
dataRegionCfg.name()
-                            + ", chunkSize=" + 
IgniteUtils.readableSize(region.size(), true) + ']');
+                    LOG.info("Allocated next memory segment for region [name=" 
+ dataRegionConfigView.name()
+                            + ", size=" + 
IgniteUtils.readableSize(region.size(), true) + ']');
                 }
             }
 
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PageMemoryImpl.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PageMemoryImpl.java
index 68d5b8345..7cad66c1f 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PageMemoryImpl.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PageMemoryImpl.java
@@ -57,7 +57,6 @@ import static 
org.apache.ignite.internal.util.IgniteUtils.readableSize;
 import static org.apache.ignite.internal.util.IgniteUtils.safeAbs;
 import static org.apache.ignite.internal.util.IgniteUtils.toHexString;
 import static 
org.apache.ignite.internal.util.OffheapReadWriteLock.TAG_LOCK_ALWAYS;
-import static org.apache.ignite.lang.IgniteSystemProperties.getBoolean;
 
 import java.nio.ByteBuffer;
 import java.util.ArrayList;
@@ -125,13 +124,6 @@ import org.jetbrains.annotations.TestOnly;
  */
 @SuppressWarnings({"LockAcquiredButNotSafelyReleased"})
 public class PageMemoryImpl implements PageMemoryEx {
-    /**
-     * When set to {@code true} (default), pages are written to page store 
without holding segment lock (with delay).
-     * Because other thread may require exactly the same page to be loaded 
from store, reads are protected by locking.
-     */
-    // TODO: IGNITE-16350 Move to config or something else.
-    public static final String IGNITE_DELAYED_REPLACED_PAGE_WRITE = 
"IGNITE_DELAYED_REPLACED_PAGE_WRITE";
-
     /** Logger. */
     private static final IgniteLogger LOG = 
IgniteLogger.forClass(PageMemoryImpl.class);
 
@@ -154,7 +146,7 @@ public class PageMemoryImpl implements PageMemoryEx {
     public static final int TRY_AGAIN_TAG = -1;
 
     /** Data region configuration view. */
-    private final PageMemoryDataRegionView dataRegionCfg;
+    private final PageMemoryDataRegionView dataRegionConfigView;
 
     /** Page IO registry. */
     private final PageIoRegistry ioRegistry;
@@ -219,37 +211,38 @@ public class PageMemoryImpl implements PageMemoryEx {
      * Constructor.
      *
      * @param directMemoryProvider Memory allocator to use.
-     * @param dataRegionCfg Data region configuration.
+     * @param dataRegionConfig Data region configuration.
      * @param ioRegistry IO registry.
      * @param sizes Segments sizes, the last one being the checkpoint buffer 
size.
      * @param pmPageMgr Page store manager.
      * @param changeTracker Callback invoked to track changes in pages.
      * @param flushDirtyPage Write callback invoked when a dirty page is 
removed for replacement.
+     * @param pageSize Page size in bytes.
      */
     public PageMemoryImpl(
             DirectMemoryProvider directMemoryProvider,
-            PageMemoryDataRegionConfiguration dataRegionCfg,
+            PageMemoryDataRegionConfiguration dataRegionConfig,
             PageIoRegistry ioRegistry,
             long[] sizes,
             PageReadWriteManager pmPageMgr,
             @Nullable PageChangeTracker changeTracker,
-            PageStoreWriter flushDirtyPage
+            PageStoreWriter flushDirtyPage,
+            // TODO: IGNITE-17017 Move to common config
+            int pageSize
     ) {
         this.directMemoryProvider = directMemoryProvider;
-        this.dataRegionCfg = dataRegionCfg.value();
+        this.dataRegionConfigView = dataRegionConfig.value();
         this.ioRegistry = ioRegistry;
         this.sizes = sizes;
         this.pmPageMgr = pmPageMgr;
         this.changeTracker = changeTracker;
         this.flushDirtyPage = flushDirtyPage;
 
-        int pageSize = this.dataRegionCfg.pageSize();
-
         sysPageSize = pageSize + PAGE_OVERHEAD;
 
         rwLock = new OffheapReadWriteLock(128);
 
-        String replacementMode = this.dataRegionCfg.replacementMode();
+        String replacementMode = dataRegionConfigView.replacementMode();
 
         switch (replacementMode) {
             case RANDOM_LRU_REPLACEMENT_MODE:
@@ -268,7 +261,7 @@ public class PageMemoryImpl implements PageMemoryEx {
                 throw new IgniteInternalException("Unexpected page replacement 
mode: " + replacementMode);
         }
 
-        delayedPageReplacementTracker = 
getBoolean(IGNITE_DELAYED_REPLACED_PAGE_WRITE, true)
+        delayedPageReplacementTracker = 
dataRegionConfigView.delayedReplacedPageWrite()
                 ? new DelayedPageReplacementTracker(pageSize, flushDirtyPage, 
LOG, sizes.length - 1) : null;
     }
 
@@ -541,10 +534,10 @@ public class PageMemoryImpl implements PageMemoryEx {
             seg.loadedPages.put(grpId, effectivePageId(pageId), relPtr, 
seg.partGeneration(grpId, partId));
         } catch (IgniteOutOfMemoryException oom) {
             IgniteOutOfMemoryException e = new IgniteOutOfMemoryException("Out 
of memory in data region ["
-                    + "name=" + dataRegionCfg.name()
-                    + ", initSize=" + readableSize(dataRegionCfg.initSize(), 
false)
-                    + ", maxSize=" + readableSize(dataRegionCfg.maxSize(), 
false)
-                    + ", persistenceEnabled=" + dataRegionCfg.persistent() + 
"] Try the following:" + lineSeparator()
+                    + "name=" + dataRegionConfigView.name()
+                    + ", initSize=" + 
readableSize(dataRegionConfigView.initSize(), false)
+                    + ", maxSize=" + 
readableSize(dataRegionConfigView.maxSize(), false)
+                    + ", persistenceEnabled=" + 
dataRegionConfigView.persistent() + "] Try the following:" + lineSeparator()
                     + "  ^-- Increase maximum off-heap memory size 
(PageMemoryDataRegionConfiguration.maxSize)" + lineSeparator()
                     + "  ^-- Enable eviction or expiration policies"
             );
@@ -1053,7 +1046,7 @@ public class PageMemoryImpl implements PageMemoryEx {
 
                 throw new IgniteInternalException(
                         "Failed to allocate temporary buffer for checkpoint 
(increase checkpointPageBufferSize configuration property): "
-                                + dataRegionCfg.name());
+                                + dataRegionConfigView.name());
             }
 
             // Pin the page until checkpoint is not finished.
@@ -1536,7 +1529,7 @@ public class PageMemoryImpl implements PageMemoryEx {
                 if 
(pageReplacementWarnedFieldUpdater.compareAndSet(PageMemoryImpl.this, 0, 1)) {
                     String msg = "Page replacements started, pages will be 
rotated with disk, this will affect "
                             + "storage performance (consider increasing 
PageMemoryDataRegionConfiguration#setMaxSize for "
-                            + "data region): " + dataRegionCfg.name();
+                            + "data region): " + dataRegionConfigView.name();
 
                     LOG.warn(msg);
                 }
@@ -1562,10 +1555,10 @@ public class PageMemoryImpl implements PageMemoryEx {
                     + ", dirtyPages=" + dirtyPagesCntr
                     + ", pinned=" + acquiredPages()
                     + ']' + lineSeparator() + "Out of memory in data region ["
-                    + "name=" + dataRegionCfg.name()
-                    + ", initSize=" + readableSize(dataRegionCfg.initSize(), 
false)
-                    + ", maxSize=" + readableSize(dataRegionCfg.maxSize(), 
false)
-                    + ", persistenceEnabled=" + dataRegionCfg.persistent() + 
"] Try the following:" + lineSeparator()
+                    + "name=" + dataRegionConfigView.name()
+                    + ", initSize=" + 
readableSize(dataRegionConfigView.initSize(), false)
+                    + ", maxSize=" + 
readableSize(dataRegionConfigView.maxSize(), false)
+                    + ", persistenceEnabled=" + 
dataRegionConfigView.persistent() + "] Try the following:" + lineSeparator()
                     + "  ^-- Increase maximum off-heap memory size 
(PageMemoryDataRegionConfiguration.maxSize)" + lineSeparator()
                     + "  ^-- Enable eviction or expiration policies"
             );
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointPagesWriterFactory.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointPagesWriterFactory.java
index 47a2e8ba8..37af55bfc 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointPagesWriterFactory.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointPagesWriterFactory.java
@@ -53,6 +53,7 @@ public class CheckpointPagesWriterFactory {
     CheckpointPagesWriterFactory(
             IgniteLogger log,
             CheckpointPageWriter checkpointPageWriter,
+            // TODO: IGNITE-17017 Move to common config
             int pageSize
     ) {
         this.log = log;
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflow.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflow.java
index a76fe30ae..c3ce00339 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflow.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflow.java
@@ -23,8 +23,8 @@ import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.Check
 import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointState.LOCK_TAKEN;
 import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointState.MARKER_STORED_TO_DISK;
 import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointState.PAGE_SNAPSHOT_TAKEN;
+import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointWriteOrder.SEQUENTIAL;
 import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.IgniteConcurrentMultiPairQueue.EMPTY;
-import static org.apache.ignite.lang.IgniteSystemProperties.getInteger;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -42,6 +42,7 @@ import java.util.concurrent.Future;
 import org.apache.ignite.internal.manager.IgniteComponent;
 import org.apache.ignite.internal.pagememory.FullPageId;
 import org.apache.ignite.internal.pagememory.PageMemoryDataRegion;
+import 
org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
 import org.apache.ignite.internal.pagememory.persistence.PageMemoryImpl;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteInternalCheckedException;
@@ -66,14 +67,7 @@ class CheckpointWorkflow implements IgniteComponent {
      * Starting from this number of dirty pages in checkpoint, array will be 
sorted with {@link Arrays#parallelSort(Comparable[])} in case
      * of {@link CheckpointWriteOrder#SEQUENTIAL}.
      */
-    public static final String CHECKPOINT_PARALLEL_SORT_THRESHOLD = 
"CHECKPOINT_PARALLEL_SORT_THRESHOLD";
-
-    /**
-     * Starting from this number of dirty pages in checkpoint, array will be 
sorted with {@link Arrays#parallelSort(Comparable[])} in case
-     * of {@link CheckpointWriteOrder#SEQUENTIAL}.
-     */
-    // TODO: IGNITE-16984 Move to configuration
-    private final int parallelSortThreshold = 
getInteger(CHECKPOINT_PARALLEL_SORT_THRESHOLD, 512 * 1024);
+    private final int parallelSortThreshold;
 
     /** This number of threads will be created and used for parallel sorting. 
*/
     private static final int PARALLEL_SORT_THREADS = 
Math.min(Runtime.getRuntime().availableProcessors(), 8);
@@ -96,20 +90,21 @@ class CheckpointWorkflow implements IgniteComponent {
     /**
      * Constructor.
      *
+     * @param checkpointConfig Checkpoint configuration.
      * @param checkpointMarkersStorage Checkpoint marker storage.
      * @param checkpointReadWriteLock Checkpoint read write lock.
-     * @param checkpointWriteOrder Checkpoint write order.
      * @param dataRegions Persistent data regions for the checkpointing, 
doesn't copy.
      */
     public CheckpointWorkflow(
+            PageMemoryCheckpointConfiguration checkpointConfig,
             CheckpointMarkersStorage checkpointMarkersStorage,
             CheckpointReadWriteLock checkpointReadWriteLock,
-            CheckpointWriteOrder checkpointWriteOrder,
             Collection<PageMemoryDataRegion> dataRegions
     ) {
         this.checkpointMarkersStorage = checkpointMarkersStorage;
         this.checkpointReadWriteLock = checkpointReadWriteLock;
-        this.checkpointWriteOrder = checkpointWriteOrder;
+        this.checkpointWriteOrder = 
CheckpointWriteOrder.valueOf(checkpointConfig.writeOrder().value());
+        this.parallelSortThreshold = 
checkpointConfig.parallelSortThreshold().value();
         this.dataRegions = dataRegions;
     }
 
@@ -344,7 +339,7 @@ class CheckpointWorkflow implements IgniteComponent {
             }
         }
 
-        if (checkpointWriteOrder == CheckpointWriteOrder.SEQUENTIAL) {
+        if (checkpointWriteOrder == SEQUENTIAL) {
             Comparator<FullPageId> cmp = 
Comparator.comparingInt(FullPageId::groupId).thenComparingLong(FullPageId::effectivePageId);
 
             ForkJoinPool pool = null;
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 58d573680..8acff49fa 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
@@ -42,11 +42,11 @@ import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.atomic.LongAdder;
 import java.util.function.BiConsumer;
 import java.util.function.BooleanSupplier;
-import java.util.function.IntSupplier;
-import java.util.function.LongSupplier;
 import org.apache.ignite.internal.components.LongJvmPauseDetector;
 import org.apache.ignite.internal.manager.IgniteComponent;
 import org.apache.ignite.internal.pagememory.FullPageId;
+import 
org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
+import 
org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointView;
 import org.apache.ignite.internal.pagememory.persistence.PageMemoryImpl;
 import org.apache.ignite.internal.pagememory.persistence.store.PageStore;
 import org.apache.ignite.internal.thread.IgniteThread;
@@ -101,11 +101,8 @@ public class Checkpointer extends IgniteWorker implements 
IgniteComponent {
     @Nullable
     private final LongJvmPauseDetector pauseDetector;
 
-    /** Supplier interval in ms after which the checkpoint is triggered if 
there are no other events. */
-    private final LongSupplier checkpointFrequencySupplier;
-
-    /** Checkpoint frequency deviation. */
-    private final IntSupplier checkpointFrequencyDeviationSupplier;
+    /** Checkpoint config. */
+    private final PageMemoryCheckpointConfiguration checkpointConfig;
 
     /** Strategy of where and how to get the pages. */
     private final CheckpointWorkflow checkpointWorkflow;
@@ -139,9 +136,7 @@ public class Checkpointer extends IgniteWorker implements 
IgniteComponent {
      * @param detector Long JVM pause detector.
      * @param checkpointWorkFlow Implementation of checkpoint.
      * @param factory Page writer factory.
-     * @param checkpointWritePageThreads The number of IO-bound threads which 
will write pages to disk.
-     * @param checkpointFrequencySupplier Supplier interval in ms after which 
the checkpoint is triggered if there are no other events.
-     * @param checkpointFrequencyDeviationSupplier Deviation of checkpoint 
frequency.
+     * @param checkpointConfig Checkpoint configuration.
      */
     Checkpointer(
             IgniteLogger log,
@@ -150,23 +145,19 @@ public class Checkpointer extends IgniteWorker implements 
IgniteComponent {
             @Nullable LongJvmPauseDetector detector,
             CheckpointWorkflow checkpointWorkFlow,
             CheckpointPagesWriterFactory factory,
-            int checkpointWritePageThreads,
-            LongSupplier checkpointFrequencySupplier,
-            IntSupplier checkpointFrequencyDeviationSupplier
+            PageMemoryCheckpointConfiguration checkpointConfig
     ) {
         super(log, igniteInstanceName, "checkpoint-thread", workerListener);
 
         this.pauseDetector = detector;
-        // TODO: IGNITE-16984 Move to config
-        this.checkpointFrequencySupplier = checkpointFrequencySupplier;
-        // TODO: IGNITE-16984 Move to config
-        this.checkpointFrequencyDeviationSupplier = 
checkpointFrequencyDeviationSupplier;
+        this.checkpointConfig = checkpointConfig;
         this.checkpointWorkflow = checkpointWorkFlow;
         this.checkpointPagesWriterFactory = factory;
 
         scheduledCheckpointProgress = new 
CheckpointProgressImpl(MILLISECONDS.toNanos(nextCheckpointInterval()));
 
-        // TODO: IGNITE-16984 Move checkpointWritePageThreads to config
+        int checkpointWritePageThreads = checkpointConfig.threads().value();
+
         if (checkpointWritePageThreads > 1) {
             checkpointWritePagesPool = new ThreadPoolExecutor(
                     checkpointWritePageThreads,
@@ -728,9 +719,10 @@ public class Checkpointer extends IgniteWorker implements 
IgniteComponent {
      * <p>It helps when the cluster makes a checkpoint in the same time in 
every node.
      */
     long nextCheckpointInterval() {
-        long frequency = checkpointFrequencySupplier.getAsLong();
+        PageMemoryCheckpointView checkpointConfigView = 
checkpointConfig.value();
 
-        int deviation = checkpointFrequencyDeviationSupplier.getAsInt();
+        long frequency = checkpointConfigView.frequency();
+        int deviation = checkpointConfigView.frequencyDeviation();
 
         if (deviation == 0) {
             return frequency;
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/DelayedDirtyPageStoreWrite.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/DelayedDirtyPageStoreWrite.java
index 500d51892..e19c1b5b0 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/DelayedDirtyPageStoreWrite.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/DelayedDirtyPageStoreWrite.java
@@ -65,6 +65,7 @@ public class DelayedDirtyPageStoreWrite implements 
PageStoreWriter {
     public DelayedDirtyPageStoreWrite(
             PageStoreWriter flushDirtyPage,
             ThreadLocal<ByteBuffer> byteBufThreadLoc,
+            // TODO: IGNITE-17017 Move to common config
             int pageSize,
             DelayedPageReplacementTracker tracker
     ) {
diff --git 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/DelayedPageReplacementTracker.java
 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/DelayedPageReplacementTracker.java
index 12ec6b0c4..6306a29dd 100644
--- 
a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/DelayedPageReplacementTracker.java
+++ 
b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/replacement/DelayedPageReplacementTracker.java
@@ -74,6 +74,7 @@ public class DelayedPageReplacementTracker {
      * @param segmentCnt Segments count.
      */
     public DelayedPageReplacementTracker(
+            // TODO: IGNITE-17017 Move to common config
             int pageSize,
             PageStoreWriter flushDirtyPage,
             IgniteLogger log,
diff --git 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/freelist/AbstractFreeListTest.java
 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/freelist/AbstractFreeListTest.java
index 469c71a32..d0f66f82a 100644
--- 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/freelist/AbstractFreeListTest.java
+++ 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/freelist/AbstractFreeListTest.java
@@ -171,9 +171,7 @@ public class AbstractFreeListTest extends 
BaseIgniteAbstractTest {
     }
 
     private PageMemory createPageMemory(int pageSize) throws Exception {
-        dataRegionCfg
-                .change(c -> 
c.changePageSize(pageSize).changeInitSize(MAX_SIZE).changeMaxSize(MAX_SIZE))
-                .get(1, TimeUnit.SECONDS);
+        dataRegionCfg.change(c -> 
c.changeInitSize(MAX_SIZE).changeMaxSize(MAX_SIZE)).get(1, TimeUnit.SECONDS);
 
         TestPageIoRegistry ioRegistry = new TestPageIoRegistry();
 
@@ -184,7 +182,8 @@ public class AbstractFreeListTest extends 
BaseIgniteAbstractTest {
         return new PageMemoryNoStoreImpl(
                 new UnsafeMemoryProvider(null),
                 dataRegionCfg,
-                ioRegistry
+                ioRegistry,
+                pageSize
         );
     }
 
diff --git 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/impl/PageMemoryNoLoadSelfTest.java
 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/impl/PageMemoryNoLoadSelfTest.java
index d74eb9107..cd6246673 100644
--- 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/impl/PageMemoryNoLoadSelfTest.java
+++ 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/impl/PageMemoryNoLoadSelfTest.java
@@ -65,9 +65,7 @@ public class PageMemoryNoLoadSelfTest extends 
BaseIgniteAbstractTest {
 
     @BeforeEach
     void setUp() throws Exception {
-        dataRegionCfg
-                .change(cfg -> 
cfg.changePageSize(PAGE_SIZE).changeInitSize(MAX_MEMORY_SIZE).changeMaxSize(MAX_MEMORY_SIZE))
-                .get(1, SECONDS);
+        dataRegionCfg.change(c -> 
c.changeInitSize(MAX_MEMORY_SIZE).changeMaxSize(MAX_MEMORY_SIZE)).get(1, 
SECONDS);
     }
 
     @Test
@@ -317,9 +315,10 @@ public class PageMemoryNoLoadSelfTest extends 
BaseIgniteAbstractTest {
         ioRegistry.loadFromServiceLoader();
 
         return new PageMemoryNoStoreImpl(
-            provider,
-            dataRegionCfg,
-            ioRegistry
+                provider,
+                dataRegionCfg,
+                ioRegistry,
+                PAGE_SIZE
         );
     }
 
diff --git 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/PageMemoryImplNoLoadTest.java
 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/PageMemoryImplNoLoadTest.java
index ea05f741b..5c1bed2b6 100644
--- 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/PageMemoryImplNoLoadTest.java
+++ 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/PageMemoryImplNoLoadTest.java
@@ -33,12 +33,18 @@ import org.apache.ignite.internal.pagememory.PageMemory;
 import org.apache.ignite.internal.pagememory.impl.PageMemoryNoLoadSelfTest;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
 import org.apache.ignite.internal.pagememory.mem.unsafe.UnsafeMemoryProvider;
+import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
 
 /**
  * Tests {@link PageMemoryImpl}.
  */
 public class PageMemoryImplNoLoadTest extends PageMemoryNoLoadSelfTest {
+    @BeforeEach
+    void setUp() throws Exception {
+        dataRegionCfg.change(c -> 
c.changeInitSize(MAX_MEMORY_SIZE).changeMaxSize(MAX_MEMORY_SIZE)).get(1, 
SECONDS);
+    }
+
     /** {@inheritDoc} */
     @Override
     protected PageMemory memory() {
@@ -59,7 +65,8 @@ public class PageMemoryImplNoLoadTest extends 
PageMemoryNoLoadSelfTest {
                 (page, fullPageId, pageMemoryEx) -> {
                 },
                 (fullPageId, buf, tag) -> {
-                }
+                },
+                PAGE_SIZE
         );
     }
 
diff --git 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflowTest.java
 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflowTest.java
index 5ec2820c2..3335c432d 100644
--- 
a/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflowTest.java
+++ 
b/modules/page-memory/src/test/java/org/apache/ignite/internal/pagememory/persistence/checkpoint/CheckpointWorkflowTest.java
@@ -21,6 +21,7 @@ import static java.util.Comparator.comparing;
 import static java.util.concurrent.CompletableFuture.completedFuture;
 import static java.util.stream.Collectors.toList;
 import static java.util.stream.Collectors.toSet;
+import static 
org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfigurationSchema.RANDOM_WRITE_ORDER;
 import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointState.FINISHED;
 import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointState.LOCK_RELEASED;
 import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointState.LOCK_TAKEN;
@@ -32,8 +33,6 @@ import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.Check
 import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointWorkflowTest.TestCheckpointListener.BEFORE_CHECKPOINT_BEGIN;
 import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointWorkflowTest.TestCheckpointListener.ON_CHECKPOINT_BEGIN;
 import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointWorkflowTest.TestCheckpointListener.ON_MARK_CHECKPOINT_BEGIN;
-import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointWriteOrder.RANDOM;
-import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.CheckpointWriteOrder.SEQUENTIAL;
 import static 
org.apache.ignite.internal.pagememory.persistence.checkpoint.IgniteConcurrentMultiPairQueue.EMPTY;
 import static 
org.apache.ignite.internal.util.FastTimestamps.coarseCurrentTimeMillis;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -56,8 +55,12 @@ import java.util.List;
 import java.util.Set;
 import java.util.UUID;
 import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.TimeUnit;
+import 
org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
+import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.pagememory.FullPageId;
 import org.apache.ignite.internal.pagememory.PageMemoryDataRegion;
+import 
org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
 import org.apache.ignite.internal.pagememory.persistence.PageMemoryImpl;
 import 
org.apache.ignite.internal.pagememory.persistence.checkpoint.IgniteConcurrentMultiPairQueue.Result;
 import org.apache.ignite.lang.IgniteBiTuple;
@@ -66,14 +69,19 @@ import org.apache.ignite.lang.IgniteLogger;
 import org.jetbrains.annotations.Nullable;
 import org.junit.jupiter.api.AfterEach;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 import org.mockito.ArgumentCaptor;
 
 /**
  * For {@link CheckpointWorkflow} testing.
  */
+@ExtendWith(ConfigurationExtension.class)
 public class CheckpointWorkflowTest {
     private final IgniteLogger log = 
IgniteLogger.forClass(CheckpointWorkflowTest.class);
 
+    @InjectConfiguration
+    private PageMemoryCheckpointConfiguration checkpointConfig;
+
     @Nullable
     private CheckpointWorkflow workflow;
 
@@ -91,9 +99,9 @@ public class CheckpointWorkflowTest {
         PageMemoryDataRegion dataRegion2 = newDataRegion(true, 
mock(PageMemoryImpl.class));
 
         workflow = new CheckpointWorkflow(
+                checkpointConfig,
                 mock(CheckpointMarkersStorage.class),
                 newReadWriteLock(log),
-                RANDOM,
                 List.of(dataRegion0, dataRegion1)
         );
 
@@ -171,7 +179,7 @@ public class CheckpointWorkflowTest {
 
         PageMemoryDataRegion dataRegion = newDataRegion(true, 
newPageMemoryImpl(dirtyPages));
 
-        workflow = new CheckpointWorkflow(markersStorage, readWriteLock, 
RANDOM, List.of(dataRegion));
+        workflow = new CheckpointWorkflow(checkpointConfig, markersStorage, 
readWriteLock, List.of(dataRegion));
 
         workflow.start();
 
@@ -300,14 +308,16 @@ public class CheckpointWorkflowTest {
 
     @Test
     void testMarkCheckpointBeginRandom() throws Exception {
+        checkpointConfig.writeOrder().update(RANDOM_WRITE_ORDER).get(100, 
TimeUnit.MILLISECONDS);
+
         List<FullPageId> dirtyPages = List.of(new FullPageId(1, 0), new 
FullPageId(0, 0), new FullPageId(2, 0));
 
         PageMemoryDataRegion dataRegion = newDataRegion(true, 
newPageMemoryImpl(dirtyPages));
 
         workflow = new CheckpointWorkflow(
+                checkpointConfig,
                 mock(CheckpointMarkersStorage.class),
                 newReadWriteLock(log),
-                RANDOM,
                 List.of(dataRegion)
         );
 
@@ -336,9 +346,9 @@ public class CheckpointWorkflowTest {
         PageMemoryDataRegion dataRegion = newDataRegion(true, 
newPageMemoryImpl(dirtyPages));
 
         workflow = new CheckpointWorkflow(
+                checkpointConfig,
                 mock(CheckpointMarkersStorage.class),
                 newReadWriteLock(log),
-                SEQUENTIAL,
                 List.of(dataRegion)
         );
 
@@ -368,7 +378,7 @@ public class CheckpointWorkflowTest {
 
         PageMemoryDataRegion dataRegion = newDataRegion(true, pageMemory);
 
-        workflow = new CheckpointWorkflow(markersStorage, readWriteLock, 
RANDOM, List.of(dataRegion));
+        workflow = new CheckpointWorkflow(checkpointConfig, markersStorage, 
readWriteLock, List.of(dataRegion));
 
         workflow.start();
 
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 6fedcf65b..b4b2f8c35 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
@@ -55,23 +55,27 @@ 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 java.util.function.BiConsumer;
-import java.util.function.LongSupplier;
+import 
org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
+import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.pagememory.FullPageId;
+import 
org.apache.ignite.internal.pagememory.configuration.schema.PageMemoryCheckpointConfiguration;
 import org.apache.ignite.internal.pagememory.persistence.PageMemoryImpl;
-import org.apache.ignite.lang.IgniteInternalCheckedException;
 import org.apache.ignite.lang.IgniteLogger;
 import org.apache.ignite.lang.NodeStoppingException;
 import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.ExtendWith;
 
 /**
  * For {@link Checkpointer} testing.
  */
+@ExtendWith(ConfigurationExtension.class)
 public class CheckpointerTest {
     private final IgniteLogger log = 
IgniteLogger.forClass(CheckpointerTest.class);
 
+    @InjectConfiguration("mock : {threads=1, frequency=1000, 
frequencyDeviation=0}")
+    private PageMemoryCheckpointConfiguration checkpointConfig;
+
     @Test
     void testStartAndStop() throws Exception {
         Checkpointer checkpointer = new Checkpointer(
@@ -81,9 +85,7 @@ public class CheckpointerTest {
                 null,
                 createCheckpointWorkflow(EMPTY),
                 
createCheckpointPagesWriterFactory(mock(CheckpointPageWriter.class)),
-                1,
-                () -> 1_000,
-                () -> 0
+                checkpointConfig
         );
 
         assertNull(checkpointer.runner());
@@ -114,9 +116,7 @@ public class CheckpointerTest {
                 null,
                 mock(CheckpointWorkflow.class),
                 mock(CheckpointPagesWriterFactory.class),
-                1,
-                () -> 1_000,
-                () -> 0
+                checkpointConfig
         ));
 
         assertNull(checkpointer.currentProgress());
@@ -232,6 +232,8 @@ public class CheckpointerTest {
 
     @Test
     void testWaitCheckpointEvent() throws Exception {
+        checkpointConfig.frequency().update(200L).get(100, MILLISECONDS);
+
         Checkpointer checkpointer = new Checkpointer(
                 log,
                 "test",
@@ -239,9 +241,7 @@ public class CheckpointerTest {
                 null,
                 mock(CheckpointWorkflow.class),
                 mock(CheckpointPagesWriterFactory.class),
-                1,
-                () -> 200,
-                () -> 0
+                checkpointConfig
         );
 
         CompletableFuture<?> waitCheckpointEventFuture = 
runAsync(checkpointer::waitCheckpointEvent);
@@ -259,11 +259,7 @@ public class CheckpointerTest {
 
     @Test
     void testCheckpointBody() throws Exception {
-        LongSupplier checkpointFrequencySupplier = mock(LongSupplier.class);
-
-        when(checkpointFrequencySupplier.getAsLong())
-                .thenReturn(100L)
-                .thenReturn(10_000L);
+        checkpointConfig.frequency().update(100L).get(100, MILLISECONDS);
 
         Checkpointer checkpointer = spy(new Checkpointer(
                 log,
@@ -272,19 +268,19 @@ public class CheckpointerTest {
                 null,
                 createCheckpointWorkflow(EMPTY),
                 
createCheckpointPagesWriterFactory(mock(CheckpointPageWriter.class)),
-                1,
-                checkpointFrequencySupplier,
-                () -> 0
+                checkpointConfig
         ));
 
         ((CheckpointProgressImpl) checkpointer.scheduledProgress())
                 .futureFor(FINISHED)
                 .whenComplete((unused, throwable) -> {
                     try {
+                        checkpointConfig.frequency().update(10_000L).get(100, 
MILLISECONDS);
+
                         verify(checkpointer, times(1)).doCheckpoint();
 
                         checkpointer.shutdownCheckpointer(false);
-                    } catch (IgniteInternalCheckedException e) {
+                    } catch (Exception e) {
                         fail(e);
                     }
                 });
@@ -345,9 +341,7 @@ public class CheckpointerTest {
                 null,
                 createCheckpointWorkflow(dirtyPages),
                 
createCheckpointPagesWriterFactory(mock(CheckpointPageWriter.class)),
-                1,
-                () -> 1_000,
-                () -> 0
+                checkpointConfig
         ));
 
         assertDoesNotThrow(checkpointer::doCheckpoint);
@@ -360,10 +354,7 @@ public class CheckpointerTest {
     }
 
     @Test
-    void testNextCheckpointInterval() {
-        AtomicLong checkpointFrequency = new AtomicLong();
-        AtomicInteger checkpointFrequencyDeviation = new AtomicInteger();
-
+    void testNextCheckpointInterval() throws Exception {
         Checkpointer checkpointer = new Checkpointer(
                 log,
                 "test",
@@ -371,31 +362,29 @@ public class CheckpointerTest {
                 null,
                 mock(CheckpointWorkflow.class),
                 mock(CheckpointPagesWriterFactory.class),
-                1,
-                checkpointFrequency::get,
-                checkpointFrequencyDeviation::get
+                checkpointConfig
         );
 
         // Checks case 0 deviation.
 
-        checkpointFrequencyDeviation.set(0);
+        checkpointConfig.frequencyDeviation().update(0).get(100, MILLISECONDS);
 
-        checkpointFrequency.set(1_000);
+        checkpointConfig.frequency().update(1_000L).get(100, MILLISECONDS);
         assertEquals(1_000, checkpointer.nextCheckpointInterval());
 
-        checkpointFrequency.set(2_000);
+        checkpointConfig.frequency().update(2_000L).get(100, MILLISECONDS);
         assertEquals(2_000, checkpointer.nextCheckpointInterval());
 
         // Checks for non-zero deviation.
 
-        checkpointFrequencyDeviation.set(10);
+        checkpointConfig.frequencyDeviation().update(10).get(100, 
MILLISECONDS);
 
         assertThat(
                 checkpointer.nextCheckpointInterval(),
                 allOf(greaterThanOrEqualTo(1_900L), lessThanOrEqualTo(2_100L))
         );
 
-        checkpointFrequencyDeviation.set(20);
+        checkpointConfig.frequencyDeviation().update(20).get(100, 
MILLISECONDS);
 
         assertThat(
                 checkpointer.nextCheckpointInterval(),
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryDataRegion.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryDataRegion.java
index dd0b0e9ca..8d535ac84 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryDataRegion.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryDataRegion.java
@@ -33,6 +33,8 @@ abstract class AbstractPageMemoryDataRegion implements 
PageMemoryDataRegion, Ign
 
     protected final PageIoRegistry ioRegistry;
 
+    protected final int pageSize;
+
     protected PageMemory pageMemory;
 
     /**
@@ -40,10 +42,12 @@ abstract class AbstractPageMemoryDataRegion implements 
PageMemoryDataRegion, Ign
      *
      * @param cfg Data region configuration.
      * @param ioRegistry IO registry.
+     * @param pageSize Page size in bytes.
      */
-    public AbstractPageMemoryDataRegion(PageMemoryDataRegionConfiguration cfg, 
PageIoRegistry ioRegistry) {
+    public AbstractPageMemoryDataRegion(PageMemoryDataRegionConfiguration cfg, 
PageIoRegistry ioRegistry, int pageSize) {
         this.cfg = cfg;
         this.ioRegistry = ioRegistry;
+        this.pageSize = pageSize;
     }
 
     /** {@inheritDoc} */
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PageMemoryStorageEngine.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PageMemoryStorageEngine.java
index 286b3fbb8..746761a12 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PageMemoryStorageEngine.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PageMemoryStorageEngine.java
@@ -62,14 +62,23 @@ public class PageMemoryStorageEngine implements 
StorageEngine {
     /** {@inheritDoc} */
     @Override
     public void start() {
-        VolatilePageMemoryDataRegion defaultRegion = new 
VolatilePageMemoryDataRegion(engineConfig.defaultRegion(), ioRegistry);
+        int pageSize = engineConfig.pageSize().value();
+
+        VolatilePageMemoryDataRegion defaultRegion = new 
VolatilePageMemoryDataRegion(
+                engineConfig.defaultRegion(),
+                ioRegistry, pageSize
+        );
 
         defaultRegion.start();
 
         regions.put(DEFAULT_DATA_REGION_NAME, defaultRegion);
 
         for (String regionName : 
engineConfig.regions().value().namedListKeys()) {
-            VolatilePageMemoryDataRegion region = new 
VolatilePageMemoryDataRegion(engineConfig.regions().get(regionName), 
ioRegistry);
+            VolatilePageMemoryDataRegion region = new 
VolatilePageMemoryDataRegion(
+                    engineConfig.regions().get(regionName),
+                    ioRegistry,
+                    pageSize
+            );
 
             region.start();
 
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryDataRegion.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryDataRegion.java
index cd44241a7..b59593424 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryDataRegion.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryDataRegion.java
@@ -43,9 +43,15 @@ class VolatilePageMemoryDataRegion extends 
AbstractPageMemoryDataRegion {
      *
      * @param cfg Data region configuration.
      * @param ioRegistry IO registry.
+     * @param pageSize Page size in bytes.
      */
-    public VolatilePageMemoryDataRegion(PageMemoryDataRegionConfiguration cfg, 
PageIoRegistry ioRegistry) {
-        super(cfg, ioRegistry);
+    public VolatilePageMemoryDataRegion(
+            PageMemoryDataRegionConfiguration cfg,
+            PageIoRegistry ioRegistry,
+            // TODO: IGNITE-17017 Move to common config
+            int pageSize
+    ) {
+        super(cfg, ioRegistry, pageSize);
     }
 
     /** {@inheritDoc} */
@@ -55,7 +61,12 @@ class VolatilePageMemoryDataRegion extends 
AbstractPageMemoryDataRegion {
 
         assert cfg.memoryAllocator() instanceof 
UnsafeMemoryAllocatorConfiguration : cfg.memoryAllocator();
 
-        PageMemory pageMemory = new PageMemoryNoStoreImpl(new 
UnsafeMemoryProvider(null), cfg, ioRegistry);
+        PageMemory pageMemory = new PageMemoryNoStoreImpl(
+                new UnsafeMemoryProvider(null),
+                cfg,
+                ioRegistry,
+                pageSize
+        );
 
         pageMemory.start();
 
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/schema/PageMemoryStorageEngineConfigurationSchema.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/schema/PageMemoryStorageEngineConfigurationSchema.java
index 12f2da854..aad7896d5 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/schema/PageMemoryStorageEngineConfigurationSchema.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/configuration/schema/PageMemoryStorageEngineConfigurationSchema.java
@@ -23,7 +23,11 @@ import 
org.apache.ignite.configuration.annotation.ConfigValue;
 import org.apache.ignite.configuration.annotation.ConfigurationRoot;
 import org.apache.ignite.configuration.annotation.Name;
 import org.apache.ignite.configuration.annotation.NamedConfigValue;
+import org.apache.ignite.configuration.annotation.Value;
 import org.apache.ignite.configuration.validation.ExceptKeys;
+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.PageMemoryDataRegionConfigurationSchema;
 import org.apache.ignite.internal.storage.pagememory.PageMemoryStorageEngine;
 
@@ -35,6 +39,13 @@ public class PageMemoryStorageEngineConfigurationSchema {
     /** Name of the default data region. */
     public static final String DEFAULT_DATA_REGION_NAME = "default";
 
+    /** Page size in bytes. */
+    @Immutable
+    @PowerOfTwo
+    @Range(min = 1024, max = 16 * 1024)
+    @Value(hasDefault = true)
+    public int pageSize = 16 * 1024;
+
     /** Default data region. */
     @Name(DEFAULT_DATA_REGION_NAME)
     @ConfigValue
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PageMemoryPartitionStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PageMemoryPartitionStorageTest.java
index 874d10264..227357120 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PageMemoryPartitionStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PageMemoryPartitionStorageTest.java
@@ -141,7 +141,7 @@ public class PageMemoryPartitionStorageTest extends 
AbstractPartitionStorageTest
      */
     @Test
     void testFragments() {
-        int pageSize = engineConfig.defaultRegion().value().pageSize();
+        int pageSize = engineConfig.pageSize().value();
 
         DataRow dataRow = dataRow(createRandomString(pageSize), 
createRandomString(pageSize));
 
diff --git 
a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/configuration/schema/RocksDbDataRegionConfigurationSchema.java
 
b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/configuration/schema/RocksDbDataRegionConfigurationSchema.java
index eb689c77a..647c61704 100644
--- 
a/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/configuration/schema/RocksDbDataRegionConfigurationSchema.java
+++ 
b/modules/storage-rocksdb/src/main/java/org/apache/ignite/internal/storage/rocksdb/configuration/schema/RocksDbDataRegionConfigurationSchema.java
@@ -20,8 +20,8 @@ package 
org.apache.ignite.internal.storage.rocksdb.configuration.schema;
 import org.apache.ignite.configuration.annotation.Config;
 import org.apache.ignite.configuration.annotation.InjectedName;
 import org.apache.ignite.configuration.annotation.Value;
-import org.apache.ignite.configuration.validation.Min;
 import org.apache.ignite.configuration.validation.OneOf;
+import org.apache.ignite.configuration.validation.Range;
 import org.apache.ignite.internal.storage.rocksdb.RocksDbStorageEngine;
 
 /**
@@ -45,7 +45,7 @@ public class RocksDbDataRegionConfigurationSchema {
 
     /** Size of rocksdb write buffer. */
     @Value(hasDefault = true)
-    @Min(1)
+    @Range(min = 1)
     public long writeBufferSize = 64 * 1024 * 1024;
 
     /** Cache type - only {@code LRU} is supported at the moment. {@code 
Clock} implementation has known bugs. */
@@ -54,7 +54,7 @@ public class RocksDbDataRegionConfigurationSchema {
     public String cache = ROCKSDB_LRU_CACHE;
 
     /** The cache is sharded to 2^numShardBits shards, by hash of the key. */
-    @Min(-1)
+    @Range(min = -1)
     @Value(hasDefault = true)
     public int numShardBits = -1;
 }

Reply via email to