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

Reply via email to