sanpwc commented on code in PR #4688:
URL: https://github.com/apache/ignite-3/pull/4688#discussion_r1851567653


##########
modules/table/src/main/java/org/apache/ignite/internal/table/distributed/disaster/GroupUpdateRequest.java:
##########
@@ -254,42 +292,60 @@ private static CompletableFuture<Integer> partitionUpdate(
             return completedFuture(ASSIGNMENT_NOT_UPDATED.ordinal());
         }
 
-        Iif invokeClosure;
-
-        if (aliveStableNodes.isEmpty()) {
-            if (!manualUpdate) {
-                return completedFuture(ASSIGNMENT_NOT_UPDATED.ordinal());
-            }
+        if (aliveStableNodes.isEmpty() && !manualUpdate) {
+            return completedFuture(ASSIGNMENT_NOT_UPDATED.ordinal());
+        }
 
+        if (manualUpdate) {
             enrichAssignments(partId, aliveDataNodes, replicas, 
partAssignments);
+        }
 
-            // There are no known nodes with data, which means that we can 
just put new assignments into pending assignments with "forced"
-            // flag.
-            invokeClosure = prepareMsInvokeClosure(
-                    partId,
-                    longToBytesKeepingOrder(revision),
-                    Assignments.forced(partAssignments, 
assignmentsTimestamp).toBytes(),
-                    null
-            );
-        } else {
-            Set<Assignment> stableAssignments = Set.copyOf(partAssignments);
+        Assignment nextAssignment = aliveStableNodes.isEmpty()
+                ? nextAssignment(partAssignments)
+                : nextAssignment(localPartitionStateMessageByNode, 
partAssignments);
+
+        // There are nodes with data, and we set pending assignments to this 
set of nodes. It'll be the source of peers for
+        // "resetPeers", and after that new assignments with restored replica 
factor wil be picked up from planned assignments
+        // for the case of the manual update, that was triggered by a user.
+        Iif invokeClosure = prepareMsInvokeClosure(
+                partId,
+                longToBytesKeepingOrder(revision),
+                Assignments.forced(Set.of(nextAssignment), 
assignmentsTimestamp).toBytes(),
+                Assignments.toBytes(partAssignments, assignmentsTimestamp)
+        );
 
-            if (manualUpdate) {
-                enrichAssignments(partId, aliveDataNodes, replicas, 
partAssignments);
-            }
+        return 
metaStorageMgr.invoke(invokeClosure).thenApply(StatementResult::getAsInt);
+    }
 
-            // There are nodes with data, and we set pending assignments to 
this set of nodes. It'll be the source of peers for
-            // "resetPeers", and after that new assignments with restored 
replica factor wil be picked up from planned assignments
-            // for the case of the manual update, that was triggered by a user.
-            invokeClosure = prepareMsInvokeClosure(
-                    partId,
-                    longToBytesKeepingOrder(revision),
-                    Assignments.forced(stableAssignments, 
assignmentsTimestamp).toBytes(),
-                    Assignments.toBytes(partAssignments, assignmentsTimestamp)
-            );
-        }
+    /**
+     * Returns the first assignment in the lexicographic order.
+     */
+    private static Assignment nextAssignment(Set<Assignment> assignments) {
+        assert !assignments.isEmpty() : "Alive nodes with data should not be 
empty";

Review Comment:
   It may fail now. I believe that there's no guarantee that enrichAssignments 
will return non empty set. E.g. because all dataNodes are down.



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: notifications-unsubscr...@ignite.apache.org

For queries about this service, please contact Infrastructure at:
us...@infra.apache.org

Reply via email to