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 c60a70edf6d IGNITE-26573 Use JitComparator in sorted indexes by 
default (#6685)
c60a70edf6d is described below

commit c60a70edf6db098b6d1a0f679f9f194ce5fae069
Author: Ivan Bessonov <[email protected]>
AuthorDate: Thu Feb 5 18:05:12 2026 +0300

    IGNITE-26573 Use JitComparator in sorted indexes by default (#6685)
---
 check-rules/spotbugs-excludes.xml                  |   9 ++
 .../apache/ignite/internal/util/IgniteUtils.java   |  24 ++++
 ...InterruptedRaftSnapshotStorageRecoveryTest.java |   6 +-
 .../schema/BinaryTupleComparatorUtils.java         |   2 +-
 .../internal/schema/UnsafeByteBufferAccessor.java  |  37 ++++-
 .../schema/BinaryTupleComparatorBaseTest.java      |   9 ++
 .../AbstractPageMemoryStorageEngine.java           | 152 ++++++++++++++++++++-
 .../pagememory/PersistentPageMemoryDataRegion.java |   6 +-
 .../PersistentPageMemoryStorageEngine.java         |   9 +-
 .../VolatilePageMemoryDataStorageModule.java       |   5 +
 .../VolatilePageMemoryStorageEngine.java           |   7 +-
 .../pagememory/index/freelist/IndexColumns.java    |   9 +-
 .../pagememory/index/sorted/SortedIndexRowKey.java |   9 ++
 .../pagememory/index/sorted/SortedIndexTree.java   |  38 +++++-
 .../sorted/comparator/JitComparatorGenerator.java  |  25 +++-
 .../sorted/comparator/JitComparatorOptions.java    |   2 +-
 .../index/sorted/io/SortedIndexTreeIo.java         |  73 +++++++++-
 .../mv/AbstractPageMemoryMvPartitionStorage.java   |   6 +-
 .../storage/pagememory/mv/IndexStorageFactory.java |  17 ++-
 .../storage/pagememory/mv/PageMemoryIndexes.java   |  10 +-
 .../PersistentPageMemoryMvTableStorageTest.java    |   6 +-
 .../VolatilePageMemoryMvTableStorageTest.java      |   7 +-
 .../benchmarks/SortedIndexTreeInsertBenchmark.java |   8 +-
 .../PersistentPageMemoryStorageEngineTest.java     |   6 +-
 .../VolatilePageMemoryStorageEngineTest.java       |   5 +
 ...PersistentPageMemorySortedIndexStorageTest.java |   7 +-
 ...morySortedIndexStorageLegacyComparatorTest.java |  44 ++++++
 .../VolatilePageMemorySortedIndexStorageTest.java  |   9 +-
 .../PersistentPageMemoryHashIndexStorageTest.java  |  10 +-
 .../VolatilePageMemoryHashIndexStorageTest.java    |   7 +-
 .../pagememory/mv/FailedCheckpointTest.java        |   6 +-
 ...ageMemoryMvPartitionStorageConcurrencyTest.java |   7 +-
 ...rsistentPageMemoryMvPartitionStorageGcTest.java |   7 +-
 ...PersistentPageMemoryMvPartitionStorageTest.java |   6 +-
 ...entPageMemoryMvTableStorageConcurrencyTest.java |   7 +-
 ...ageMemoryMvPartitionStorageConcurrencyTest.java |   6 +-
 ...VolatilePageMemoryMvPartitionStorageGcTest.java |   7 +-
 .../VolatilePageMemoryMvPartitionStorageTest.java  |   5 +-
 ...ilePageMemoryMvTableStorageConcurrencyTest.java |   6 +-
 .../PersistentPageMemoryGcUpdateHandlerTest.java   |   7 +-
 .../gc/VolatilePageMemoryGcUpdateHandlerTest.java  |   6 +-
 41 files changed, 543 insertions(+), 91 deletions(-)

diff --git a/check-rules/spotbugs-excludes.xml 
b/check-rules/spotbugs-excludes.xml
index 5e5fc30c7f9..164199d1dae 100644
--- a/check-rules/spotbugs-excludes.xml
+++ b/check-rules/spotbugs-excludes.xml
@@ -278,6 +278,15 @@
     <Class name="org.apache.ignite.internal.util.OffheapReadWriteLock"/>
     <Method name="awaitCondition"/>
   </Match>
+  <Match>
+    <!--
+    Done that way on purpose. Technically, this is a false-positive failure of 
the check, because this is not even a result of "compareTo",
+    but rather a result of another asymmetric "compare" method where we can't 
change the order of arguments.
+    -->
+    <Bug pattern="RV_NEGATING_RESULT_OF_COMPARETO"/>
+    <Class 
name="org.apache.ignite.internal.storage.pagememory.index.sorted.io.SortedIndexTreeIo"/>
+    <Method name="compare"/>
+  </Match>
   <!-- end of false-positive exclusions -->
 
 
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 7652f8200a6..cd03a48076a 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
@@ -42,6 +42,7 @@ import java.nio.file.attribute.BasicFileAttributes;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
@@ -1470,4 +1471,27 @@ public class IgniteUtils {
             throw new 
NullPointerException(IgniteStringFormatter.format(NULL_TO_PRIMITIVE_NAMED_ERROR_MESSAGE,
 fieldName));
         }
     }
+
+    /**
+     * Creates a comparator of lists that compares them lexicographically 
using the provided comparator for list elements.
+     *
+     * @param comparator Comparator for list elements.
+     * @param <T> Type of list's elements.
+     * @return Comparator of lists.
+     */
+    public static <T> Comparator<List<T>> 
lexicographicListComparator(Comparator<? super T> comparator) {
+        return (l, r) -> {
+            int length = Math.min(l.size(), r.size());
+
+            for (int i = 0; i < length; i++) {
+                int cmp = comparator.compare(l.get(i), r.get(i));
+
+                if (cmp != 0) {
+                    return cmp;
+                }
+            }
+
+            return Integer.compare(l.size(), r.size());
+        };
+    }
 }
diff --git 
a/modules/raft/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItInterruptedRaftSnapshotStorageRecoveryTest.java
 
b/modules/raft/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItInterruptedRaftSnapshotStorageRecoveryTest.java
index 46c82ce67e2..1df7c6fff7b 100644
--- 
a/modules/raft/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItInterruptedRaftSnapshotStorageRecoveryTest.java
+++ 
b/modules/raft/src/integrationTest/java/org/apache/ignite/internal/raftsnapshot/ItInterruptedRaftSnapshotStorageRecoveryTest.java
@@ -40,6 +40,7 @@ import 
org.apache.ignite.internal.ClusterPerTestIntegrationTest;
 import org.apache.ignite.internal.catalog.CatalogService;
 import org.apache.ignite.internal.catalog.descriptors.CatalogZoneDescriptor;
 import org.apache.ignite.internal.components.LogSyncer;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
@@ -82,6 +83,9 @@ class ItInterruptedRaftSnapshotStorageRecoveryTest extends 
ClusterPerTestIntegra
     @InjectConfiguration("mock.profiles.default {engine = aipersist, sizeBytes 
= " + Constants.GiB + "}")
     private StorageConfiguration storageConfig;
 
+    @InjectConfiguration
+    private SystemLocalConfiguration systemConfig;
+
     @InjectExecutorService
     private ExecutorService executor;
 
@@ -224,7 +228,7 @@ class ItInterruptedRaftSnapshotStorageRecoveryTest extends 
ClusterPerTestIntegra
                 "test",
                 metricManager,
                 storageConfig,
-                null,
+                systemConfig,
                 ioRegistry,
                 storagePath,
                 null,
diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/BinaryTupleComparatorUtils.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/BinaryTupleComparatorUtils.java
index 6d4a8f940eb..1484cca2721 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/BinaryTupleComparatorUtils.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/BinaryTupleComparatorUtils.java
@@ -549,7 +549,7 @@ public class BinaryTupleComparatorUtils {
         int i = 0;
         int remaining = Math.min(trimmedSize1, trimmedSize2);
 
-        while (i + Long.BYTES < remaining) {
+        while (i + Long.BYTES <= remaining) {
             long w1 = buf1.getLong(begin1 + i);
             long w2 = buf2.getLong(begin2 + i);
 
diff --git 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/UnsafeByteBufferAccessor.java
 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/UnsafeByteBufferAccessor.java
index c6d191f5a5a..36f05185867 100644
--- 
a/modules/schema/src/main/java/org/apache/ignite/internal/schema/UnsafeByteBufferAccessor.java
+++ 
b/modules/schema/src/main/java/org/apache/ignite/internal/schema/UnsafeByteBufferAccessor.java
@@ -21,6 +21,7 @@ import java.nio.ByteBuffer;
 import org.apache.ignite.internal.binarytuple.BinaryTupleParser;
 import org.apache.ignite.internal.binarytuple.ByteBufferAccessor;
 import org.apache.ignite.internal.util.GridUnsafe;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * The `UnsafeByteBufferAccessor` class provides low-level access to the 
contents of a `ByteBuffer`.
@@ -33,9 +34,9 @@ public class UnsafeByteBufferAccessor implements 
ByteBufferAccessor {
     /** Whether the byte order of the underlying buffer is reversed compared 
to the native byte order. */
     private static final boolean REVERSE_BYTE_ORDER = 
GridUnsafe.NATIVE_BYTE_ORDER != BinaryTupleParser.ORDER;
 
-    private final byte[] bytes;
-    private final long addr;
-    private final int capacity;
+    private byte @Nullable [] bytes;
+    private long addr;
+    private int capacity;
 
     /**
      * Constructor that initializes the accessor with a {@link ByteBuffer}.
@@ -52,6 +53,36 @@ public class UnsafeByteBufferAccessor implements 
ByteBufferAccessor {
         capacity = buff.capacity();
     }
 
+    /**
+     * Constructor that initializes the accessor with a memory address and 
capacity.
+     *
+     * @param addr Memory address.
+     * @param capacity Capacity in bytes.
+     */
+    public UnsafeByteBufferAccessor(long addr, int capacity) {
+        this.bytes = null;
+        this.addr = addr;
+        this.capacity = capacity;
+    }
+
+    /**
+     * Initializes the accessor with a memory address and capacity.
+     */
+    public void reinit(long addr, int capacity) {
+        this.bytes = null;
+        this.addr = addr;
+        this.capacity = capacity;
+    }
+
+    /**
+     * Initializes the accessor with a byte array, offset, and length.
+     */
+    public void reinit(byte[] bytes, int from, int length) {
+        this.bytes = bytes;
+        this.addr = GridUnsafe.BYTE_ARR_OFF + from;
+        this.capacity = length;
+    }
+
     @Override
     public byte get(int p) {
         return GridUnsafe.getByte(bytes, addr + p);
diff --git 
a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/BinaryTupleComparatorBaseTest.java
 
b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/BinaryTupleComparatorBaseTest.java
index c49843294ed..157f2f01eb6 100644
--- 
a/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/BinaryTupleComparatorBaseTest.java
+++ 
b/modules/schema/src/testFixtures/java/org/apache/ignite/internal/schema/BinaryTupleComparatorBaseTest.java
@@ -184,6 +184,15 @@ public abstract class BinaryTupleComparatorBaseTest {
         validate(descNullFirstComparator, tuple1, tuple2);
         validate(ascNullLastComparator, tuple2, tuple1);
         validate(descNullLastComparator, tuple2, tuple1);
+
+        if (supportsPartialComparison()) {
+            ByteBuffer partialTuple2 = 
tuple2.duplicate().order(ByteOrder.LITTLE_ENDIAN).limit(tuple2.limit() - 1);
+
+            validate(ascNullFirstComparator, tuple1, partialTuple2);
+            validate(descNullFirstComparator, tuple1, partialTuple2);
+            validate(ascNullLastComparator, partialTuple2, tuple1);
+            validate(descNullLastComparator, partialTuple2, tuple1);
+        }
     }
 
     @Test
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryStorageEngine.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryStorageEngine.java
index 2940757232d..17a4612a940 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryStorageEngine.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryStorageEngine.java
@@ -17,21 +17,77 @@
 
 package org.apache.ignite.internal.storage.pagememory;
 
+import static java.util.Comparator.comparing;
+import static 
org.apache.ignite.internal.util.IgniteUtils.lexicographicListComparator;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ConcurrentSkipListMap;
 import java.util.concurrent.atomic.AtomicLong;
+import org.apache.ignite.internal.catalog.descriptors.CatalogColumnCollation;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
+import org.apache.ignite.internal.configuration.SystemPropertyView;
 import org.apache.ignite.internal.hlc.HybridClock;
 import org.apache.ignite.internal.pagememory.PageMemory;
 import org.apache.ignite.internal.pagememory.tree.BplusTree;
+import org.apache.ignite.internal.storage.StorageException;
 import org.apache.ignite.internal.storage.engine.StorageEngine;
+import org.apache.ignite.internal.storage.index.StorageSortedIndexDescriptor;
+import 
org.apache.ignite.internal.storage.index.StorageSortedIndexDescriptor.StorageSortedIndexColumnDescriptor;
+import 
org.apache.ignite.internal.storage.pagememory.index.sorted.comparator.JitComparator;
+import 
org.apache.ignite.internal.storage.pagememory.index.sorted.comparator.JitComparatorGenerator;
+import 
org.apache.ignite.internal.storage.pagememory.index.sorted.comparator.JitComparatorOptions;
+import org.apache.ignite.internal.type.NativeType;
+import org.jetbrains.annotations.Nullable;
+import org.jetbrains.annotations.VisibleForTesting;
 
 /** Abstract implementation of the storage engine based on memory {@link 
PageMemory}. */
 public abstract class AbstractPageMemoryStorageEngine implements StorageEngine 
{
+    public static final String 
LEGACY_PAGE_MEMORY_SORTED_INDEX_COMPARATOR_PROPERTY = 
"legacyPageMemorySortedIndexComparator";
+
+    protected final SystemLocalConfiguration systemLocalConfig;
+
     private final HybridClock clock;
 
+    private boolean useLegacySortedIndexComparator = false;
+
+    /**
+     * This map is used to reuse comparators for sorted indexes with the same 
set of columns and their collations. It is beneficial to reuse
+     * comparators because otherwise every comparator will use its own 
generated class, which bloats metaspace and doesn't allow JVM's JIT
+     * to be as efficient.
+     *
+     * <p>The choice of {@link ConcurrentSkipListMap} is dictated by the need 
to have a non-default {@code equals} behavior which would
+     * ignore the names of the columns and other such an information. Having a 
separate key class that would implement such {@code equals}
+     * and {@code hashCode} has been considered and tried, it lead to a large 
volume of boilerplate and was hard to read.
+     */
+    private final ConcurrentMap<StorageSortedIndexDescriptor, 
CachedComparator> cachedSortedIndexComparators
+            = new ConcurrentSkipListMap<>(comparing(
+                    StorageSortedIndexDescriptor::columns,
+                    
lexicographicListComparator(comparing(StorageSortedIndexColumnDescriptor::type)
+                            
.thenComparing(StorageSortedIndexColumnDescriptor::nullable)
+                            
.thenComparing(StorageSortedIndexColumnDescriptor::nullsFirst)
+                            
.thenComparing(StorageSortedIndexColumnDescriptor::asc)
+                    )
+            ));
+
     /** Constructor. */
-    AbstractPageMemoryStorageEngine(HybridClock clock) {
+    AbstractPageMemoryStorageEngine(SystemLocalConfiguration 
systemLocalConfig, HybridClock clock) {
+        this.systemLocalConfig = Objects.requireNonNull(systemLocalConfig);
         this.clock = clock;
     }
 
+    @Override
+    public void start() throws StorageException {
+        SystemPropertyView legacyComparator = 
systemLocalConfig.value().properties()
+                .get(LEGACY_PAGE_MEMORY_SORTED_INDEX_COMPARATOR_PROPERTY);
+
+        if (legacyComparator != null && 
"true".equalsIgnoreCase(legacyComparator.propertyValue())) {
+            useLegacySortedIndexComparator = true;
+        }
+    }
+
     /**
      * Creates a Global remove ID for structures based on a {@link BplusTree}, 
always creating monotonically increasing ones even after
      * recovery node, so that there are no errors after restoring trees.
@@ -39,4 +95,98 @@ public abstract class AbstractPageMemoryStorageEngine 
implements StorageEngine {
     public AtomicLong generateGlobalRemoveId() {
         return new AtomicLong(clock.nowLong());
     }
+
+    /**
+     * Creates a new instance of {@link JitComparator} for the given sorted 
index descriptor.
+     */
+    @VisibleForTesting
+    public static JitComparator 
createNewJitComparator(StorageSortedIndexDescriptor desc) {
+        List<StorageSortedIndexColumnDescriptor> columns = desc.columns();
+        List<CatalogColumnCollation> collations = new 
ArrayList<>(columns.size());
+        List<NativeType> types = new ArrayList<>(columns.size());
+        List<Boolean> nullableFlags = new ArrayList<>(columns.size());
+
+        for (StorageSortedIndexColumnDescriptor col : columns) {
+            collations.add(CatalogColumnCollation.get(col.asc(), 
col.nullsFirst()));
+            types.add(col.type());
+            // Nulls can still be passed from the outside as lower/upper 
bounds during the search, even if the column is not nullable.
+            nullableFlags.add(true);
+        }
+
+        return 
JitComparatorGenerator.createComparator(JitComparatorOptions.builder()
+                .columnCollations(collations)
+                .columnTypes(types)
+                .nullableFlags(nullableFlags)
+                .supportPrefixes(true)
+                .supportPartialComparison(true)
+                .build()
+        );
+    }
+
+    /**
+     * Creates or retrieves from cache a {@link JitComparator} for the given 
sorted index descriptor. Returns a cached comparator value if
+     * it already exists (was not disposed with {@link 
#disposeSortedIndexComparator(StorageSortedIndexDescriptor)}) for a given 
descriptor.
+     */
+    public @Nullable JitComparator 
createSortedIndexComparator(StorageSortedIndexDescriptor indexDescriptor) {
+        if (useLegacySortedIndexComparator) {
+            return null;
+        }
+
+        CachedComparator c = 
cachedSortedIndexComparators.compute(indexDescriptor, (desc, cmp) -> {
+            if (cmp != null) {
+                return cmp.incrementUsage();
+            }
+
+            JitComparator jitComparator = createNewJitComparator(desc);
+
+            return new CachedComparator(jitComparator);
+        });
+
+        return c.jitComparator();
+    }
+
+    /**
+     * Marks that a comparator, created previously with {@link 
#createSortedIndexComparator(StorageSortedIndexDescriptor)}, will no longer
+     * be used, and the internal cache of comparators may react to this 
information by removing the comparator from the cache and freeing
+     * associated resources.
+     */
+    public void disposeSortedIndexComparator(StorageSortedIndexDescriptor 
indexDescriptor) {
+        if (useLegacySortedIndexComparator) {
+            return;
+        }
+
+        cachedSortedIndexComparators.compute(indexDescriptor, (desc, cmp) -> {
+            assert cmp != null : "Disposing a comparator that was not created 
before [desc=" + desc + "]";
+
+            return cmp.decrementUsage();
+        });
+    }
+
+    private static class CachedComparator {
+        private final JitComparator comparator;
+        private final int usageCount;
+
+        private CachedComparator(JitComparator comparator, int usageCount) {
+            assert usageCount > 0;
+
+            this.comparator = comparator;
+            this.usageCount = usageCount;
+        }
+
+        CachedComparator(JitComparator comparator) {
+            this(comparator, 1);
+        }
+
+        JitComparator jitComparator() {
+            return comparator;
+        }
+
+        CachedComparator incrementUsage() {
+            return new CachedComparator(comparator, usageCount + 1);
+        }
+
+        @Nullable AbstractPageMemoryStorageEngine.CachedComparator 
decrementUsage() {
+            return usageCount == 1 ? null : new CachedComparator(comparator, 
usageCount - 1);
+        }
+    }
 }
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataRegion.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataRegion.java
index f7abd99c1d1..617e8bfb9ac 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataRegion.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryDataRegion.java
@@ -68,7 +68,6 @@ import 
org.apache.ignite.internal.storage.pagememory.configuration.schema.Persis
 import 
org.apache.ignite.internal.storage.pagememory.configuration.schema.PersistentPageMemoryProfileView;
 import 
org.apache.ignite.internal.storage.pagememory.mv.PersistentPageMemoryMvPartitionStorage;
 import org.apache.ignite.internal.util.OffheapReadWriteLock;
-import org.jetbrains.annotations.Nullable;
 import org.jetbrains.annotations.VisibleForTesting;
 
 /**
@@ -97,8 +96,7 @@ public class PersistentPageMemoryDataRegion implements 
DataRegion<PersistentPage
 
     private final PersistentPageMemoryProfileConfiguration cfg;
 
-    /** Can only be null in tests. Saves us from a bunch of mocking. */
-    private final @Nullable SystemLocalConfiguration systemLocalConfig;
+    private final SystemLocalConfiguration systemLocalConfig;
 
     private final PageIoRegistry ioRegistry;
 
@@ -135,7 +133,7 @@ public class PersistentPageMemoryDataRegion implements 
DataRegion<PersistentPage
     public PersistentPageMemoryDataRegion(
             MetricManager metricManager,
             PersistentPageMemoryProfileConfiguration cfg,
-            @Nullable SystemLocalConfiguration systemLocalConfig,
+            SystemLocalConfiguration systemLocalConfig,
             PageIoRegistry ioRegistry,
             FilePageStoreManager filePageStoreManager,
             PartitionMetaManager partitionMetaManager,
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
index 6bde72e57be..0ca332b6744 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryStorageEngine.java
@@ -95,8 +95,6 @@ public class PersistentPageMemoryStorageEngine extends 
AbstractPageMemoryStorage
 
     private final StorageConfiguration storageConfig;
 
-    private final @Nullable SystemLocalConfiguration systemLocalConfig;
-
     private final PageIoRegistry ioRegistry;
 
     private final Path storagePath;
@@ -142,7 +140,7 @@ public class PersistentPageMemoryStorageEngine extends 
AbstractPageMemoryStorage
             String igniteInstanceName,
             MetricManager metricManager,
             StorageConfiguration storageConfig,
-            @Nullable SystemLocalConfiguration systemLocalConfig,
+            SystemLocalConfiguration systemLocalConfig,
             PageIoRegistry ioRegistry,
             Path storagePath,
             @Nullable LongJvmPauseDetector longJvmPauseDetector,
@@ -151,13 +149,12 @@ public class PersistentPageMemoryStorageEngine extends 
AbstractPageMemoryStorage
             ExecutorService commonExecutorService,
             HybridClock clock
     ) {
-        super(clock);
+        super(systemLocalConfig, clock);
 
         this.igniteInstanceName = igniteInstanceName;
         this.metricManager = metricManager;
         this.storageConfig = storageConfig;
         this.engineConfig = 
((PersistentPageMemoryStorageEngineExtensionConfiguration) 
storageConfig.engines()).aipersist();
-        this.systemLocalConfig = systemLocalConfig;
         this.ioRegistry = ioRegistry;
         this.storagePath = storagePath;
         this.longJvmPauseDetector = longJvmPauseDetector;
@@ -180,6 +177,8 @@ public class PersistentPageMemoryStorageEngine extends 
AbstractPageMemoryStorage
 
     @Override
     public void start() throws StorageException {
+        super.start();
+
         int pageSize = engineConfig.pageSizeBytes().value();
 
         try {
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryDataStorageModule.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryDataStorageModule.java
index 9aa475be8db..854aca4cc19 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryDataStorageModule.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryDataStorageModule.java
@@ -25,6 +25,8 @@ import java.util.concurrent.ScheduledExecutorService;
 import org.apache.ignite.internal.components.LogSyncer;
 import org.apache.ignite.internal.components.LongJvmPauseDetector;
 import org.apache.ignite.internal.configuration.ConfigurationRegistry;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
+import 
org.apache.ignite.internal.configuration.SystemLocalExtensionConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.hlc.HybridClock;
 import org.apache.ignite.internal.metrics.MetricManager;
@@ -60,6 +62,8 @@ public class VolatilePageMemoryDataStorageModule implements 
DataStorageModule {
     ) throws StorageException {
         StorageConfiguration storageConfig = 
configRegistry.getConfiguration(StorageExtensionConfiguration.KEY).storage();
 
+        SystemLocalConfiguration systemLocalConfig = 
configRegistry.getConfiguration(SystemLocalExtensionConfiguration.KEY).system();
+
         PageIoRegistry ioRegistry = new PageIoRegistry();
 
         ioRegistry.loadFromServiceLoader();
@@ -67,6 +71,7 @@ public class VolatilePageMemoryDataStorageModule implements 
DataStorageModule {
         return new VolatilePageMemoryStorageEngine(
                 igniteInstanceName,
                 storageConfig,
+                systemLocalConfig,
                 ioRegistry,
                 failureManager,
                 clock
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java
index d0e6b9a14b6..5b9c3fd37db 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryStorageEngine.java
@@ -29,6 +29,7 @@ import java.util.concurrent.LinkedBlockingQueue;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Stream;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import org.apache.ignite.internal.failure.FailureProcessor;
 import org.apache.ignite.internal.hlc.HybridClock;
 import org.apache.ignite.internal.logger.IgniteLogger;
@@ -80,6 +81,7 @@ public class VolatilePageMemoryStorageEngine extends 
AbstractPageMemoryStorageEn
      *
      * @param igniteInstanceName Ignite instance name.
      * @param storageConfig Storage engine and storage profiles configurations.
+     * @param systemLocalConfig Local system configuration.
      * @param ioRegistry IO registry.
      * @param failureProcessor Failure processor.
      * @param clock Hybrid Logical Clock.
@@ -87,11 +89,12 @@ public class VolatilePageMemoryStorageEngine extends 
AbstractPageMemoryStorageEn
     public VolatilePageMemoryStorageEngine(
             String igniteInstanceName,
             StorageConfiguration storageConfig,
+            SystemLocalConfiguration systemLocalConfig,
             PageIoRegistry ioRegistry,
             FailureProcessor failureProcessor,
             HybridClock clock
     ) {
-        super(clock);
+        super(systemLocalConfig, clock);
 
         this.igniteInstanceName = igniteInstanceName;
         this.storageConfig = storageConfig;
@@ -114,6 +117,8 @@ public class VolatilePageMemoryStorageEngine extends 
AbstractPageMemoryStorageEn
 
     @Override
     public void start() throws StorageException {
+        super.start();
+
         for (StorageProfileView storageProfileView : 
storageConfig.profiles().value()) {
             if (storageProfileView instanceof VolatilePageMemoryProfileView) {
                 String profileName = storageProfileView.name();
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/freelist/IndexColumns.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/freelist/IndexColumns.java
index 60961cc8ca7..3c2db2ee5ac 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/freelist/IndexColumns.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/freelist/IndexColumns.java
@@ -23,7 +23,6 @@ import java.nio.ByteBuffer;
 import org.apache.ignite.internal.lang.IgniteInternalCheckedException;
 import org.apache.ignite.internal.pagememory.Storable;
 import org.apache.ignite.internal.pagememory.util.PageUtils;
-import org.jetbrains.annotations.Nullable;
 
 /**
  * Index columns to store in free list.
@@ -44,7 +43,7 @@ public class IndexColumns implements Storable {
     private long link = NULL_LINK;
 
     /** Byte buffer with binary tuple data. */
-    private final @Nullable ByteBuffer valueBuffer;
+    private final ByteBuffer valueBuffer;
 
     /**
      * Constructor.
@@ -52,7 +51,7 @@ public class IndexColumns implements Storable {
      * @param partitionId Partition ID.
      * @param valueBuffer Value buffer.
      */
-    public IndexColumns(int partitionId, @Nullable ByteBuffer valueBuffer) {
+    public IndexColumns(int partitionId, ByteBuffer valueBuffer) {
         this.partitionId = partitionId;
         this.valueBuffer = valueBuffer;
     }
@@ -64,7 +63,7 @@ public class IndexColumns implements Storable {
      * @param link Link.
      * @param valueBuffer Value buffer.
      */
-    public IndexColumns(int partitionId, long link, @Nullable ByteBuffer 
valueBuffer) {
+    public IndexColumns(int partitionId, long link, ByteBuffer valueBuffer) {
         this.partitionId = partitionId;
         this.link = link;
         this.valueBuffer = valueBuffer;
@@ -74,8 +73,6 @@ public class IndexColumns implements Storable {
      * Returns the size of binary tuple.
      */
     public int valueSize() {
-        assert valueBuffer != null;
-
         return valueBuffer.limit();
     }
 
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexRowKey.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexRowKey.java
index e2be01651ea..b4c2b9c8d89 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexRowKey.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexRowKey.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.storage.pagememory.index.sorted;
 
+import org.apache.ignite.internal.schema.UnsafeByteBufferAccessor;
 import org.apache.ignite.internal.storage.pagememory.index.common.IndexRowKey;
 import 
org.apache.ignite.internal.storage.pagememory.index.freelist.IndexColumns;
 
@@ -33,10 +34,18 @@ public class SortedIndexRowKey implements IndexRowKey {
      */
     SortedIndexRowKey(IndexColumns indexColumns) {
         this.indexColumns = indexColumns;
+        this.myAccessor = new 
UnsafeByteBufferAccessor(indexColumns.valueBuffer());
+        this.otherAccessor = new UnsafeByteBufferAccessor(0, 0);
     }
 
     @Override
     public IndexColumns indexColumns() {
         return indexColumns;
     }
+
+    /** Cached accessor instance for the {@link #indexColumns}. Used to avoid 
constant reallocations. */
+    public final UnsafeByteBufferAccessor myAccessor;
+
+    /** Cached accessor instance for the arbitrary buffer. Used to avoid 
constant reallocations. */
+    public final UnsafeByteBufferAccessor otherAccessor;
 }
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexTree.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexTree.java
index 510981d06fd..739532c10d1 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexTree.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/SortedIndexTree.java
@@ -31,6 +31,7 @@ import org.apache.ignite.internal.schema.BinaryTuple;
 import org.apache.ignite.internal.schema.BinaryTupleComparator;
 import org.apache.ignite.internal.schema.PartialBinaryTupleMatcher;
 import org.apache.ignite.internal.storage.index.StorageSortedIndexDescriptor;
+import 
org.apache.ignite.internal.storage.pagememory.index.sorted.comparator.JitComparator;
 import 
org.apache.ignite.internal.storage.pagememory.index.sorted.io.SortedIndexTreeInnerIo;
 import 
org.apache.ignite.internal.storage.pagememory.index.sorted.io.SortedIndexTreeIo;
 import 
org.apache.ignite.internal.storage.pagememory.index.sorted.io.SortedIndexTreeLeafIo;
@@ -56,6 +57,9 @@ public class SortedIndexTree extends 
BplusTree<SortedIndexRowKey, SortedIndexRow
     @Nullable
     private final PartialBinaryTupleMatcher partialBinaryTupleMatcher;
 
+    @Nullable
+    private JitComparator jitComparator;
+
     /** Inline size in bytes. */
     private final int inlineSize;
 
@@ -71,8 +75,10 @@ public class SortedIndexTree extends 
BplusTree<SortedIndexRowKey, SortedIndexRow
      * @param metaPageId Meta page ID.
      * @param reuseList Reuse list.
      * @param indexDescriptor Index descriptor.
-     * @param initNew {@code True} if need to create and fill in special pages 
for working with a tree (for example, when creating it
-     *      for the first time), {@code false} if not necessary (for example, 
when restoring a tree).
+     * @param jitComparator Optional optimized binary tuple comparator to be 
used by the tree. {@code null} if {@link BinaryTupleComparator}
+     *      derived from {@code indexDescriptor} should be used instead.
+     * @param initNew {@code True} if need to create and fill in special pages 
for working with a tree (for example, when creating
+     *         it for the first time), {@code false} if not necessary (for 
example, when restoring a tree).
      * @throws IgniteInternalCheckedException If failed.
      */
     private SortedIndexTree(
@@ -84,6 +90,7 @@ public class SortedIndexTree extends 
BplusTree<SortedIndexRowKey, SortedIndexRow
             long metaPageId,
             @Nullable ReuseList reuseList,
             StorageSortedIndexDescriptor indexDescriptor,
+            @Nullable JitComparator jitComparator,
             boolean initNew
     ) throws IgniteInternalCheckedException {
         super("SortedIndexTree", grpId, grpName, partId, pageMem, globalRmvId, 
metaPageId, reuseList);
@@ -94,6 +101,7 @@ public class SortedIndexTree extends 
BplusTree<SortedIndexRowKey, SortedIndexRow
         this.dataPageReader = new DataPageReader(pageMem, grpId);
         this.binaryTupleComparator = 
StorageUtils.binaryTupleComparator(indexDescriptor.columns());
         this.partialBinaryTupleMatcher = 
StorageUtils.partialBinaryTupleComparator(indexDescriptor.columns());
+        this.jitComparator = jitComparator;
 
         init(initNew);
     }
@@ -126,6 +134,7 @@ public class SortedIndexTree extends 
BplusTree<SortedIndexRowKey, SortedIndexRow
         this.dataPageReader = new DataPageReader(pageMem, grpId);
         this.binaryTupleComparator = null;
         this.partialBinaryTupleMatcher = null;
+        this.jitComparator = null;
 
         init(false);
     }
@@ -141,9 +150,12 @@ public class SortedIndexTree extends 
BplusTree<SortedIndexRowKey, SortedIndexRow
             AtomicLong globalRmvId,
             long metaPageId,
             @Nullable ReuseList reuseList,
-            StorageSortedIndexDescriptor indexDescriptor
+            StorageSortedIndexDescriptor indexDescriptor,
+            @Nullable JitComparator jitComparator
     ) throws IgniteInternalCheckedException {
-        return new SortedIndexTree(grpId, grpName, partId, pageMem, 
globalRmvId, metaPageId, reuseList, indexDescriptor, true);
+        return new SortedIndexTree(
+                grpId, grpName, partId, pageMem, globalRmvId, metaPageId, 
reuseList, indexDescriptor, jitComparator, true
+        );
     }
 
     /**
@@ -157,9 +169,12 @@ public class SortedIndexTree extends 
BplusTree<SortedIndexRowKey, SortedIndexRow
             AtomicLong globalRmvId,
             long metaPageId,
             @Nullable ReuseList reuseList,
-            StorageSortedIndexDescriptor indexDescriptor
+            StorageSortedIndexDescriptor indexDescriptor,
+            @Nullable JitComparator jitComparator
     ) throws IgniteInternalCheckedException {
-        return new SortedIndexTree(grpId, grpName, partId, pageMem, 
globalRmvId, metaPageId, reuseList, indexDescriptor, false);
+        return new SortedIndexTree(
+                grpId, grpName, partId, pageMem, globalRmvId, metaPageId, 
reuseList, indexDescriptor, jitComparator, false
+        );
     }
 
     /**
@@ -210,6 +225,17 @@ public class SortedIndexTree extends 
BplusTree<SortedIndexRowKey, SortedIndexRow
             throws IgniteInternalCheckedException {
         SortedIndexTreeIo sortedIndexTreeIo = (SortedIndexTreeIo) io;
 
+        if (jitComparator != null) {
+            return sortedIndexTreeIo.compare(
+                    dataPageReader,
+                    jitComparator,
+                    partId,
+                    pageAddr,
+                    idx,
+                    row
+            );
+        }
+
         return sortedIndexTreeIo.compare(
                 dataPageReader,
                 getBinaryTupleComparator(),
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/comparator/JitComparatorGenerator.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/comparator/JitComparatorGenerator.java
index d02c476a924..a5961bf619b 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/comparator/JitComparatorGenerator.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/comparator/JitComparatorGenerator.java
@@ -454,15 +454,25 @@ public class JitComparatorGenerator {
             NativeType columnType = options.columnTypes().get(i);
 
             if (options.supportPartialComparison()) {
+                BytecodeExpression partialComparisonExpression = 
comparePartialTupleElement(
+                        collation, columnType,
+                        new ComparisonVariables(
+                                outerAccessor, outerEntryBaseStart, 
outerEntryBaseEnd,
+                                innerAccessor, innerEntryBaseStart, 
innerEntryBaseEnd
+                        )
+                );
+
+                if (options.nullableFlags().get(i)) {
+                    partialComparisonExpression = inlineIf(
+                            equal(outerEntryBaseStart, outerEntryBaseEnd),
+                            collation.nullsFirst() ? constantInt(-1) : 
constantInt(1),
+                            partialComparisonExpression
+                    );
+                }
+
                 body.append(new IfStatement()
                         .condition(greaterThan(innerEntryBaseEnd, innerSize))
-                        .ifTrue(comparePartialTupleElement(
-                                collation, columnType,
-                                new ComparisonVariables(
-                                        outerAccessor, outerEntryBaseStart, 
outerEntryBaseEnd,
-                                        innerAccessor, innerEntryBaseStart, 
innerEntryBaseEnd
-                                )
-                        ).ret())
+                        .ifTrue(partialComparisonExpression.ret())
                 );
             }
 
@@ -780,6 +790,7 @@ public class JitComparatorGenerator {
             begin += (int) (buf.getAddress() - GridUnsafe.BYTE_ARR_OFF);
         } else {
             bytes = GridUnsafe.getBytes(buf.getAddress(), begin, len);
+            begin = 0;
         }
         return new BigInteger(bytes, begin, len);
     }
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/comparator/JitComparatorOptions.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/comparator/JitComparatorOptions.java
index 284af0464be..adeca14111d 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/comparator/JitComparatorOptions.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/comparator/JitComparatorOptions.java
@@ -43,7 +43,7 @@ public class JitComparatorOptions {
             List<CatalogColumnCollation> columnCollations,
             List<NativeType> columnTypes,
             List<Boolean> nullableFlags,
-            String className,
+            @Nullable String className,
             boolean supportPrefixes,
             boolean supportPartialComparison
     ) {
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/io/SortedIndexTreeIo.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/io/SortedIndexTreeIo.java
index c60cfd2b444..57af57a7188 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/io/SortedIndexTreeIo.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/index/sorted/io/SortedIndexTreeIo.java
@@ -40,11 +40,13 @@ import 
org.apache.ignite.internal.pagememory.tree.io.BplusIo;
 import org.apache.ignite.internal.pagememory.util.PageUtils;
 import org.apache.ignite.internal.schema.BinaryTuple;
 import org.apache.ignite.internal.schema.PartialBinaryTupleMatcher;
+import org.apache.ignite.internal.schema.UnsafeByteBufferAccessor;
 import org.apache.ignite.internal.storage.RowId;
 import 
org.apache.ignite.internal.storage.pagememory.index.freelist.IndexColumns;
 import 
org.apache.ignite.internal.storage.pagememory.index.freelist.ReadIndexColumnsValue;
 import 
org.apache.ignite.internal.storage.pagememory.index.sorted.SortedIndexRow;
 import 
org.apache.ignite.internal.storage.pagememory.index.sorted.SortedIndexRowKey;
+import 
org.apache.ignite.internal.storage.pagememory.index.sorted.comparator.JitComparator;
 
 /**
  * Interface for {@link SortedIndexRow} B+Tree-related IO.
@@ -210,13 +212,80 @@ public interface SortedIndexTreeIo {
             return cmp;
         }
 
-        assert rowKey instanceof SortedIndexRow : rowKey;
+        return compareRowId(pageAddr, rowKey, off);
+    }
+
+    /**
+     * Compare the {@link SortedIndexRowKey} from the page with passed {@link 
SortedIndexRowKey}. This method is very similar to
+     * {@link #compare(DataPageReader, Comparator, PartialBinaryTupleMatcher, 
int, long, int, SortedIndexRowKey)}. Combining them into a
+     * single method would make it too bloated and hard to follow, assuming an 
optimal implementation of both methods.
+     *
+     * @param dataPageReader Data page reader.
+     * @param comparator Comparator.
+     * @param partitionId Partition ID.
+     * @param pageAddr Page address.
+     * @param idx Element's index.
+     * @param rowKey Lookup index row key.
+     * @return Comparison result.
+     * @throws IgniteInternalCheckedException If failed.
+     */
+    default int compare(
+            DataPageReader dataPageReader,
+            JitComparator comparator,
+            int partitionId,
+            long pageAddr,
+            int idx,
+            SortedIndexRowKey rowKey
+    ) throws IgniteInternalCheckedException {
+        int off = offset(idx);
+
+        int indexColumnsSize = getShort(pageAddr + off, SIZE_OFFSET);
+
+        UnsafeByteBufferAccessor outerAccessor = rowKey.myAccessor;
+        UnsafeByteBufferAccessor innerAccessor = rowKey.otherAccessor;
+        int innerSize;
+
+        if (indexColumnsSize == NOT_FULLY_INLINE) {
+            innerSize = indexColumnsInlineSize();
+            innerAccessor.reinit(pageAddr + off + TUPLE_OFFSET, innerSize);
+
+            int cmp = comparator.compare(outerAccessor, 
outerAccessor.capacity(), innerAccessor, innerSize);
+
+            if (cmp != 0) {
+                return -cmp;
+            }
+
+            long link = readPartitionless(partitionId, pageAddr + off, 
linkOffset());
+
+            ReadIndexColumnsValue indexColumnsTraversal = new 
ReadIndexColumnsValue();
+
+            dataPageReader.traverse(link, indexColumnsTraversal, null);
+
+            byte[] innerBytes = indexColumnsTraversal.result();
+            innerSize = innerBytes.length;
+            innerAccessor.reinit(innerBytes, 0, innerBytes.length);
+        } else {
+            innerSize = indexColumnsSize;
+            innerAccessor.reinit(pageAddr + off + TUPLE_OFFSET, 
indexColumnsSize);
+        }
+
+        int cmp = comparator.compare(outerAccessor, outerAccessor.capacity(), 
innerAccessor, innerSize);
+
+        if (cmp != 0) {
+            return -cmp;
+        }
+
+        return compareRowId(pageAddr, rowKey, off);
+    }
+
+    private int compareRowId(long pageAddr, SortedIndexRowKey rowKey, int off) 
{
+        assert rowKey instanceof SortedIndexRow : "Comparison with a binary 
tuple prefix returned 0. [rowKey=" + rowKey.getClass() + "]";
 
         SortedIndexRow row = (SortedIndexRow) rowKey;
 
         long rowIdMsb = getLong(pageAddr + off, rowIdMsbOffset());
 
-        cmp = Long.compare(rowIdMsb, row.rowId().mostSignificantBits());
+        int cmp = Long.compare(rowIdMsb, row.rowId().mostSignificantBits());
 
         if (cmp != 0) {
             return cmp;
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/AbstractPageMemoryMvPartitionStorage.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/AbstractPageMemoryMvPartitionStorage.java
index 0c633074c78..724ed4cbb75 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/AbstractPageMemoryMvPartitionStorage.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/AbstractPageMemoryMvPartitionStorage.java
@@ -1042,7 +1042,11 @@ public abstract class 
AbstractPageMemoryMvPartitionStorage implements MvPartitio
      * @return Future that will be completed as soon as the storage has been 
destroyed.
      */
     public CompletableFuture<Void> destroyIndex(int indexId) {
-        return busy(() -> indexes.destroyIndex(indexId, 
renewableState.indexMetaTree()));
+        return busy(() -> {
+            RenewablePartitionStorageState state = renewableState;
+
+            return indexes.destroyIndex(indexId, state.indexStorageFactory(), 
state.indexMetaTree());
+        });
     }
 
     /**
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/IndexStorageFactory.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/IndexStorageFactory.java
index 56293ee654d..ecb4c925c14 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/IndexStorageFactory.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/IndexStorageFactory.java
@@ -41,7 +41,7 @@ import 
org.apache.ignite.internal.storage.pagememory.index.sorted.SortedIndexTre
  * Class responsible for creating Index B-Trees.
  */
 class IndexStorageFactory {
-    private final AbstractPageMemoryTableStorage tableStorage;
+    private final AbstractPageMemoryTableStorage<?> tableStorage;
 
     private final int partitionId;
 
@@ -66,7 +66,7 @@ class IndexStorageFactory {
     }
 
     IndexStorageFactory(
-            AbstractPageMemoryTableStorage tableStorage,
+            AbstractPageMemoryTableStorage<?> tableStorage,
             int partitionId,
             IndexMetaTree indexMetaTree,
             FreeListImpl freeList
@@ -196,6 +196,13 @@ class IndexStorageFactory {
         );
     }
 
+    /**
+     * This method notifies the factory that an index with a given descriptor 
has been fully destroyed.
+     */
+    void sortedIndexDestroyed(StorageSortedIndexDescriptor indexDescriptor) {
+        tableStorage.engine().disposeSortedIndexComparator(indexDescriptor);
+    }
+
     private IndexTreeAndMeta<SortedIndexTree> 
createSortedIndexTreeAndMeta(StorageSortedIndexDescriptor indexDescriptor) {
         return createIndexTree(
                 indexDescriptor,
@@ -207,7 +214,8 @@ class IndexStorageFactory {
                         tableStorage.engine().generateGlobalRemoveId(),
                         metaPageId,
                         freeList,
-                        indexDescriptor
+                        indexDescriptor,
+                        
tableStorage.engine().createSortedIndexComparator(indexDescriptor)
                 )
         );
     }
@@ -222,7 +230,8 @@ class IndexStorageFactory {
                     tableStorage.engine().generateGlobalRemoveId(),
                     indexMeta.metaPageId(),
                     freeList,
-                    indexDescriptor
+                    indexDescriptor,
+                    
tableStorage.engine().createSortedIndexComparator(indexDescriptor)
             );
         } catch (IgniteInternalCheckedException e) {
             throw new StorageException(e);
diff --git 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/PageMemoryIndexes.java
 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/PageMemoryIndexes.java
index c7e33d4709c..74ed3e126e4 100644
--- 
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/PageMemoryIndexes.java
+++ 
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/PageMemoryIndexes.java
@@ -169,7 +169,7 @@ class PageMemoryIndexes {
         }
     }
 
-    CompletableFuture<Void> destroyIndex(int indexId, IndexMetaTree 
indexMetaTree) {
+    CompletableFuture<Void> destroyIndex(int indexId, IndexStorageFactory 
indexStorageFactory, IndexMetaTree indexMetaTree) {
         PageMemoryHashIndexStorage hashIndexStorage = 
hashIndexes.remove(indexId);
 
         if (hashIndexStorage != null) {
@@ -181,7 +181,13 @@ class PageMemoryIndexes {
         PageMemorySortedIndexStorage sortedIndexStorage = 
sortedIndexes.remove(indexId);
 
         if (sortedIndexStorage != null) {
-            return destroyStorage(indexId, sortedIndexStorage, indexMetaTree);
+            CompletableFuture<Void> destroyFuture = destroyStorage(indexId, 
sortedIndexStorage, indexMetaTree);
+
+            destroyFuture.whenComplete((v, t) ->
+                    
indexStorageFactory.sortedIndexDestroyed(sortedIndexStorage.indexDescriptor())
+            );
+
+            return destroyFuture;
         }
 
         return nullCompletedFuture();
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryMvTableStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryMvTableStorageTest.java
index 4bd24dd4574..50bfc108a9d 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryMvTableStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/PersistentPageMemoryMvTableStorageTest.java
@@ -51,6 +51,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.function.Supplier;
 import java.util.stream.IntStream;
 import org.apache.ignite.internal.components.LogSyncer;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
@@ -99,6 +100,9 @@ public class PersistentPageMemoryMvTableStorageTest extends 
AbstractMvTableStora
     @InjectConfiguration("mock.profiles.default {engine = aipersist, sizeBytes 
= " + Constants.GiB + "}")
     private StorageConfiguration storageConfig;
 
+    @InjectConfiguration
+    private SystemLocalConfiguration systemConfig;
+
     private PersistentPageMemoryStorageEngine engine;
 
     @InjectExecutorService
@@ -121,7 +125,7 @@ public class PersistentPageMemoryMvTableStorageTest extends 
AbstractMvTableStora
                 "test",
                 metricManager,
                 storageConfig,
-                null,
+                systemConfig,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryMvTableStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryMvTableStorageTest.java
index 7a721e60362..64b388d6f30 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryMvTableStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/VolatilePageMemoryMvTableStorageTest.java
@@ -28,6 +28,7 @@ import static org.mockito.Mockito.mock;
 
 import java.nio.ByteBuffer;
 import org.apache.ignite.internal.binarytuple.BinaryTupleBuilder;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureProcessor;
 import org.apache.ignite.internal.lang.IgniteInternalCheckedException;
@@ -59,14 +60,14 @@ public class VolatilePageMemoryMvTableStorageTest extends 
AbstractMvTableStorage
 
     @BeforeEach
     void setUp(
-            @InjectConfiguration("mock.profiles.default = {engine = aimem}")
-            StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = aimem}") 
StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         var ioRegistry = new PageIoRegistry();
 
         ioRegistry.loadFromServiceLoader();
 
-        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
ioRegistry, mock(FailureProcessor.class), clock);
+        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
systemConfig, ioRegistry, mock(FailureProcessor.class), clock);
 
         engine.start();
 
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/benchmarks/SortedIndexTreeInsertBenchmark.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/benchmarks/SortedIndexTreeInsertBenchmark.java
index 0cedd3cf8c8..c9ddadba64e 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/benchmarks/SortedIndexTreeInsertBenchmark.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/benchmarks/SortedIndexTreeInsertBenchmark.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.storage.pagememory.benchmarks;
 
 import static org.apache.ignite.internal.pagememory.PageIdAllocator.FLAG_AUX;
+import static 
org.apache.ignite.internal.storage.pagememory.AbstractPageMemoryStorageEngine.createNewJitComparator;
 
 import java.nio.ByteBuffer;
 import java.util.List;
@@ -115,6 +116,8 @@ public class SortedIndexTreeInsertBenchmark extends 
VolatilePageMemoryBenchmarkB
     public void setup() throws Exception {
         super.setup();
 
+        StorageSortedIndexDescriptor indexDescriptor = new 
StorageSortedIndexDescriptor(INDEX_ID, columnTypes.columnDescriptors(), false);
+
         sortedIndexTree = SortedIndexTree.createNew(
                 GROUP_ID,
                 "sortedIndex",
@@ -123,7 +126,8 @@ public class SortedIndexTreeInsertBenchmark extends 
VolatilePageMemoryBenchmarkB
                 new AtomicLong(),
                 volatilePageMemory.allocatePageNoReuse(GROUP_ID, PARTITION_ID, 
FLAG_AUX),
                 freeList,
-                new StorageSortedIndexDescriptor(INDEX_ID, 
columnTypes.columnDescriptors(), false)
+                indexDescriptor,
+                createNewJitComparator(indexDescriptor)
         );
     }
 
@@ -147,7 +151,7 @@ public class SortedIndexTreeInsertBenchmark extends 
VolatilePageMemoryBenchmarkB
     }
 
     private static StorageSortedIndexColumnDescriptor descriptor(int i, 
NativeType nativeType) {
-        return new StorageSortedIndexColumnDescriptor("col" + i, nativeType, 
false, true, true);
+        return new StorageSortedIndexColumnDescriptor("col" + i, nativeType, 
true, true, true);
     }
 
     private static ByteBuffer newLongTuple() {
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/PersistentPageMemoryStorageEngineTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/PersistentPageMemoryStorageEngineTest.java
index 51d3ecaa1e5..d658cbd2fe7 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/PersistentPageMemoryStorageEngineTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/PersistentPageMemoryStorageEngineTest.java
@@ -31,6 +31,7 @@ import java.nio.file.Path;
 import java.util.Iterator;
 import java.util.concurrent.ExecutorService;
 import org.apache.ignite.internal.catalog.CatalogService;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.metrics.LongMetric;
@@ -63,6 +64,9 @@ public class PersistentPageMemoryStorageEngineTest extends 
AbstractPersistentSto
     @InjectConfiguration("mock.profiles.default.engine = aipersist")
     private StorageConfiguration storageConfig;
 
+    @InjectConfiguration
+    private SystemLocalConfiguration systemConfig;
+
     @InjectExecutorService
     ExecutorService executorService;
 
@@ -83,7 +87,7 @@ public class PersistentPageMemoryStorageEngineTest extends 
AbstractPersistentSto
                 "test",
                 mock(MetricManager.class),
                 configuration,
-                null,
+                systemConfig,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/VolatilePageMemoryStorageEngineTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/VolatilePageMemoryStorageEngineTest.java
index 570526331b5..4bb0bef4bc4 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/VolatilePageMemoryStorageEngineTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/engine/VolatilePageMemoryStorageEngineTest.java
@@ -21,6 +21,7 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.mockito.Mockito.mock;
 
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
@@ -40,6 +41,9 @@ public class VolatilePageMemoryStorageEngineTest extends 
AbstractVolatileStorage
     @InjectConfiguration("mock.profiles.default.engine = aimem")
     private StorageConfiguration storageConfig;
 
+    @InjectConfiguration
+    SystemLocalConfiguration systemConfig;
+
     @Override
     protected StorageEngine createEngine() {
         return createEngine(storageConfig);
@@ -53,6 +57,7 @@ public class VolatilePageMemoryStorageEngineTest extends 
AbstractVolatileStorage
         return new VolatilePageMemoryStorageEngine(
                 "test",
                 configuration,
+                systemConfig,
                 ioRegistry,
                 mock(FailureManager.class),
                 clock
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemorySortedIndexStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemorySortedIndexStorageTest.java
index 4f3883d19b8..27836d2b7d5 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemorySortedIndexStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/PersistentPageMemorySortedIndexStorageTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.mock;
 import java.nio.file.Path;
 import java.util.concurrent.ExecutorService;
 import org.apache.ignite.internal.components.LogSyncer;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
@@ -55,8 +56,8 @@ class PersistentPageMemorySortedIndexStorageTest extends 
AbstractPageMemorySorte
     @BeforeEach
     void setUp(
             @WorkDirectory Path workDir,
-            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}")
-            StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}") StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         PageIoRegistry ioRegistry = new PageIoRegistry();
 
@@ -66,7 +67,7 @@ class PersistentPageMemorySortedIndexStorageTest extends 
AbstractPageMemorySorte
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
-                null,
+                systemConfig,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/VolatilePageMemorySortedIndexStorageLegacyComparatorTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/VolatilePageMemorySortedIndexStorageLegacyComparatorTest.java
new file mode 100644
index 00000000000..ebafb2ad50e
--- /dev/null
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/VolatilePageMemorySortedIndexStorageLegacyComparatorTest.java
@@ -0,0 +1,44 @@
+/*
+ * 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.storage.pagememory.index;
+
+import static 
org.apache.ignite.internal.storage.pagememory.AbstractPageMemoryStorageEngine.LEGACY_PAGE_MEMORY_SORTED_INDEX_COMPARATOR_PROPERTY;
+import static 
org.apache.ignite.internal.testframework.matchers.CompletableFutureMatcher.willCompleteSuccessfully;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import java.util.concurrent.CompletableFuture;
+import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
+import org.apache.ignite.internal.storage.configurations.StorageConfiguration;
+import org.junit.jupiter.api.BeforeEach;
+
+/**
+ * Same as {@link VolatilePageMemorySortedIndexStorageTest} but with the 
legacy comparator enabled.
+ */
+public class VolatilePageMemorySortedIndexStorageLegacyComparatorTest extends 
VolatilePageMemorySortedIndexStorageTest {
+    @BeforeEach
+    @Override
+    void setUp(@InjectConfiguration("mock.profiles.default = {engine = 
aimem}") StorageConfiguration storageConfig) {
+        CompletableFuture<Void> changeFuture = 
systemConfig.properties().change(props -> props
+                .create(LEGACY_PAGE_MEMORY_SORTED_INDEX_COMPARATOR_PROPERTY, 
val -> val.changePropertyValue("true"))
+        );
+
+        assertThat(changeFuture, willCompleteSuccessfully());
+
+        super.setUp(storageConfig);
+    }
+}
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/VolatilePageMemorySortedIndexStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/VolatilePageMemorySortedIndexStorageTest.java
index 526eca09dc2..f56bc422f9f 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/VolatilePageMemorySortedIndexStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/VolatilePageMemorySortedIndexStorageTest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_P
 import static org.apache.ignite.internal.util.IgniteUtils.closeAll;
 import static org.mockito.Mockito.mock;
 
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureProcessor;
@@ -41,16 +42,18 @@ import org.junit.jupiter.api.extension.ExtendWith;
 class VolatilePageMemorySortedIndexStorageTest extends 
AbstractPageMemorySortedIndexStorageTest {
     private VolatilePageMemoryStorageEngine engine;
 
+    @InjectConfiguration
+    protected SystemLocalConfiguration systemConfig;
+
     @BeforeEach
     void setUp(
-            @InjectConfiguration("mock.profiles.default = {engine = aimem}")
-            StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = aimem}") 
StorageConfiguration storageConfig
     ) {
         PageIoRegistry ioRegistry = new PageIoRegistry();
 
         ioRegistry.loadFromServiceLoader();
 
-        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
ioRegistry, mock(FailureProcessor.class), clock);
+        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
systemConfig, ioRegistry, mock(FailureProcessor.class), clock);
 
         engine.start();
 
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/hash/PersistentPageMemoryHashIndexStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/hash/PersistentPageMemoryHashIndexStorageTest.java
index 7076cd1df39..4d538149886 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/hash/PersistentPageMemoryHashIndexStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/hash/PersistentPageMemoryHashIndexStorageTest.java
@@ -25,6 +25,7 @@ import static org.mockito.Mockito.mock;
 import java.nio.file.Path;
 import java.util.concurrent.ExecutorService;
 import org.apache.ignite.internal.components.LogSyncer;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
@@ -54,10 +55,9 @@ class PersistentPageMemoryHashIndexStorageTest extends 
AbstractPageMemoryHashInd
 
     @BeforeEach
     void setUp(
-            @WorkDirectory
-            Path workDir,
-            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}")
-            StorageConfiguration storageConfig
+            @WorkDirectory Path workDir,
+            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}") StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         PageIoRegistry ioRegistry = new PageIoRegistry();
 
@@ -67,7 +67,7 @@ class PersistentPageMemoryHashIndexStorageTest extends 
AbstractPageMemoryHashInd
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
-                null,
+                systemConfig,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/hash/VolatilePageMemoryHashIndexStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/hash/VolatilePageMemoryHashIndexStorageTest.java
index c27f5e24a44..4dd5e5d98ee 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/hash/VolatilePageMemoryHashIndexStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/index/hash/VolatilePageMemoryHashIndexStorageTest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_P
 import static org.apache.ignite.internal.util.IgniteUtils.closeAll;
 import static org.mockito.Mockito.mock;
 
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.ConfigurationExtension;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureProcessor;
@@ -43,14 +44,14 @@ class VolatilePageMemoryHashIndexStorageTest extends 
AbstractPageMemoryHashIndex
 
     @BeforeEach
     void setUp(
-            @InjectConfiguration("mock.profiles.default = {engine = aimem}")
-            StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = aimem}") 
StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         PageIoRegistry ioRegistry = new PageIoRegistry();
 
         ioRegistry.loadFromServiceLoader();
 
-        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
ioRegistry, mock(FailureProcessor.class), clock);
+        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
systemConfig, ioRegistry, mock(FailureProcessor.class), clock);
 
         engine.start();
 
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/FailedCheckpointTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/FailedCheckpointTest.java
index d96ab9d8410..6b6369a6291 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/FailedCheckpointTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/FailedCheckpointTest.java
@@ -47,6 +47,7 @@ import java.util.concurrent.atomic.AtomicInteger;
 import java.util.concurrent.atomic.AtomicLong;
 import org.apache.ignite.internal.components.LogSyncer;
 import org.apache.ignite.internal.components.LongJvmPauseDetector;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.fileio.FileIo;
@@ -104,6 +105,9 @@ public class FailedCheckpointTest extends 
BaseMvStoragesTest {
     @InjectConfiguration("mock.profiles.default = {engine = aipersist}")
     private StorageConfiguration storageConfig;
 
+    @InjectConfiguration
+    private SystemLocalConfiguration systemConfig;
+
     private FilePageStoreManager filePageStoreManager;
     private CheckpointManager checkpointManager;
     private PersistentPageMemoryDataRegion dataRegion;
@@ -206,7 +210,7 @@ public class FailedCheckpointTest extends 
BaseMvStoragesTest {
         dataRegion = new PersistentPageMemoryDataRegion(
                 mock(MetricManager.class),
                 (PersistentPageMemoryProfileConfiguration) 
storageConfig.profiles().get("default"),
-                null,
+                systemConfig,
                 ioRegistry,
                 filePageStoreManager,
                 partitionMetaManager,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageConcurrencyTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageConcurrencyTest.java
index 3eabde5c85f..906dd141c63 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageConcurrencyTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageConcurrencyTest.java
@@ -29,6 +29,7 @@ import java.nio.file.Path;
 import java.util.UUID;
 import java.util.concurrent.ExecutorService;
 import org.apache.ignite.internal.components.LogSyncer;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
@@ -65,8 +66,8 @@ class PersistentPageMemoryMvPartitionStorageConcurrencyTest 
extends AbstractMvPa
     @BeforeEach
     void setUp(
             @WorkDirectory Path workDir,
-            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}")
-            StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}") StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         var ioRegistry = new PageIoRegistry();
 
@@ -76,7 +77,7 @@ class PersistentPageMemoryMvPartitionStorageConcurrencyTest 
extends AbstractMvPa
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
-                null,
+                systemConfig,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageGcTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageGcTest.java
index 36ade228aaa..ee1f29af972 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageGcTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageGcTest.java
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.mock;
 import java.nio.file.Path;
 import java.util.concurrent.ExecutorService;
 import org.apache.ignite.internal.components.LogSyncer;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.metrics.MetricManager;
@@ -55,8 +56,8 @@ class PersistentPageMemoryMvPartitionStorageGcTest extends 
AbstractMvPartitionSt
     @BeforeEach
     void setUp(
             @WorkDirectory Path workDir,
-            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}")
-            StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}") StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         var ioRegistry = new PageIoRegistry();
 
@@ -66,7 +67,7 @@ class PersistentPageMemoryMvPartitionStorageGcTest extends 
AbstractMvPartitionSt
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
-                null,
+                systemConfig,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
index ca85bfdba9f..03c1f2ffa1c 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorageTest.java
@@ -41,6 +41,7 @@ import java.util.NoSuchElementException;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.ignite.internal.components.LogSyncer;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.hlc.HybridTimestamp;
@@ -69,6 +70,9 @@ class PersistentPageMemoryMvPartitionStorageTest extends 
AbstractPageMemoryMvPar
     @InjectConfiguration("mock.profiles.default = {engine = aipersist}")
     private StorageConfiguration storageConfig;
 
+    @InjectConfiguration
+    SystemLocalConfiguration systemConfig;
+
     @InjectExecutorService
     private ExecutorService executorService;
 
@@ -89,7 +93,7 @@ class PersistentPageMemoryMvPartitionStorageTest extends 
AbstractPageMemoryMvPar
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
-                null,
+                systemConfig,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvTableStorageConcurrencyTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvTableStorageConcurrencyTest.java
index 85ab3220166..7ce3d18acbb 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvTableStorageConcurrencyTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvTableStorageConcurrencyTest.java
@@ -24,6 +24,7 @@ import static org.mockito.Mockito.mock;
 import java.nio.file.Path;
 import java.util.concurrent.ExecutorService;
 import org.apache.ignite.internal.components.LogSyncer;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.metrics.MetricManager;
@@ -52,8 +53,8 @@ class PersistentPageMemoryMvTableStorageConcurrencyTest 
extends AbstractMvTableS
     @BeforeEach
     void setUp(
             @WorkDirectory Path workDir,
-            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}")
-            StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}") StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         var ioRegistry = new PageIoRegistry();
 
@@ -63,7 +64,7 @@ class PersistentPageMemoryMvTableStorageConcurrencyTest 
extends AbstractMvTableS
                 "test",
                 mock(MetricManager.class),
                 storageConfig,
-                null,
+                systemConfig,
                 ioRegistry,
                 workDir,
                 null,
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageConcurrencyTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageConcurrencyTest.java
index 2dbe1674d13..c54b8fbdf15 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageConcurrencyTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageConcurrencyTest.java
@@ -21,6 +21,7 @@ import static 
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_STORAGE_
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_PARTITION_COUNT;
 import static org.mockito.Mockito.mock;
 
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureProcessor;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
@@ -41,13 +42,14 @@ class VolatilePageMemoryMvPartitionStorageConcurrencyTest 
extends AbstractMvPart
 
     @BeforeEach
     void setUp(
-            @InjectConfiguration("mock.profiles.default = {engine = aimem}") 
StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = aimem}") 
StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         var ioRegistry = new PageIoRegistry();
 
         ioRegistry.loadFromServiceLoader();
 
-        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
ioRegistry, mock(FailureProcessor.class), clock);
+        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
systemConfig, ioRegistry, mock(FailureProcessor.class), clock);
 
         engine.start();
 
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageGcTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageGcTest.java
index 900f2888db3..1578434a56d 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageGcTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageGcTest.java
@@ -21,6 +21,7 @@ import static 
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_STORAGE_
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_PARTITION_COUNT;
 import static org.mockito.Mockito.mock;
 
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureProcessor;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
@@ -41,14 +42,14 @@ class VolatilePageMemoryMvPartitionStorageGcTest extends 
AbstractMvPartitionStor
 
     @BeforeEach
     void setUp(
-            @InjectConfiguration("mock.profiles.default = {engine = aimem}")
-            StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = aimem}") 
StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         var ioRegistry = new PageIoRegistry();
 
         ioRegistry.loadFromServiceLoader();
 
-        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
ioRegistry, mock(FailureProcessor.class), clock);
+        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
systemConfig, ioRegistry, mock(FailureProcessor.class), clock);
 
         engine.start();
 
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageTest.java
index b55385398b6..f0463df877f 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvPartitionStorageTest.java
@@ -24,6 +24,7 @@ import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
 import static org.mockito.Mockito.mock;
 
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureProcessor;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
@@ -46,12 +47,12 @@ class VolatilePageMemoryMvPartitionStorageTest extends 
AbstractPageMemoryMvParti
     private VolatilePageMemoryTableStorage table;
 
     @BeforeEach
-    void setUp() {
+    void setUp(@InjectConfiguration SystemLocalConfiguration systemConfig) {
         var ioRegistry = new PageIoRegistry();
 
         ioRegistry.loadFromServiceLoader();
 
-        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
ioRegistry, mock(FailureProcessor.class), clock);
+        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
systemConfig, ioRegistry, mock(FailureProcessor.class), clock);
 
         engine.start();
 
diff --git 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvTableStorageConcurrencyTest.java
 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvTableStorageConcurrencyTest.java
index 0028bfbfd6e..4651f4fd4f3 100644
--- 
a/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvTableStorageConcurrencyTest.java
+++ 
b/modules/storage-page-memory/src/test/java/org/apache/ignite/internal/storage/pagememory/mv/VolatilePageMemoryMvTableStorageConcurrencyTest.java
@@ -21,6 +21,7 @@ import static 
org.apache.ignite.internal.catalog.CatalogService.DEFAULT_STORAGE_
 import static 
org.apache.ignite.internal.catalog.commands.CatalogUtils.DEFAULT_PARTITION_COUNT;
 import static org.mockito.Mockito.mock;
 
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureProcessor;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
@@ -38,13 +39,14 @@ class VolatilePageMemoryMvTableStorageConcurrencyTest 
extends AbstractMvTableSto
 
     @BeforeEach
     void setUp(
-            @InjectConfiguration("mock.profiles.default = {engine = aimem}") 
StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = aimem}") 
StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         var ioRegistry = new PageIoRegistry();
 
         ioRegistry.loadFromServiceLoader();
 
-        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
ioRegistry, mock(FailureProcessor.class), clock);
+        engine = new VolatilePageMemoryStorageEngine("node", storageConfig, 
systemConfig, ioRegistry, mock(FailureProcessor.class), clock);
 
         engine.start();
 
diff --git 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/PersistentPageMemoryGcUpdateHandlerTest.java
 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/PersistentPageMemoryGcUpdateHandlerTest.java
index f3771f7f8f6..6b747ae7b42 100644
--- 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/PersistentPageMemoryGcUpdateHandlerTest.java
+++ 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/PersistentPageMemoryGcUpdateHandlerTest.java
@@ -26,6 +26,7 @@ import java.nio.file.Path;
 import java.util.concurrent.ExecutorService;
 import org.apache.ignite.internal.components.LogSyncer;
 import org.apache.ignite.internal.components.LongJvmPauseDetector;
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureManager;
 import org.apache.ignite.internal.metrics.MetricManager;
@@ -60,8 +61,8 @@ class PersistentPageMemoryGcUpdateHandlerTest extends 
AbstractGcUpdateHandlerTes
     @BeforeEach
     void setUp(
             TestInfo testInfo,
-            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}")
-            StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = 
aipersist}") StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         PageIoRegistry ioRegistry = new PageIoRegistry();
 
@@ -73,7 +74,7 @@ class PersistentPageMemoryGcUpdateHandlerTest extends 
AbstractGcUpdateHandlerTes
                 nodeName,
                 mock(MetricManager.class),
                 storageConfig,
-                null,
+                systemConfig,
                 ioRegistry,
                 workDir,
                 new LongJvmPauseDetector(nodeName),
diff --git 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/VolatilePageMemoryGcUpdateHandlerTest.java
 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/VolatilePageMemoryGcUpdateHandlerTest.java
index b7f74cb9350..f2b14cea9ed 100644
--- 
a/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/VolatilePageMemoryGcUpdateHandlerTest.java
+++ 
b/modules/table/src/test/java/org/apache/ignite/internal/table/distributed/gc/VolatilePageMemoryGcUpdateHandlerTest.java
@@ -22,6 +22,7 @@ import static 
org.apache.ignite.internal.storage.pagememory.configuration.PageMe
 import static 
org.apache.ignite.internal.testframework.IgniteTestUtils.testNodeName;
 import static org.mockito.Mockito.mock;
 
+import org.apache.ignite.internal.configuration.SystemLocalConfiguration;
 import 
org.apache.ignite.internal.configuration.testframework.InjectConfiguration;
 import org.apache.ignite.internal.failure.FailureProcessor;
 import org.apache.ignite.internal.pagememory.io.PageIoRegistry;
@@ -43,8 +44,8 @@ class VolatilePageMemoryGcUpdateHandlerTest extends 
AbstractGcUpdateHandlerTest
     @BeforeEach
     void setUp(
             TestInfo testInfo,
-            @InjectConfiguration("mock.profiles.default = {engine = aimem}")
-            StorageConfiguration storageConfig
+            @InjectConfiguration("mock.profiles.default = {engine = aimem}") 
StorageConfiguration storageConfig,
+            @InjectConfiguration SystemLocalConfiguration systemConfig
     ) {
         PageIoRegistry ioRegistry = new PageIoRegistry();
 
@@ -53,6 +54,7 @@ class VolatilePageMemoryGcUpdateHandlerTest extends 
AbstractGcUpdateHandlerTest
         engine = new VolatilePageMemoryStorageEngine(
                 testNodeName(testInfo, 0),
                 storageConfig,
+                systemConfig,
                 ioRegistry,
                 mock(FailureProcessor.class),
                 clock


Reply via email to