From dd56ebff35ea92e0b02b216ee0e8d820a0835f32 Mon Sep 17 00:00:00 2001 From: Kirill Sizov Date: Fri, 27 Dec 2024 17:27:24 +0300 Subject: [PATCH 1/4] IGNITE-23885 Start partition in a common manner in case of a single element in chain --- .../rebalance/RebalanceUtil.java | 67 +++++++++++++++++-- .../table/distributed/TableManager.java | 55 ++++++++++----- 2 files changed, 100 insertions(+), 22 deletions(-) diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/RebalanceUtil.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/RebalanceUtil.java index c845b177636..913af0a41a1 100644 --- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/RebalanceUtil.java +++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/RebalanceUtil.java @@ -63,6 +63,7 @@ import org.apache.ignite.internal.metastorage.dsl.Iif; import org.apache.ignite.internal.partitiondistribution.Assignment; import org.apache.ignite.internal.partitiondistribution.Assignments; +import org.apache.ignite.internal.partitiondistribution.AssignmentsChain; import org.apache.ignite.internal.replicator.TablePartitionId; import org.apache.ignite.internal.util.ExceptionUtils; import org.jetbrains.annotations.Nullable; @@ -620,6 +621,24 @@ public static CompletableFuture> partitionAssignments( .thenApply(e -> (e.value() == null) ? null : Assignments.fromBytes(e.value()).nodes()); } + /** + * Returns partition assignments from meta storage locally. + * + * @param metaStorageManager Meta storage manager. + * @param tablePartitionId Table partition id. + * @param revision Revision. + * @return Returns partition assignments from meta storage locally or {@code null} if assignments is absent. + */ + public static @Nullable Assignments stableAssignments( + MetaStorageManager metaStorageManager, + TablePartitionId tablePartitionId, + long revision + ) { + Entry entry = metaStorageManager.getLocally(stablePartAssignmentsKey(tablePartitionId), revision); + + return (entry == null || entry.empty() || entry.tombstone()) ? null : Assignments.fromBytes(entry.value()); + } + /** * Returns partition assignments from meta storage locally. * @@ -636,9 +655,9 @@ public static Set partitionAssignmentsGetLocally( int partitionNumber, long revision ) { - Entry entry = metaStorageManager.getLocally(stablePartAssignmentsKey(new TablePartitionId(tableId, partitionNumber)), revision); + Assignments assignments = stableAssignments(metaStorageManager, new TablePartitionId(tableId, partitionNumber), revision); - return (entry == null || entry.empty() || entry.tombstone()) ? null : Assignments.fromBytes(entry.value()).nodes(); + return assignments == null ? null : assignments.nodes(); } /** @@ -686,11 +705,11 @@ public static List tableAssignmentsGetLocally( ) { return IntStream.range(0, numberOfPartitions) .mapToObj(p -> { - Entry e = metaStorageManager.getLocally(stablePartAssignmentsKey(new TablePartitionId(tableId, p)), revision); + Assignments assignments = stableAssignments(metaStorageManager, new TablePartitionId(tableId, p), revision); - assert e != null && !e.empty() && !e.tombstone() : e; + assert assignments != null; - return Assignments.fromBytes(e.value()); + return assignments; }) .collect(toList()); } @@ -718,4 +737,42 @@ public static List tablePendingAssignmentsGetLocally( }) .collect(toList()); } + + /** + * Returns assignments chains for all table partitions from meta storage locally. + * + * @param metaStorageManager Meta storage manager. + * @param tableId Table id. + * @param numberOfPartitions Number of partitions. + * @param revision Revision. + * @return Future with table assignments as a value. + */ + public static List tableAssignmentsChainGetLocally( + MetaStorageManager metaStorageManager, + int tableId, + int numberOfPartitions, + long revision + ) { + return IntStream.range(0, numberOfPartitions) + .mapToObj(p -> assignmentsChain(metaStorageManager, new TablePartitionId(tableId, p), revision)) + .collect(toList()); + } + + /** + * Returns assignments chain from meta storage locally. + * + * @param metaStorageManager Meta storage manager. + * @param tablePartitionId Table partition id. + * @param revision Revision. + * @return Returns assignments chain from meta storage locally or {@code null} if assignments is absent. + */ + public static @Nullable AssignmentsChain assignmentsChain( + MetaStorageManager metaStorageManager, + TablePartitionId tablePartitionId, + long revision + ) { + Entry e = metaStorageManager.getLocally(assignmentsChainKey(tablePartitionId), revision); + + return e != null ? AssignmentsChain.fromBytes(e.value()) : null; + } } diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java index e2a9f94fdbf..d1460670e4a 100644 --- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java +++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java @@ -33,12 +33,15 @@ import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.ASSIGNMENTS_SWITCH_REDUCE_PREFIX_BYTES; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.PENDING_ASSIGNMENTS_PREFIX_BYTES; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.STABLE_ASSIGNMENTS_PREFIX_BYTES; +import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.assignmentsChain; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.assignmentsChainKey; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.extractTablePartitionId; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.partitionAssignmentsGetLocally; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.pendingPartAssignmentsKey; +import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.stableAssignments; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.stablePartAssignmentsKey; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.subtract; +import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.tableAssignmentsChainGetLocally; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.tableAssignmentsGetLocally; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.tablePendingAssignmentsGetLocally; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.union; @@ -304,7 +307,7 @@ public class TableManager implements IgniteTablesInternal, IgniteComponent { * Versioned value for tracking RAFT groups initialization and starting completion. * *

Only explicitly updated in - * {@link #startLocalPartitionsAndClients(CompletableFuture, List, TableImpl, boolean, long)}. + * {@link #startLocalPartitionsAndClients(CompletableFuture, List, List, TableImpl, boolean, long)}. * *

Completed strictly after {@link #localPartitionsVv}. */ @@ -1132,6 +1135,7 @@ private CompletableFuture onTableRename(RenameTableEventParameters parameters private CompletableFuture startLocalPartitionsAndClients( CompletableFuture> stableAssignmentsFuture, List<@Nullable Assignments> pendingAssignmentsForPartitions, + List<@Nullable AssignmentsChain> assignmentsChains, TableImpl table, boolean isRecovery, long assignmentsTimestamp @@ -1161,13 +1165,21 @@ private CompletableFuture startLocalPartitionsAndClients( boolean shouldStartPartition; if (isRecovery) { - // The condition to start the replica is - // `pending.contains(node) || (stable.contains(node) && !pending.isForce())`. - // However we check only the right part of this condition here - // since after `startTables` we have a call to `processAssignmentsOnRecovery`, - // which executes pending assignments update and will start required partitions there. - shouldStartPartition = localMemberAssignmentInStable != null - && (pendingAssignments == null || !pendingAssignments.force()); + AssignmentsChain assignmentsChain = assignmentsChains.get(i); + + if (assignmentsChain == null || assignmentsChain.chain().size() == 1) { + // The condition to start the replica is + // `pending.contains(node) || (stable.contains(node) && !pending.isForce())`. + // However we check only the right part of this condition here + // since after `startTables` we have a call to `processAssignmentsOnRecovery`, + // which executes pending assignments update and will start required partitions there. + shouldStartPartition = localMemberAssignmentInStable != null + && (pendingAssignments == null || !pendingAssignments.force()); + } else { + // TODO: Use logic from https://issues.apache.org/jira/browse/IGNITE-23874 + shouldStartPartition = localMemberAssignmentInStable != null + && (pendingAssignments == null || !pendingAssignments.force()); + } } else { shouldStartPartition = localMemberAssignmentInStable != null; } @@ -1663,6 +1675,9 @@ private CompletableFuture createTableLocally( List pendingAssignments = tablePendingAssignmentsGetLocally(metaStorageMgr, tableId, zoneDescriptor.partitions(), causalityToken); + List assignmentsChains = + tableAssignmentsChainGetLocally(metaStorageMgr, tableId, zoneDescriptor.partitions(), causalityToken); + CompletableFuture> stableAssignmentsFutureAfterInvoke = writeTableAssignmentsToMetastore(tableId, zoneDescriptor.consistencyMode(), stableAssignmentsFuture); @@ -1674,6 +1689,7 @@ private CompletableFuture createTableLocally( zoneDescriptor, stableAssignmentsFutureAfterInvoke, pendingAssignments, + assignmentsChains, onNodeRecovery, catalog.time() ); @@ -1696,6 +1712,7 @@ private CompletableFuture createTableLocally( CatalogZoneDescriptor zoneDescriptor, CompletableFuture> stableAssignmentsFuture, List pendingAssignments, + List assignmentsChains, boolean onNodeRecovery, long assignmentsTimestamp ) { @@ -1748,6 +1765,7 @@ private CompletableFuture createTableLocally( return startLocalPartitionsAndClients( stableAssignmentsFuture, pendingAssignments, + assignmentsChains, table, onNodeRecovery, assignmentsTimestamp @@ -2152,7 +2170,9 @@ private CompletableFuture handleChangePendingAssignmentEvent( TablePartitionId replicaGrpId = extractTablePartitionId(pendingAssignmentsEntry.key(), PENDING_ASSIGNMENTS_PREFIX_BYTES); // Stable assignments from the meta store, which revision is bounded by the current pending event. - Assignments stableAssignments = stableAssignments(replicaGrpId, revision); + Assignments stableAssignments = stableAssignments(metaStorageMgr, replicaGrpId, revision); + + AssignmentsChain assignmentsChain = assignmentsChain(metaStorageMgr, replicaGrpId, revision); Assignments pendingAssignments = Assignments.fromBytes(pendingAssignmentsEntry.value()); @@ -2195,6 +2215,7 @@ private CompletableFuture handleChangePendingAssignmentEvent( table, stableAssignments, pendingAssignments, + assignmentsChain, revision, isRecovery ).thenAccept(v -> executeIfLocalNodeIsPrimaryForGroup( @@ -2218,6 +2239,7 @@ private CompletableFuture handleChangePendingAssignmentEvent( TableImpl tbl, @Nullable Assignments stableAssignments, Assignments pendingAssignments, + @Nullable AssignmentsChain assignmentsChain, long revision, boolean isRecovery ) { @@ -2235,7 +2257,12 @@ private CompletableFuture handleChangePendingAssignmentEvent( // `pending.contains(node) || (stable.contains(node) && !pending.isForce())`. // This condition covers the left part of the OR expression. // The right part of it is covered in `startLocalPartitionsAndClients`. - shouldStartLocalGroupNode = localMemberAssignmentInPending != null; + if (assignmentsChain == null || assignmentsChain.chain().size() == 1) { + shouldStartLocalGroupNode = localMemberAssignmentInPending != null; + } else { + // TODO: Use logic from https://issues.apache.org/jira/browse/IGNITE-23874. + shouldStartLocalGroupNode = localMemberAssignmentInPending != null; + } } else { shouldStartLocalGroupNode = localMemberAssignmentInPending != null && localMemberAssignmentInStable == null; } @@ -2980,7 +3007,7 @@ public CompletableFuture restartPartition(TablePartitionId tablePartitionI TableImpl table = tables.get(tablePartitionId.tableId()); return stopPartitionForRestart(tablePartitionId, table).thenComposeAsync(unused1 -> { - Assignments stableAssignments = stableAssignments(tablePartitionId, revision); + Assignments stableAssignments = stableAssignments(metaStorageMgr, tablePartitionId, revision); assert stableAssignments != null : "tablePartitionId=" + tablePartitionId + ", revision=" + revision; @@ -3005,12 +3032,6 @@ public CompletableFuture restartPartition(TablePartitionId tablePartitionI }), ioExecutor)); } - private @Nullable Assignments stableAssignments(TablePartitionId tablePartitionId, long revision) { - Entry entry = metaStorageMgr.getLocally(stablePartAssignmentsKey(tablePartitionId), revision); - - return Assignments.fromBytes(entry.value()); - } - @Override public void setStreamerReceiverRunner(StreamerReceiverRunner runner) { this.streamerReceiverRunner = runner; From fb63a17a1add4a3eebf3434d9f87c1f3b4cd226c Mon Sep 17 00:00:00 2001 From: Kirill Sizov Date: Fri, 10 Jan 2025 14:00:35 +0300 Subject: [PATCH 2/4] Unify naming --- .../rebalance/RebalanceUtil.java | 10 +++---- .../table/distributed/TableManager.java | 27 ++++++++++++++----- 2 files changed, 25 insertions(+), 12 deletions(-) diff --git a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/RebalanceUtil.java b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/RebalanceUtil.java index 913af0a41a1..1f1ec672ac9 100644 --- a/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/RebalanceUtil.java +++ b/modules/distribution-zones/src/main/java/org/apache/ignite/internal/distributionzones/rebalance/RebalanceUtil.java @@ -629,7 +629,7 @@ public static CompletableFuture> partitionAssignments( * @param revision Revision. * @return Returns partition assignments from meta storage locally or {@code null} if assignments is absent. */ - public static @Nullable Assignments stableAssignments( + public static @Nullable Assignments stableAssignmentsGetLocally( MetaStorageManager metaStorageManager, TablePartitionId tablePartitionId, long revision @@ -655,7 +655,7 @@ public static Set partitionAssignmentsGetLocally( int partitionNumber, long revision ) { - Assignments assignments = stableAssignments(metaStorageManager, new TablePartitionId(tableId, partitionNumber), revision); + Assignments assignments = stableAssignmentsGetLocally(metaStorageManager, new TablePartitionId(tableId, partitionNumber), revision); return assignments == null ? null : assignments.nodes(); } @@ -705,7 +705,7 @@ public static List tableAssignmentsGetLocally( ) { return IntStream.range(0, numberOfPartitions) .mapToObj(p -> { - Assignments assignments = stableAssignments(metaStorageManager, new TablePartitionId(tableId, p), revision); + Assignments assignments = stableAssignmentsGetLocally(metaStorageManager, new TablePartitionId(tableId, p), revision); assert assignments != null; @@ -754,7 +754,7 @@ public static List tableAssignmentsChainGetLocally( long revision ) { return IntStream.range(0, numberOfPartitions) - .mapToObj(p -> assignmentsChain(metaStorageManager, new TablePartitionId(tableId, p), revision)) + .mapToObj(p -> assignmentsChainGetLocally(metaStorageManager, new TablePartitionId(tableId, p), revision)) .collect(toList()); } @@ -766,7 +766,7 @@ public static List tableAssignmentsChainGetLocally( * @param revision Revision. * @return Returns assignments chain from meta storage locally or {@code null} if assignments is absent. */ - public static @Nullable AssignmentsChain assignmentsChain( + public static @Nullable AssignmentsChain assignmentsChainGetLocally( MetaStorageManager metaStorageManager, TablePartitionId tablePartitionId, long revision diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java index d1460670e4a..0df3f7db68d 100644 --- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java +++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java @@ -33,12 +33,12 @@ import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.ASSIGNMENTS_SWITCH_REDUCE_PREFIX_BYTES; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.PENDING_ASSIGNMENTS_PREFIX_BYTES; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.STABLE_ASSIGNMENTS_PREFIX_BYTES; -import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.assignmentsChain; +import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.assignmentsChainGetLocally; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.assignmentsChainKey; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.extractTablePartitionId; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.partitionAssignmentsGetLocally; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.pendingPartAssignmentsKey; -import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.stableAssignments; +import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.stableAssignmentsGetLocally; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.stablePartAssignmentsKey; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.subtract; import static org.apache.ignite.internal.distributionzones.rebalance.RebalanceUtil.tableAssignmentsChainGetLocally; @@ -1167,7 +1167,7 @@ private CompletableFuture startLocalPartitionsAndClients( if (isRecovery) { AssignmentsChain assignmentsChain = assignmentsChains.get(i); - if (assignmentsChain == null || assignmentsChain.chain().size() == 1) { + if (lastRebalanceWasGraceful(assignmentsChain)) { // The condition to start the replica is // `pending.contains(node) || (stable.contains(node) && !pending.isForce())`. // However we check only the right part of this condition here @@ -1177,6 +1177,8 @@ private CompletableFuture startLocalPartitionsAndClients( && (pendingAssignments == null || !pendingAssignments.force()); } else { // TODO: Use logic from https://issues.apache.org/jira/browse/IGNITE-23874 + LOG.warn("Recovery after a forced rebalance for table is not supported yet [tableId={}, partitionId={}].", + tableId, partId); shouldStartPartition = localMemberAssignmentInStable != null && (pendingAssignments == null || !pendingAssignments.force()); } @@ -2170,9 +2172,9 @@ private CompletableFuture handleChangePendingAssignmentEvent( TablePartitionId replicaGrpId = extractTablePartitionId(pendingAssignmentsEntry.key(), PENDING_ASSIGNMENTS_PREFIX_BYTES); // Stable assignments from the meta store, which revision is bounded by the current pending event. - Assignments stableAssignments = stableAssignments(metaStorageMgr, replicaGrpId, revision); + Assignments stableAssignments = stableAssignmentsGetLocally(metaStorageMgr, replicaGrpId, revision); - AssignmentsChain assignmentsChain = assignmentsChain(metaStorageMgr, replicaGrpId, revision); + AssignmentsChain assignmentsChain = assignmentsChainGetLocally(metaStorageMgr, replicaGrpId, revision); Assignments pendingAssignments = Assignments.fromBytes(pendingAssignmentsEntry.value()); @@ -2257,10 +2259,12 @@ private CompletableFuture handleChangePendingAssignmentEvent( // `pending.contains(node) || (stable.contains(node) && !pending.isForce())`. // This condition covers the left part of the OR expression. // The right part of it is covered in `startLocalPartitionsAndClients`. - if (assignmentsChain == null || assignmentsChain.chain().size() == 1) { + if (lastRebalanceWasGraceful(assignmentsChain)) { shouldStartLocalGroupNode = localMemberAssignmentInPending != null; } else { // TODO: Use logic from https://issues.apache.org/jira/browse/IGNITE-23874. + LOG.warn("Recovery after a forced rebalance for table is not supported yet [tablePartitionId={}].", + replicaGrpId); shouldStartLocalGroupNode = localMemberAssignmentInPending != null; } } else { @@ -2380,6 +2384,15 @@ private CompletableFuture handleChangePendingAssignmentEvent( }), ioExecutor); } + /** + * For HA zones: Check that last rebalance was graceful (raft group maintained the majority) rather than forced (caused by a disaster + * recovery reset after losing the majority of nodes). + */ + private static boolean lastRebalanceWasGraceful(@Nullable AssignmentsChain assignmentsChain) { + // Assignments chain is either empty (when there have been no stable switch yet) or contains a single element in chain. + return assignmentsChain == null || assignmentsChain.chain().size() == 1; + } + private static PartitionSet extendPartitionSet(@Nullable PartitionSet oldPartitionSet, int partitionId) { PartitionSet newPartitionSet = Objects.requireNonNullElseGet(oldPartitionSet, BitSetPartitionSet::new); newPartitionSet.set(partitionId); @@ -3007,7 +3020,7 @@ public CompletableFuture restartPartition(TablePartitionId tablePartitionI TableImpl table = tables.get(tablePartitionId.tableId()); return stopPartitionForRestart(tablePartitionId, table).thenComposeAsync(unused1 -> { - Assignments stableAssignments = stableAssignments(metaStorageMgr, tablePartitionId, revision); + Assignments stableAssignments = stableAssignmentsGetLocally(metaStorageMgr, tablePartitionId, revision); assert stableAssignments != null : "tablePartitionId=" + tablePartitionId + ", revision=" + revision; From 9e6cc6427fd5943c19a36e551da8072969e55724 Mon Sep 17 00:00:00 2001 From: Cyrill Date: Mon, 13 Jan 2025 15:32:45 +0300 Subject: [PATCH 3/4] Update modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java Co-authored-by: Mirza Aliev --- .../apache/ignite/internal/table/distributed/TableManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java index 0df3f7db68d..2885deab0f2 100644 --- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java +++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java @@ -2385,7 +2385,7 @@ private CompletableFuture handleChangePendingAssignmentEvent( } /** - * For HA zones: Check that last rebalance was graceful (raft group maintained the majority) rather than forced (caused by a disaster + * For HA zones: Check that last rebalance was graceful (caused by common rebalance triggers, like data nodes change, replica factor change, etc.) rather than forced (caused by a disaster * recovery reset after losing the majority of nodes). */ private static boolean lastRebalanceWasGraceful(@Nullable AssignmentsChain assignmentsChain) { From 4acd1bccc00224cbd1d85a189b64de2bd4ea614b Mon Sep 17 00:00:00 2001 From: Kirill Sizov Date: Mon, 13 Jan 2025 16:19:14 +0300 Subject: [PATCH 4/4] Fix checkstyle --- .../ignite/internal/table/distributed/TableManager.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java index 2885deab0f2..dc5a8883b43 100644 --- a/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java +++ b/modules/table/src/main/java/org/apache/ignite/internal/table/distributed/TableManager.java @@ -2385,8 +2385,8 @@ private CompletableFuture handleChangePendingAssignmentEvent( } /** - * For HA zones: Check that last rebalance was graceful (caused by common rebalance triggers, like data nodes change, replica factor change, etc.) rather than forced (caused by a disaster - * recovery reset after losing the majority of nodes). + * For HA zones: Check that last rebalance was graceful (caused by common rebalance triggers, like data nodes change, replica factor + * change, etc.) rather than forced (caused by a disaster recovery reset after losing the majority of nodes). */ private static boolean lastRebalanceWasGraceful(@Nullable AssignmentsChain assignmentsChain) { // Assignments chain is either empty (when there have been no stable switch yet) or contains a single element in chain.