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 62d8add86d6 IGNITE-27690 Fix WI list corruption on rebalance (#7495)
62d8add86d6 is described below
commit 62d8add86d68b0459d7d40403eaf62386421d12e
Author: Ivan Bessonov <[email protected]>
AuthorDate: Thu Jan 29 12:08:40 2026 +0300
IGNITE-27690 Fix WI list corruption on rebalance (#7495)
---
.../mv/PersistentPageMemoryMvPartitionStorage.java | 23 +++++++---------
.../PersistentPageMemoryMvTableStorageTest.java | 32 ++++++++++++++++++++++
2 files changed, 42 insertions(+), 13 deletions(-)
diff --git
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorage.java
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorage.java
index e2122ef9a55..8e46826f286 100644
---
a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorage.java
+++
b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/mv/PersistentPageMemoryMvPartitionStorage.java
@@ -142,7 +142,7 @@ public class PersistentPageMemoryMvPartitionStorage extends
AbstractPageMemoryMv
DataRegion<PersistentPageMemory> dataRegion =
tableStorage.dataRegion();
- this.meta = meta;
+ setNewMeta(meta);
checkpointManager.addCheckpointListener(checkpointListener = new
CheckpointListener() {
@Override
@@ -168,13 +168,14 @@ public class PersistentPageMemoryMvPartitionStorage
extends AbstractPageMemoryMv
leaseInfo = leaseInfoFromMeta();
}
- @Override
- public void start() {
- super.start();
-
- busy(() -> {
- wiHeadLink = meta.wiHeadLink();
- });
+ /**
+ * Updates the {@link #meta} field and all other values associated with it.
+ *
+ * @param meta New instance for partition's meta.
+ */
+ private void setNewMeta(StoragePartitionMeta meta) {
+ this.meta = meta;
+ this.wiHeadLink = meta.wiHeadLink();
}
@Override
@@ -436,10 +437,6 @@ public class PersistentPageMemoryMvPartitionStorage
extends AbstractPageMemoryMv
return wiHeadLock.isHeldByCurrentThread();
}
- long writeIntentListHead() {
- return wiHeadLink;
- }
-
@Override
public @Nullable LeaseInfo leaseInfo() {
return busy(() -> {
@@ -569,7 +566,7 @@ public class PersistentPageMemoryMvPartitionStorage extends
AbstractPageMemoryMv
) {
throwExceptionIfStorageNotInCleanupOrRebalancedState(state.get(),
this::createStorageInfo);
- this.meta = meta;
+ setNewMeta(meta);
this.blobStorage = new BlobStorage(
freeList,
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 6951fc9e9b5..4bd24dd4574 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
@@ -46,6 +46,7 @@ import java.util.UUID;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
+import java.util.concurrent.ThreadLocalRandom;
import java.util.concurrent.TimeUnit;
import java.util.function.Supplier;
import java.util.stream.IntStream;
@@ -76,6 +77,7 @@ import org.apache.ignite.internal.storage.lease.LeaseInfo;
import
org.apache.ignite.internal.storage.pagememory.configuration.schema.PersistentPageMemoryProfileConfiguration;
import
org.apache.ignite.internal.storage.pagememory.mv.PersistentPageMemoryMvPartitionStorage;
import org.apache.ignite.internal.testframework.ExecutorServiceExtension;
+import org.apache.ignite.internal.testframework.IgniteTestUtils;
import org.apache.ignite.internal.testframework.InjectExecutorService;
import org.apache.ignite.internal.testframework.WorkDirectory;
import org.apache.ignite.internal.testframework.WorkDirectoryExtension;
@@ -566,6 +568,36 @@ public class PersistentPageMemoryMvTableStorageTest
extends AbstractMvTableStora
}
}
+ @Test
+ void testRebalanceWithLotsOfWriteIntents() {
+ MvPartitionStorage partitionStorage =
getOrCreateMvPartition(PARTITION_ID);
+
+ for (int i = 0; i < 50; i++) {
+ addWriteUncommitted(partitionStorage);
+ }
+
+ assertThat(tableStorage.startRebalancePartition(PARTITION_ID),
willCompleteSuccessfully());
+
+ try {
+ addWriteUncommitted(partitionStorage);
+ } finally {
+ assertThat(tableStorage.abortRebalancePartition(PARTITION_ID),
willCompleteSuccessfully());
+ }
+ }
+
+ private void addWriteUncommitted(MvPartitionStorage partitionStorage0) {
+ String randomString =
IgniteTestUtils.randomString(ThreadLocalRandom.current(), 256);
+ BinaryRow binaryRow = binaryRow(new TestKey(0, randomString), new
TestValue(0, randomString));
+
+ partitionStorage0.runConsistently(locker -> {
+ RowId rowId = new RowId(PARTITION_ID);
+
+ locker.lock(rowId);
+
+ return partitionStorage0.addWrite(rowId, binaryRow,
newTransactionId(), 1, 1);
+ });
+ }
+
private CompletableFuture<Void> forceCheckpointAsync() {
return
engine.checkpointManager().forceCheckpoint("test").futureFor(FINISHED);
}