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