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;
}