This is an automated email from the ASF dual-hosted git repository. tkalkirill pushed a commit to branch ignite-26851 in repository https://gitbox.apache.org/repos/asf/ignite-3.git
commit 7aff5b681906786f4f28b7c84d7b7f85b5e8dc6f Author: Kirill Tkalenko <[email protected]> AuthorDate: Tue Nov 11 16:04:40 2025 +0300 IGNITE-26851 wip --- .../persistence/PersistentPageMemory.java | 2 +- .../pagememory/AbstractPageMemoryTableStorage.java | 22 +++++++++++---------- .../mv/AbstractPageMemoryMvPartitionStorage.java | 23 ++++++++++++++++++++++ .../PersistentPageMemoryMvTableStorageTest.java | 22 +++++++++++++++++++++ 4 files changed, 58 insertions(+), 11 deletions(-) diff --git a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java index 2c1d0e637a4..cc19d515f2c 100644 --- a/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java +++ b/modules/page-memory/src/main/java/org/apache/ignite/internal/pagememory/persistence/PersistentPageMemory.java @@ -783,7 +783,7 @@ public class PersistentPageMemory implements PageMemory { lockedPageAbsPtr = absPtr; } } else if (relPtr == OUTDATED_REL_PTR) { - assert pageIndex(pageId) == 0 : fullId; + // assert pageIndex(pageId) == 0 : fullId; relPtr = seg.refreshOutdatedPage(grpId, pageId, false); diff --git a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java index 1da4f4af9dd..a071959b5b4 100644 --- a/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java +++ b/modules/storage-page-memory/src/main/java/org/apache/ignite/internal/storage/pagememory/AbstractPageMemoryTableStorage.java @@ -307,18 +307,20 @@ public abstract class AbstractPageMemoryTableStorage<T extends AbstractPageMemor @Override public CompletableFuture<Void> abortRebalancePartition(int partitionId) { - return busy(() -> mvPartitionStorages.abortRebalance(partitionId, mvPartitionStorage -> - clearStorageAndUpdateDataStructures(mvPartitionStorage) - .thenAccept(unused -> { - mvPartitionStorage.runConsistently(locker -> { - mvPartitionStorage.lastAppliedOnRebalance(0, 0); + return busy(() -> mvPartitionStorages.abortRebalance(partitionId, mvPartitionStorage -> { + mvPartitionStorage.startAbortRebalance(); - return null; - }); + return clearStorageAndUpdateDataStructures(mvPartitionStorage) + .thenAccept(unused -> { + mvPartitionStorage.runConsistently(locker -> { + mvPartitionStorage.lastAppliedOnRebalance(0, 0); - mvPartitionStorage.completeRebalance(); - }) - )); + return null; + }); + + mvPartitionStorage.completeRebalance(); + }); + })); } @Override 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 fe9582d44d6..6d0fb0ee99a 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 @@ -826,6 +826,29 @@ public abstract class AbstractPageMemoryMvPartitionStorage implements MvPartitio } } + /** + * Prepares the storage and its indexes for rebalance abortion. + * + * <p>Stops ongoing operations on the storage and its indexes.</p> + * + * @throws StorageRebalanceException If there was an error when starting the rebalance abortion. + */ + public void startAbortRebalance() { + // Changed storage states and expect all storage operations to stop soon. + busyLock.block(); + + try { + closeAll(getResourcesToCloseOnCleanup()); + } catch (Exception e) { + throw new StorageRebalanceException( + IgniteStringFormatter.format("Error on start abort of rebalancing: [{}]", createStorageInfo()), + e + ); + } finally { + busyLock.unblock(); + } + } + /** * Completes the rebalancing of the storage and its indexes. * 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 6d05807b29d..6951fc9e9b5 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 @@ -544,6 +544,28 @@ public class PersistentPageMemoryMvTableStorageTest extends AbstractMvTableStora } } + @Test + void testSyncFreeListMetadataOnCheckpointAfterAbortRebalance() { + int[] partitionIds = IntStream.range(0, 5) + .map(i -> PARTITION_ID + i) + .toArray(); + + PersistentPageMemoryMvPartitionStorage[] partitions = getOrCreateMvPartitions(partitionIds); + + for (int i = 0; i < 10; i++) { + addWriteCommitted(partitions); + + startRebalance(partitionIds); + + addWriteCommitted(partitions); + + runRace( + () -> abortRebalance(partitionIds), + () -> assertThat(forceCheckpointAsync(), willCompleteSuccessfully()) + ); + } + } + private CompletableFuture<Void> forceCheckpointAsync() { return engine.checkpointManager().forceCheckpoint("test").futureFor(FINISHED); }
