From 05b76269969f8bd5db65a1a352713ed9a51a132a Mon Sep 17 00:00:00 2001 From: Nikita Amelchev Date: Thu, 5 Feb 2026 18:05:07 +0300 Subject: [PATCH 1/8] IGNITE-27759 Remove redundant serialization of SnapshotHandlerResult#node --- .../snapshot/DataStreamerUpdatesHandler.java | 6 ++-- .../snapshot/IgniteSnapshotManager.java | 29 ++++++++++--------- .../snapshot/SnapshotCheckProcess.java | 13 +++++---- .../persistence/snapshot/SnapshotHandler.java | 18 +++++++----- .../snapshot/SnapshotHandlerResult.java | 13 +-------- .../SnapshotPartitionsQuickVerifyHandler.java | 10 +++---- .../SnapshotPartitionsVerifyHandler.java | 14 ++++++--- .../IgniteClusterSnapshotHandlerTest.java | 14 ++++----- 8 files changed, 59 insertions(+), 58 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/DataStreamerUpdatesHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/DataStreamerUpdatesHandler.java index ee608565ef045..8c2b913c418a6 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/DataStreamerUpdatesHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/DataStreamerUpdatesHandler.java @@ -18,9 +18,9 @@ package org.apache.ignite.internal.processors.cache.persistence.snapshot; import java.util.Collection; +import java.util.Map; import java.util.UUID; import java.util.stream.Collectors; - import org.apache.ignite.internal.util.typedef.F; import static org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotHandlerType.CREATE; @@ -47,9 +47,9 @@ public class DataStreamerUpdatesHandler implements SnapshotHandler { } /** {@inheritDoc} */ - @Override public void complete(String name, Collection> results) + @Override public void complete(String name, Map> results) throws SnapshotWarningException { - Collection nodes = F.viewReadOnly(results, r -> r.node().id(), SnapshotHandlerResult::data); + Collection nodes = F.viewReadOnly(results.entrySet(), Map.Entry::getKey, e -> Boolean.TRUE.equals(e.getValue().data())); if (!F.isEmpty(nodes)) { throw new SnapshotWarningException(WRN_MSG + " Updates from DataStreamer detected on the nodes: " + diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java index 2a24ffcca9690..427b752f37d17 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java @@ -1152,7 +1152,7 @@ else if (!F.isEmpty(err)) { "Uncompleted snapshot will be deleted [err=" + err + ']')); } - completeHandlersAsyncIfNeeded(snpOp, res.values()) + completeHandlersAsyncIfNeeded(snpOp, res) .listen(f -> { if (f.error() != null) snpOp.error(f.error()); @@ -1202,22 +1202,23 @@ public void storeSnapshotMeta(M meta, File smf) { */ private IgniteInternalFuture completeHandlersAsyncIfNeeded( SnapshotOperation snpOp, - Collection res + Map res ) { if (snpOp.error() != null) return new GridFinishedFuture<>(); SnapshotOperationRequest req = snpOp.request(); - Map>> clusterHndResults = new HashMap<>(); + Map>> clusterHndResults = new HashMap<>(); - for (SnapshotOperationResponse snpRes : res) { - if (snpRes == null || snpRes.handlerResults() == null) - continue; + res.forEach((nodeId, r) -> { + if (r.handlerResults() == null) + return; - for (Map.Entry> entry : snpRes.handlerResults().entrySet()) - clusterHndResults.computeIfAbsent(entry.getKey(), v -> new ArrayList<>()).add(entry.getValue()); - } + r.handlerResults().forEach((hndName, hndRes) -> + clusterHndResults.computeIfAbsent(hndName, v -> new HashMap<>()) + .put(nodeId, hndRes)); + }); if (clusterHndResults.isEmpty()) return new GridFinishedFuture<>(); @@ -2944,7 +2945,7 @@ private void initialize(GridKernalContext ctx, ExecutorService execSvc) { protected void completeAll( SnapshotHandlerType type, String snpName, - Map>> res, + Map>> res, Collection reqNodes, Consumer> wrnsHnd ) throws Exception { @@ -2963,13 +2964,13 @@ protected void completeAll( List wrns = new ArrayList<>(); for (SnapshotHandler hnd : hnds) { - List> nodesRes = res.get(hnd.getClass().getName()); + Map> nodesRes = res.get(hnd.getClass().getName()); if (nodesRes == null || nodesRes.size() < reqNodes.size()) { Set missing = new HashSet<>(reqNodes); if (nodesRes != null) - missing.removeAll(F.viewReadOnly(nodesRes, r -> r.node().id())); + missing.removeAll(nodesRes.keySet()); throw new IgniteCheckedException("Snapshot handlers configuration mismatch, " + "\"" + hnd.getClass().getName() + "\" handler is missing on the remote node(s). " + @@ -2996,12 +2997,12 @@ protected void completeAll( */ private SnapshotHandlerResult invoke(SnapshotHandler hnd, SnapshotHandlerContext ctx) { try { - return new SnapshotHandlerResult<>(hnd.invoke(ctx), null, ctx.localNode()); + return new SnapshotHandlerResult<>(hnd.invoke(ctx), null); } catch (Exception e) { U.error(null, "Error invoking snapshot handler", e); - return new SnapshotHandlerResult<>(null, e, ctx.localNode()); + return new SnapshotHandlerResult<>(null, e); } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java index f62fc22ff8225..461af0c50ae7b 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java @@ -207,7 +207,7 @@ private void reduceCustomHandlersResults( throw F.firstValue(errors); // Check responses: checking node -> snapshot part's consistent id -> handler name -> handler result. - Map>>> reduced = new HashMap<>(results.size(), 1.0f); + Map>>> reduced = new HashMap<>(results.size(), 1.0f); for (Map.Entry respEntry : results.entrySet()) { SnapshotCheckResponse nodeResp = respEntry.getValue(); @@ -225,22 +225,22 @@ private void reduceCustomHandlersResults( cstHndRes.forEach((consId, respPerConsIdMap) -> { // Reduced map of the handlers results per snapshot part's consistent id for certain node. Map>> nodePerConsIdResultMap - = reduced.computeIfAbsent(kctx.cluster().get().node(nodeId), n -> new HashMap<>()); + = reduced.computeIfAbsent(nodeId, n -> new HashMap<>()); respPerConsIdMap.forEach((hndId, hndRes) -> nodePerConsIdResultMap.computeIfAbsent(consId, cstId -> new HashMap<>()).put(hndId, hndRes)); }); } - Map>> clusterResults = new HashMap<>(); + Map>> clusterResults = new HashMap<>(); Collection execNodes = new ArrayList<>(reduced.size()); // Checking node -> Map by consistend id. - for (Map.Entry>>> nodeRes : reduced.entrySet()) { + for (Map.Entry>>> nodeRes : reduced.entrySet()) { // Consistent id -> Map by handler name. for (Map.Entry>> res : nodeRes.getValue().entrySet()) { // Depending on the job mapping, we can get several different results from one node. - execNodes.add(nodeRes.getKey().id()); + execNodes.add(nodeRes.getKey()); Map> nodeDataMap = res.getValue(); @@ -249,7 +249,8 @@ private void reduceCustomHandlersResults( for (Map.Entry> entry : nodeDataMap.entrySet()) { String hndName = entry.getKey(); - clusterResults.computeIfAbsent(hndName, v -> new ArrayList<>()).add(entry.getValue()); + clusterResults.computeIfAbsent(hndName, v -> new HashMap<>()) + .put(nodeRes.getKey(), entry.getValue()); } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandler.java index abd97834c3c66..885a4170b4c87 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandler.java @@ -18,6 +18,8 @@ package org.apache.ignite.internal.processors.cache.persistence.snapshot; import java.util.Collection; +import java.util.Map; +import java.util.UUID; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.plugin.Extension; import org.jetbrains.annotations.Nullable; @@ -45,9 +47,9 @@ public interface SnapshotHandler extends Extension { * * @param ctx Snapshot handler context. * @return Result of local processing. This result will be returned in {@link SnapshotHandlerResult#data()} method - * passed into {@link #complete(String, Collection)} handler method. + * passed into {@link #complete(String, Map)} handler method. * @throws Exception If invocation caused an exception. This exception will be returned in {@link - * SnapshotHandlerResult#error()}} method passed into {@link #complete(String, Collection)} handler method. + * SnapshotHandlerResult#error()}} method passed into {@link #complete(String, Map)} handler method. */ public @Nullable T invoke(SnapshotHandlerContext ctx) throws Exception; @@ -65,16 +67,18 @@ public interface SnapshotHandler extends Extension { * @throws Exception If the snapshot operation needs to be aborted. * @see SnapshotHandlerResult */ - public default void complete(String name, Collection> results) + public default void complete(String name, Map> results) throws SnapshotWarningException, Exception { - for (SnapshotHandlerResult res : results) { - if (res.error() == null) + for (Map.Entry> e : results.entrySet()) { + SnapshotHandlerResult hndRes = e.getValue(); + + if (hndRes.error() == null) continue; - throw new IgniteCheckedException("Snapshot handler has failed. " + res.error().getMessage() + + throw new IgniteCheckedException("Snapshot handler has failed. " + hndRes.error().getMessage() + " [snapshot=" + name + ", handler=" + getClass().getName() + - ", nodeId=" + res.node().id() + "].", res.error()); + ", nodeId=" + e.getKey() + "].", hndRes.error()); } } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandlerResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandlerResult.java index b9243287ee947..06d38877aa541 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandlerResult.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandlerResult.java @@ -18,7 +18,6 @@ package org.apache.ignite.internal.processors.cache.persistence.snapshot; import java.io.Serializable; -import org.apache.ignite.cluster.ClusterNode; import org.jetbrains.annotations.Nullable; /** @@ -37,18 +36,13 @@ public class SnapshotHandlerResult implements Serializable { /** Processing error. */ private final Exception err; - /** Processing node. */ - private final ClusterNode node; - /** * @param data Result of local processing. * @param err Processing error. - * @param node Processing node. */ - public SnapshotHandlerResult(@Nullable T data, @Nullable Exception err, ClusterNode node) { + public SnapshotHandlerResult(@Nullable T data, @Nullable Exception err) { this.data = data; this.err = err; - this.node = node; } /** @return Result of local processing. */ @@ -60,9 +54,4 @@ public SnapshotHandlerResult(@Nullable T data, @Nullable Exception err, ClusterN public @Nullable Exception error() { return err; } - - /** @return Processing node. */ - public ClusterNode node() { - return node; - } } diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsQuickVerifyHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsQuickVerifyHandler.java index 84f8b90311f5c..2a276afec2669 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsQuickVerifyHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsQuickVerifyHandler.java @@ -17,12 +17,12 @@ package org.apache.ignite.internal.processors.cache.persistence.snapshot; -import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Objects; import java.util.Set; +import java.util.UUID; import org.apache.ignite.IgniteCheckedException; import org.apache.ignite.internal.management.cache.PartitionKey; import org.apache.ignite.internal.processors.cache.GridCacheSharedContext; @@ -69,21 +69,21 @@ public SnapshotPartitionsQuickVerifyHandler(GridCacheSharedContext cctx) { /** {@inheritDoc} */ @Override public void complete( String name, - Collection>> results + Map>> results ) throws IgniteCheckedException { - Exception err = results.stream().map(SnapshotHandlerResult::error).filter(Objects::nonNull).findAny().orElse(null); + Exception err = results.values().stream().map(SnapshotHandlerResult::error).filter(Objects::nonNull).findAny().orElse(null); if (err != null) throw U.cast(err); // Null means that the streamer was already detected (See #invoke). - if (results.stream().anyMatch(res -> res.data() == null)) + if (results.values().stream().anyMatch(res -> res.data() == null)) return; Set wrnGrps = new HashSet<>(); Map total = new HashMap<>(); - for (SnapshotHandlerResult> result : results) { + for (SnapshotHandlerResult> result : results.values()) { result.data().forEach((part, val) -> { PartitionHashRecord other = total.putIfAbsent(part, val); diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsVerifyHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsVerifyHandler.java index c12f86e15efd7..911c82c76f52e 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsVerifyHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsVerifyHandler.java @@ -29,6 +29,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; import java.util.function.Function; import java.util.stream.Collectors; @@ -439,13 +440,18 @@ private PartitionHashRecord calculateDumpedPartitionHash(Dump dump, String folde } /** {@inheritDoc} */ - @Override public void complete(String name, - Collection>> results) throws IgniteCheckedException { + @Override public void complete( + String name, + Map>> results + ) throws IgniteCheckedException { IdleVerifyResult.Builder bldr = IdleVerifyResult.builder(); - for (SnapshotHandlerResult> res : results) { + for (Map.Entry>> e : results.entrySet()) { + UUID nodeId = e.getKey(); + SnapshotHandlerResult> res = e.getValue(); + if (res.error() != null) { - bldr.addException(res.node(), res.error()); + bldr.addException(cctx.discovery().node(nodeId), res.error()); continue; } diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotHandlerTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotHandlerTest.java index 243a86e784b9d..167c267f79093 100644 --- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotHandlerTest.java +++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteClusterSnapshotHandlerTest.java @@ -22,8 +22,8 @@ import java.io.FileOutputStream; import java.io.OutputStream; import java.util.ArrayList; -import java.util.Collection; import java.util.List; +import java.util.Map; import java.util.UUID; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; @@ -100,8 +100,8 @@ public void testClusterSnapshotHandlers() throws Exception { } @Override public void complete(String name, - Collection> results) throws IgniteCheckedException { - for (SnapshotHandlerResult res : results) { + Map> results) throws IgniteCheckedException { + for (SnapshotHandlerResult res : results.values()) { if (!reqIdRef.compareAndSet(null, res.data()) && !reqIdRef.get().equals(res.data())) throw new IgniteCheckedException("The request ID must be the same on all nodes."); } @@ -118,8 +118,8 @@ public void testClusterSnapshotHandlers() throws Exception { } @Override public void complete(String name, - Collection> results) throws IgniteCheckedException { - for (SnapshotHandlerResult res : results) { + Map> results) throws IgniteCheckedException { + for (SnapshotHandlerResult res : results.values()) { if (!reqIdRef.get().equals(res.data())) throw new IgniteCheckedException(expMsg); } @@ -305,7 +305,7 @@ public void testClusterSnapshotHandlerConfigurationMismatch() throws Exception { /** * Test ensures that the snapshot creation is aborted if node exits while the {@link - * SnapshotHandler#complete(String, Collection)} method is executed. + * SnapshotHandler#complete(String, Map)} method is executed. * * @throws Exception If fails. */ @@ -322,7 +322,7 @@ public void testCrdChangeDuringHandlerCompleteOnSnapshotCreate() throws Exceptio return null; } - @Override public void complete(String name, Collection> results) + @Override public void complete(String name, Map> results) throws Exception { if (latch.getCount() == 1) { latch.countDown(); From 277153bffc28f0b1963c7985df031ebccb3c5def Mon Sep 17 00:00:00 2001 From: NSAmelchev Date: Thu, 5 Feb 2026 23:33:04 +0300 Subject: [PATCH 2/8] IGNITE-27759 Remove redundant serialization of SnapshotHandlerResult#node --- .../cache/persistence/snapshot/IgniteSnapshotManager.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java index 427b752f37d17..4ffa1aa771bf0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java @@ -1212,7 +1212,7 @@ private IgniteInternalFuture completeHandlersAsyncIfNeeded( Map>> clusterHndResults = new HashMap<>(); res.forEach((nodeId, r) -> { - if (r.handlerResults() == null) + if (r == null || r.handlerResults() == null) return; r.handlerResults().forEach((hndName, hndRes) -> From a311c8f4bb88eae85bdb644ef2c23f3b8bc5703e Mon Sep 17 00:00:00 2001 From: NSAmelchev Date: Thu, 5 Feb 2026 23:34:15 +0300 Subject: [PATCH 3/8] IGNITE-27759 Remove redundant serialization of SnapshotHandlerResult#node --- .../persistence/snapshot/DataStreamerUpdatesHandler.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/DataStreamerUpdatesHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/DataStreamerUpdatesHandler.java index 8c2b913c418a6..8bbb9ff642d81 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/DataStreamerUpdatesHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/DataStreamerUpdatesHandler.java @@ -19,10 +19,12 @@ import java.util.Collection; import java.util.Map; +import java.util.Map.Entry; import java.util.UUID; import java.util.stream.Collectors; import org.apache.ignite.internal.util.typedef.F; +import static java.lang.Boolean.TRUE; import static org.apache.ignite.internal.processors.cache.persistence.snapshot.SnapshotHandlerType.CREATE; /** @@ -49,7 +51,7 @@ public class DataStreamerUpdatesHandler implements SnapshotHandler { /** {@inheritDoc} */ @Override public void complete(String name, Map> results) throws SnapshotWarningException { - Collection nodes = F.viewReadOnly(results.entrySet(), Map.Entry::getKey, e -> Boolean.TRUE.equals(e.getValue().data())); + Collection nodes = F.viewReadOnly(results.entrySet(), Entry::getKey, e -> TRUE.equals(e.getValue().data())); if (!F.isEmpty(nodes)) { throw new SnapshotWarningException(WRN_MSG + " Updates from DataStreamer detected on the nodes: " + From c71d48c0418fa72e6056425c303eccf7a66120ab Mon Sep 17 00:00:00 2001 From: Nikita Amelchev Date: Fri, 6 Feb 2026 09:36:14 +0300 Subject: [PATCH 4/8] IGNITE-27759 Remove redundant serialization of SnapshotHandlerResult#node --- .../cache/persistence/snapshot/SnapshotCheckProcess.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java index 461af0c50ae7b..5f799d995ae15 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java @@ -233,15 +233,11 @@ private void reduceCustomHandlersResults( } Map>> clusterResults = new HashMap<>(); - Collection execNodes = new ArrayList<>(reduced.size()); // Checking node -> Map by consistend id. for (Map.Entry>>> nodeRes : reduced.entrySet()) { // Consistent id -> Map by handler name. for (Map.Entry>> res : nodeRes.getValue().entrySet()) { - // Depending on the job mapping, we can get several different results from one node. - execNodes.add(nodeRes.getKey()); - Map> nodeDataMap = res.getValue(); assert nodeDataMap != null : "At least the default snapshot restore handler should have been executed "; @@ -256,7 +252,7 @@ private void reduceCustomHandlersResults( } kctx.cache().context().snapshotMgr().handlers().completeAll( - SnapshotHandlerType.RESTORE, ctx.req.snapshotName(), clusterResults, execNodes, wrns -> {}); + SnapshotHandlerType.RESTORE, ctx.req.snapshotName(), clusterResults, ctx.req.nodes(), wrns -> {}); fut.onDone(new SnapshotPartitionsVerifyResult(ctx.clusterMetas, null)); } From 8cbf0896b6f7777b89bf75c862a3876c8625417c Mon Sep 17 00:00:00 2001 From: Nikita Amelchev Date: Fri, 6 Feb 2026 10:54:15 +0300 Subject: [PATCH 5/8] IGNITE-27759 Remove redundant serialization of SnapshotHandlerResult#node --- .../cache/persistence/snapshot/SnapshotCheckProcess.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java index 5f799d995ae15..29bd175cb9ca9 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotCheckProcess.java @@ -252,7 +252,7 @@ private void reduceCustomHandlersResults( } kctx.cache().context().snapshotMgr().handlers().completeAll( - SnapshotHandlerType.RESTORE, ctx.req.snapshotName(), clusterResults, ctx.req.nodes(), wrns -> {}); + SnapshotHandlerType.RESTORE, ctx.req.snapshotName(), clusterResults, reduced.keySet(), wrns -> {}); fut.onDone(new SnapshotPartitionsVerifyResult(ctx.clusterMetas, null)); } From 6858fc20b3209d97823d9dd5529f827070da1963 Mon Sep 17 00:00:00 2001 From: Nikita Amelchev Date: Mon, 9 Feb 2026 16:15:17 +0300 Subject: [PATCH 6/8] Fix javadoc --- .../cache/persistence/snapshot/SnapshotHandler.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandler.java index 885a4170b4c87..4147404de6adf 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotHandler.java @@ -17,7 +17,6 @@ package org.apache.ignite.internal.processors.cache.persistence.snapshot; -import java.util.Collection; import java.util.Map; import java.util.UUID; import org.apache.ignite.IgniteCheckedException; @@ -30,11 +29,11 @@ * The execution of the handler consists of two steps: *
    *
  1. Local call of {@link #invoke(SnapshotHandlerContext)} method on all nodes containing the snapshot data.
  2. - *
  3. Processing the results of local invocations in the {@link #complete(String, Collection)} method on one of the + *
  4. Processing the results of local invocations in the {@link #complete(String, Map)} method on one of the * nodes containing the snapshot data.
  5. *
* Note: If during the execution of a snapshot operation some node exits, then whole operation is rolled back, in which - * case the {@link #complete(String, Collection)} method may not be called. + * case the {@link #complete(String, Map)} method may not be called. * * @param Type of the local processing result. */ From 36ea9c20cf7a2a0b2f61f1298f92e0a6823b2ebf Mon Sep 17 00:00:00 2001 From: Nikita Amelchev Date: Tue, 10 Feb 2026 12:58:33 +0300 Subject: [PATCH 7/8] review fixes --- .../cache/persistence/snapshot/IgniteSnapshotManager.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java index 4ffa1aa771bf0..d18aa26634376 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/IgniteSnapshotManager.java @@ -1194,7 +1194,7 @@ public void storeSnapshotMeta(M meta, File smf) { } /** - * Execute the {@link SnapshotHandler#complete(String, Collection)} method of the snapshot handlers asynchronously. + * Execute the {@link SnapshotHandler#complete(String, Map)} method of the snapshot handlers asynchronously. * * @param snpOp Snapshot creation operation. * @param res Results. @@ -1211,11 +1211,11 @@ private IgniteInternalFuture completeHandlersAsyncIfNeeded( Map>> clusterHndResults = new HashMap<>(); - res.forEach((nodeId, r) -> { - if (r == null || r.handlerResults() == null) + res.forEach((nodeId, snpRes) -> { + if (snpRes == null || snpRes.handlerResults() == null) return; - r.handlerResults().forEach((hndName, hndRes) -> + snpRes.handlerResults().forEach((hndName, hndRes) -> clusterHndResults.computeIfAbsent(hndName, v -> new HashMap<>()) .put(nodeId, hndRes)); }); From f08e763d82a2c6d9e56ae3a346794bc0d01638ac Mon Sep 17 00:00:00 2001 From: Nikita Amelchev Date: Tue, 10 Feb 2026 13:05:18 +0300 Subject: [PATCH 8/8] review fixes --- .../persistence/snapshot/SnapshotPartitionsVerifyHandler.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsVerifyHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsVerifyHandler.java index 911c82c76f52e..8619b53fc02f0 100644 --- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsVerifyHandler.java +++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/snapshot/SnapshotPartitionsVerifyHandler.java @@ -451,7 +451,7 @@ private PartitionHashRecord calculateDumpedPartitionHash(Dump dump, String folde SnapshotHandlerResult> res = e.getValue(); if (res.error() != null) { - bldr.addException(cctx.discovery().node(nodeId), res.error()); + bldr.addException(cctx.discovery().historicalNode(nodeId), res.error()); continue; }