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() {