Phillippko commented on code in PR #7156:
URL: https://github.com/apache/ignite-3/pull/7156#discussion_r2645312545
##########
modules/table/src/main/java/org/apache/ignite/internal/table/distributed/disaster/DisasterRecoveryManager.java:
##########
@@ -260,6 +274,16 @@ public DisasterRecoveryManager(
// There is no need to block a watch thread any longer.
return nullCompletedFuture();
});
+
+ nodeLeftListener = new LogicalTopologyEventListener() {
+ @Override
+ public void onNodeLeft(LogicalNode leftNode,
LogicalTopologySnapshot newTopology) {
+ MultiNodeOperations operations =
operationsByNodeName.get(leftNode.name());
+ if (operations != null) {
+ operations.completeAllExceptionally(leftNode.name(), new
NodeStoppingException());
+ }
Review Comment:
Use ID instead of name. Fixed race
##########
modules/table/src/main/java/org/apache/ignite/internal/table/distributed/disaster/DisasterRecoveryManager.java:
##########
@@ -1151,7 +1185,66 @@ private CompletableFuture<Void>
processNewRequest(DisasterRecoveryRequest reques
metaStorageManager.put(RECOVERY_TRIGGER_KEY, serializedRequest);
}
- return operationFuture;
+ return operationFuture.thenCompose(v -> remoteProcessingFuture);
+ }
+
+ private CompletableFuture<Void>
remoteProcessingFuture(DisasterRecoveryRequest request) {
+ if (request.type() != DisasterRecoveryRequestType.MULTI_NODE) {
+ return nullCompletedFuture();
+ }
+
+ UUID operationId = request.operationId();
+
+ MultiNodeDisasterRecoveryRequest multiNodeRequest =
(MultiNodeDisasterRecoveryRequest) request;
+
+ Collection<String> actualNodeNames =
getActualNodeNames(multiNodeRequest.nodeNames());
+
+ CompletableFuture<?>[] remoteProcessingFutures = actualNodeNames
+ .stream()
+ .map(nodeName -> addMultiNodeOperation(nodeName, operationId))
+ .toArray(CompletableFuture[]::new);
+
+ return allOf(remoteProcessingFutures)
+ .whenComplete((ignored, e) -> {
+ for (String nodeName : actualNodeNames) {
+ operationsByNodeName.compute(nodeName, (node,
operations) -> {
+ if (operations != null) {
+ operations.remove(operationId);
+
+ return operations.isEmpty() ? null :
operations;
+ }
+
+ return null;
+ });
+ }
+ });
+ }
+
+ /** If request node names is empty, returns all nodes in the logical
topology. */
+ private Collection<String> getActualNodeNames(Set<String>
requestNodeNames) {
+ if (requestNodeNames.isEmpty()) {
+ return dzManager.logicalTopology().stream()
+ .map(NodeWithAttributes::nodeName)
+ .collect(toSet());
+ } else {
+ return requestNodeNames;
+ }
+ }
+
+ private CompletableFuture<Void> addMultiNodeOperation(String nodeName,
UUID operationId) {
+ CompletableFuture<Void> result = new
CompletableFuture<Void>().orTimeout(TIMEOUT_SECONDS, TimeUnit.SECONDS);
+
+ operationsByNodeName.compute(nodeName, (node, operations) -> {
Review Comment:
Fixed
--
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: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]