This is an automated email from the ASF dual-hosted git repository.

anton-vinogradov pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ignite.git


The following commit(s) were added to refs/heads/master by this push:
     new d616dca928d IGNITE-28550 Get rid of external error serialization in 
ServiceSingleNodeDeploymentResult (#13041)
d616dca928d is described below

commit d616dca928dc5cc580a914c7783ba3dd5225b46b
Author: Dmitry Werner <[email protected]>
AuthorDate: Fri Apr 17 21:01:34 2026 +0500

    IGNITE-28550 Get rid of external error serialization in 
ServiceSingleNodeDeploymentResult (#13041)
---
 .../ignite/internal/CoreMessagesProvider.java      |  2 +-
 .../processors/service/IgniteServiceProcessor.java |  4 +-
 .../service/ServiceDeploymentActions.java          |  9 +--
 .../processors/service/ServiceDeploymentTask.java  | 79 ++++----------------
 .../service/ServiceSingleNodeDeploymentResult.java | 83 +++++++++++++++++++---
 5 files changed, 92 insertions(+), 85 deletions(-)

diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
index 692df7e840d..6de2f7f3e1c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/CoreMessagesProvider.java
@@ -390,7 +390,7 @@ public class CoreMessagesProvider implements 
MessageFactoryProvider {
         // [6300 - 6400]: Services messages. Most of them originally come from 
Discovery.
         msgIdx = 6300;
         withNoSchema(ServiceDeploymentProcessId.class);
-        withNoSchema(ServiceSingleNodeDeploymentResult.class);
+        withSchema(ServiceSingleNodeDeploymentResult.class);
         withNoSchema(ServiceClusterDeploymentResult.class);
         withNoSchema(ServiceDeploymentRequest.class);
         withNoSchema(ServiceUndeploymentRequest.class);
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/IgniteServiceProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/IgniteServiceProcessor.java
index 4cf6bd74c26..1c470a8cae2 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/IgniteServiceProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/IgniteServiceProcessor.java
@@ -1944,14 +1944,14 @@ public class IgniteServiceProcessor extends 
GridProcessorAdapter implements Igni
      */
     private void 
processServicesFullDeployments(ServiceClusterDeploymentResultBatch msg) {
         final Map<IgniteUuid, Map<UUID, Integer>> fullTops = new HashMap<>();
-        final Map<IgniteUuid, Collection<byte[]>> fullErrors = new HashMap<>();
+        final Map<IgniteUuid, Collection<Throwable>> fullErrors = new 
HashMap<>();
 
         for (ServiceClusterDeploymentResult depRes : msg.results()) {
             final IgniteUuid srvcId = depRes.serviceId();
             final Map<UUID, ServiceSingleNodeDeploymentResult> deps = 
depRes.results();
 
             final Map<UUID, Integer> top = new HashMap<>();
-            final Collection<byte[]> errors = new ArrayList<>();
+            final Collection<Throwable> errors = new ArrayList<>();
 
             deps.forEach((nodeId, res) -> {
                 int cnt = res.count();
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceDeploymentActions.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceDeploymentActions.java
index 64ef4c09d3b..e42e3a1a6e2 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceDeploymentActions.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceDeploymentActions.java
@@ -24,6 +24,7 @@ import java.util.Map;
 import java.util.UUID;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.processors.platform.utils.PlatformUtils;
+import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.services.ServiceConfiguration;
 import org.jetbrains.annotations.NotNull;
@@ -45,7 +46,7 @@ public class ServiceDeploymentActions {
     private Map<IgniteUuid, Map<UUID, Integer>> depTops;
 
     /** Services deployment errors. */
-    private Map<IgniteUuid, Collection<byte[]>> depErrors;
+    private Map<IgniteUuid, Collection<Throwable>> depErrors;
 
     /** Current platform */
     private final String platform;
@@ -131,14 +132,14 @@ public class ServiceDeploymentActions {
     /**
      * @return Deployment errors.
      */
-    @NotNull public Map<IgniteUuid, Collection<byte[]>> deploymentErrors() {
-        return depErrors != null ? depErrors : Collections.emptyMap();
+    @NotNull public Map<IgniteUuid, Collection<Throwable>> deploymentErrors() {
+        return F.emptyIfNull(depErrors);
     }
 
     /**
      * @param depErrors Deployment errors.
      */
-    public void deploymentErrors(@NotNull Map<IgniteUuid, Collection<byte[]>> 
depErrors) {
+    public void deploymentErrors(@NotNull Map<IgniteUuid, 
Collection<Throwable>> depErrors) {
         this.depErrors = Collections.unmodifiableMap(new HashMap<>(depErrors));
     }
 }
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceDeploymentTask.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceDeploymentTask.java
index db1c5c9033e..ede3217390b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceDeploymentTask.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceDeploymentTask.java
@@ -42,7 +42,6 @@ import 
org.apache.ignite.internal.util.tostring.GridToStringExclude;
 import org.apache.ignite.internal.util.tostring.GridToStringInclude;
 import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.services.ServiceConfiguration;
 import org.jetbrains.annotations.NotNull;
@@ -385,9 +384,9 @@ class ServiceDeploymentTask {
 
             for (IgniteUuid srvcId : depServicesIds) {
                 ServiceSingleNodeDeploymentResult depRes = new 
ServiceSingleNodeDeploymentResult(
-                    srvcProc.localInstancesCount(srvcId));
+                    srvcProc.localInstancesCount(srvcId), log);
 
-                attachDeploymentErrors(depRes, errors.get(srvcId));
+                depRes.errors(errors.get(srvcId));
 
                 results.put(srvcId, depRes);
             }
@@ -397,9 +396,9 @@ class ServiceDeploymentTask {
                     return;
 
                 ServiceSingleNodeDeploymentResult depRes = new 
ServiceSingleNodeDeploymentResult(
-                    srvcProc.localInstancesCount(srvcId));
+                    srvcProc.localInstancesCount(srvcId), log);
 
-                attachDeploymentErrors(depRes, err);
+                depRes.errors(err);
 
                 results.put(srvcId, depRes);
             });
@@ -464,7 +463,7 @@ class ServiceDeploymentTask {
                     assert depResults != null : "Services deployment actions 
should be attached.";
 
                     final Map<IgniteUuid, Map<UUID, Integer>> fullTops = 
depResults.deploymentTopologies();
-                    final Map<IgniteUuid, Collection<byte[]>> fullErrors = 
depResults.deploymentErrors();
+                    final Map<IgniteUuid, Collection<Throwable>> fullErrors = 
depResults.deploymentErrors();
 
                     depActions.deploymentTopologies(fullTops);
                     depActions.deploymentErrors(fullErrors);
@@ -520,7 +519,7 @@ class ServiceDeploymentTask {
                 return;
             }
 
-            Collection<byte[]> errors = 
depActions.deploymentErrors().get(srvcId);
+            Collection<Throwable> errors = 
depActions.deploymentErrors().get(srvcId);
 
             if (errors == null) {
                 srvcProc.completeInitiatingFuture(true, srvcId, null);
@@ -530,27 +529,11 @@ class ServiceDeploymentTask {
 
             Throwable depErr = null;
 
-            for (byte[] error : errors) {
-                try {
-                    Throwable t = U.unmarshal(ctx, error, null);
-
-                    if (depErr == null)
-                        depErr = t;
-                    else
-                        depErr.addSuppressed(t);
-                }
-                catch (IgniteCheckedException e) {
-                    log.error("Failed to unmarshal deployment error.", e);
-
-                    Exception ex = new IgniteCheckedException(
-                        "Failed to unmarshal deployment error, see server logs 
for details."
-                    );
-
-                    if (depErr == null)
-                        depErr = ex;
-                    else
-                        depErr.addSuppressed(ex);
-                }
+            for (Throwable error : errors) {
+                if (depErr == null)
+                    depErr = error;
+                else
+                    depErr.addSuppressed(error);
             }
 
             srvcProc.completeInitiatingFuture(true, srvcId, depErr);
@@ -656,7 +639,7 @@ class ServiceDeploymentTask {
             if (cnt == 0 && res.errors().isEmpty())
                 return;
 
-            ServiceSingleNodeDeploymentResult singleDepRes = new 
ServiceSingleNodeDeploymentResult(cnt);
+            ServiceSingleNodeDeploymentResult singleDepRes = new 
ServiceSingleNodeDeploymentResult(cnt, log);
 
             if (!res.errors().isEmpty())
                 singleDepRes.errors(res.errors());
@@ -675,44 +658,6 @@ class ServiceDeploymentTask {
         return fullResults;
     }
 
-    /**
-     * @param depRes Service single deployments results.
-     * @param errors Deployment errors.
-     */
-    private void attachDeploymentErrors(@NotNull 
ServiceSingleNodeDeploymentResult depRes,
-        @Nullable Collection<Throwable> errors) {
-        if (F.isEmpty(errors))
-            return;
-
-        Collection<byte[]> errorsBytes = new ArrayList<>();
-
-        for (Throwable th : errors) {
-            try {
-                byte[] arr = U.marshal(ctx, th);
-
-                errorsBytes.add(arr);
-            }
-            catch (IgniteCheckedException e) {
-                log.error("Failed to marshal deployment error, err=" + th, e);
-
-                try {
-                    Exception ex = new IgniteCheckedException(
-                        "Failed to marshal deployment error, see server logs 
for details, err=" + th
-                    );
-
-                    byte[] arr = U.marshal(ctx, ex);
-
-                    errorsBytes.add(arr);
-                }
-                catch (IgniteCheckedException ex) {
-                    log.error("Failed to attach deployment error information 
to deployment result message", ex);
-                }
-            }
-        }
-
-        depRes.errors(errorsBytes);
-    }
-
     /**
      * Handles a node leaves topology.
      *
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceSingleNodeDeploymentResult.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceSingleNodeDeploymentResult.java
index 819aec36399..8fc1530529c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceSingleNodeDeploymentResult.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/ServiceSingleNodeDeploymentResult.java
@@ -18,19 +18,25 @@
 package org.apache.ignite.internal.processors.service;
 
 import java.io.Serializable;
+import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
+import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.internal.MarshallableMessage;
 import org.apache.ignite.internal.Order;
+import org.apache.ignite.internal.util.typedef.F;
 import org.apache.ignite.internal.util.typedef.internal.S;
-import org.apache.ignite.plugin.extensions.communication.Message;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.marshaller.Marshaller;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 /**
  * Service single node deployment result.
  * <p/>
  * Contains count of deployed service instances on single node and deployment 
errors if exist.
  */
-public class ServiceSingleNodeDeploymentResult implements Message, 
Serializable {
+public class ServiceSingleNodeDeploymentResult implements MarshallableMessage, 
Serializable {
     /** */
     private static final long serialVersionUID = 0L;
 
@@ -38,9 +44,15 @@ public class ServiceSingleNodeDeploymentResult implements 
Message, Serializable
     @Order(0)
     int cnt;
 
-    /** Serialized exceptions. */
+    /** Exceptions. */
+    private @Nullable Collection<Throwable> errors;
+
+    /** Serialized {@link #errors}. */
     @Order(1)
-    Collection<byte[]> errors;
+    @Nullable Collection<byte[]> errorsBytes;
+
+    /** Logger. */
+    private IgniteLogger log;
 
     /**
      * Empty constructor for marshalling purposes.
@@ -50,9 +62,11 @@ public class ServiceSingleNodeDeploymentResult implements 
Message, Serializable
 
     /**
      * @param cnt Count of service's instances.
+     * @param log Logger.
      */
-    public ServiceSingleNodeDeploymentResult(int cnt) {
+    public ServiceSingleNodeDeploymentResult(int cnt, IgniteLogger log) {
         this.cnt = cnt;
+        this.log = log;
     }
 
     /**
@@ -63,19 +77,66 @@ public class ServiceSingleNodeDeploymentResult implements 
Message, Serializable
     }
 
     /**
-     * @return Serialized exceptions.
+     * @return Exceptions.
      */
-    @NotNull public Collection<byte[]> errors() {
-        return errors != null ? errors : Collections.emptyList();
+    public @NotNull Collection<Throwable> errors() {
+        return F.emptyIfNull(errors);
     }
 
     /**
-     * @param errors Serialized exceptions.
+     * @param errors Exceptions.
      */
-    public void errors(Collection<byte[]> errors) {
+    public void errors(@Nullable Collection<Throwable> errors) {
         this.errors = errors;
     }
 
+    /** {@inheritDoc} */
+    @Override public void prepareMarshal(Marshaller marsh) throws 
IgniteCheckedException {
+        if (F.isEmpty(errors))
+            return;
+
+        errorsBytes = new ArrayList<>();
+
+        for (Throwable th : errors) {
+            try {
+                byte[] arr = U.marshal(marsh, th);
+
+                errorsBytes.add(arr);
+            }
+            catch (IgniteCheckedException e) {
+                log.error("Failed to marshal deployment error, err=" + th, e);
+
+                try {
+                    byte[] arr = U.marshal(
+                        marsh,
+                        new IgniteCheckedException("Failed to marshal 
deployment error, see server logs for details, err=" + th)
+                    );
+
+                    errorsBytes.add(arr);
+                }
+                catch (IgniteCheckedException ex) {
+                    log.error("Failed to attach deployment error information 
to deployment result message", ex);
+                }
+            }
+        }
+    }
+
+    /** {@inheritDoc} */
+    @Override public void finishUnmarshal(Marshaller marsh, ClassLoader 
clsLdr) throws IgniteCheckedException {
+        try {
+            if (errorsBytes != null && errors == null) {
+                errors = new ArrayList<>();
+
+                for (byte[] arr : errorsBytes)
+                    errors.add(U.unmarshal(marsh, arr, clsLdr));
+            }
+        }
+        catch (IgniteCheckedException e) {
+            U.error(null, "Failed to unmarshal deployment result message", e);
+
+            errors.add(new IgniteCheckedException("Failed to unmarshal 
deployment error, see server logs for details."));
+        }
+    }
 
     /** {@inheritDoc} */
     @Override public String toString() {

Reply via email to