You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by pt...@apache.org on 2017/09/06 14:28:31 UTC
[15/23] ignite git commit: IGNITE-6271 .NET: Propagate
ServiceDeploymentException
IGNITE-6271 .NET: Propagate ServiceDeploymentException
This closes #2597
Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/56860d22
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/56860d22
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/56860d22
Branch: refs/heads/ignite-5896
Commit: 56860d22b4f74fce70aeead84e1ca59df38d3ef9
Parents: 0e63f59
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Wed Sep 6 13:27:25 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Wed Sep 6 13:27:25 2017 +0300
----------------------------------------------------------------------
.../services/PlatformAbstractService.java | 8 ++
.../platform/services/PlatformServices.java | 64 ++++++++---
.../platform/utils/PlatformUtils.java | 2 +-
.../Services/ServicesAsyncWrapper.cs | 9 +-
.../Services/ServicesTest.cs | 81 ++++++++++++--
.../Apache.Ignite.Core.csproj | 1 +
.../Apache.Ignite.Core/Impl/ExceptionUtils.cs | 6 +-
.../Impl/Services/ServiceProxySerializer.cs | 36 ++++++
.../Impl/Services/Services.cs | 30 ++++-
.../Impl/Unmanaged/UnmanagedCallbacks.cs | 37 ++++++-
.../Services/ServiceDeploymentException.cs | 111 +++++++++++++++++++
11 files changed, 348 insertions(+), 37 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ignite/blob/56860d22/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformAbstractService.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformAbstractService.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformAbstractService.java
index 4db01cf..55c8294 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformAbstractService.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformAbstractService.java
@@ -94,6 +94,14 @@ public abstract class PlatformAbstractService implements PlatformService, Extern
out.synchronize();
ptr = platformCtx.gateway().serviceInit(mem.pointer());
+
+ PlatformInputStream in = mem.input();
+
+ in.synchronize();
+
+ BinaryRawReaderEx reader = platformCtx.reader(in);
+
+ PlatformUtils.readInvocationResult(platformCtx, reader);
}
catch (IgniteCheckedException e) {
throw U.convertException(e);
http://git-wip-us.apache.org/repos/asf/ignite/blob/56860d22/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java
index 827bc5a..6f8d9e5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/services/PlatformServices.java
@@ -27,6 +27,7 @@ import org.apache.ignite.internal.processors.platform.PlatformContext;
import org.apache.ignite.internal.processors.platform.PlatformTarget;
import org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetService;
import org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetServiceImpl;
+import org.apache.ignite.internal.processors.platform.utils.PlatformFutureUtils;
import org.apache.ignite.internal.processors.platform.utils.PlatformUtils;
import org.apache.ignite.internal.processors.platform.utils.PlatformWriterBiClosure;
import org.apache.ignite.internal.processors.platform.utils.PlatformWriterClosure;
@@ -37,6 +38,7 @@ import org.apache.ignite.lang.IgnitePredicate;
import org.apache.ignite.services.Service;
import org.apache.ignite.services.ServiceConfiguration;
import org.apache.ignite.services.ServiceDescriptor;
+import org.jetbrains.annotations.NotNull;
import java.lang.reflect.Method;
import java.util.ArrayList;
@@ -45,7 +47,6 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
-import org.jetbrains.annotations.NotNull;
/**
* Interop services.
@@ -104,6 +105,9 @@ public class PlatformServices extends PlatformAbstractTarget {
private static final CopyOnWriteConcurrentMap<T3<Class, String, Integer>, Method> SVC_METHODS
= new CopyOnWriteConcurrentMap<>();
+ /** Future result writer. */
+ private static final PlatformFutureUtils.Writer RESULT_WRITER = new ServiceDeploymentResultWriter();
+
/** */
private final IgniteServices services;
@@ -144,26 +148,14 @@ public class PlatformServices extends PlatformAbstractTarget {
@Override public long processInStreamOutLong(int type, BinaryRawReaderEx reader)
throws IgniteCheckedException {
switch (type) {
- case OP_DOTNET_DEPLOY: {
- dotnetDeploy(reader, services);
-
- return TRUE;
- }
-
case OP_DOTNET_DEPLOY_ASYNC: {
- readAndListenFuture(reader, dotnetDeployAsync(reader, services));
-
- return TRUE;
- }
-
- case OP_DOTNET_DEPLOY_MULTIPLE: {
- dotnetDeployMultiple(reader);
+ readAndListenFuture(reader, dotnetDeployAsync(reader, services), RESULT_WRITER);
return TRUE;
}
case OP_DOTNET_DEPLOY_MULTIPLE_ASYNC: {
- readAndListenFuture(reader, dotnetDeployMultipleAsync(reader));
+ readAndListenFuture(reader, dotnetDeployMultipleAsync(reader), RESULT_WRITER);
return TRUE;
}
@@ -214,6 +206,32 @@ public class PlatformServices extends PlatformAbstractTarget {
return;
}
+ case OP_DOTNET_DEPLOY: {
+ try {
+ dotnetDeploy(reader, services);
+
+ PlatformUtils.writeInvocationResult(writer, null, null);
+ }
+ catch (Exception e) {
+ PlatformUtils.writeInvocationResult(writer, null, e);
+ }
+
+ return;
+ }
+
+ case OP_DOTNET_DEPLOY_MULTIPLE: {
+ try {
+ dotnetDeployMultiple(reader);
+
+ PlatformUtils.writeInvocationResult(writer, null, null);
+ }
+ catch (Exception e) {
+ PlatformUtils.writeInvocationResult(writer, null, e);
+ }
+
+ return;
+ }
+
default:
super.processInStreamOutStream(type, reader, writer);
}
@@ -621,4 +639,20 @@ public class PlatformServices extends PlatformAbstractTarget {
}
}
}
+
+ /**
+ * Writes an EventBase.
+ */
+ private static class ServiceDeploymentResultWriter implements PlatformFutureUtils.Writer {
+ /** <inheritDoc /> */
+ @Override public void write(BinaryRawWriterEx writer, Object obj, Throwable err) {
+ PlatformUtils.writeInvocationResult(writer, obj, err);
+ }
+
+ /** <inheritDoc /> */
+ @Override public boolean canWrite(Object obj, Throwable err) {
+ return true;
+ }
+ }
+
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/56860d22/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
index dbd65ed..2f7e782 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/utils/PlatformUtils.java
@@ -769,7 +769,7 @@ public class PlatformUtils {
* @param resObj Result.
* @param err Error.
*/
- public static void writeInvocationResult(BinaryRawWriterEx writer, Object resObj, Exception err)
+ public static void writeInvocationResult(BinaryRawWriterEx writer, Object resObj, Throwable err)
{
if (err == null) {
writer.writeBoolean(true);
http://git-wip-us.apache.org/repos/asf/ignite/blob/56860d22/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesAsyncWrapper.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesAsyncWrapper.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesAsyncWrapper.cs
index f0740e0..470804c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesAsyncWrapper.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesAsyncWrapper.cs
@@ -104,7 +104,14 @@ namespace Apache.Ignite.Core.Tests.Services
/** <inheritDoc /> */
public void Deploy(ServiceConfiguration configuration)
{
- _services.DeployAsync(configuration).Wait();
+ try
+ {
+ _services.DeployAsync(configuration).Wait();
+ }
+ catch (AggregateException ex)
+ {
+ throw ex.InnerException;
+ }
}
/** <inheritDoc /> */
http://git-wip-us.apache.org/repos/asf/ignite/blob/56860d22/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
index 33c44a6..ae36bcd 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
@@ -431,18 +431,71 @@ namespace Apache.Ignite.Core.Tests.Services
/// Tests exception in Initialize.
/// </summary>
[Test]
- public void TestInitException()
+ public void TestDeployMultipleException([Values(true, false)] bool keepBinary)
+ {
+ VerifyDeploymentException((services, svc) =>
+ services.DeployMultiple(SvcName, svc, Grids.Length, 1), keepBinary);
+ }
+
+ /// <summary>
+ /// Tests exception in Initialize.
+ /// </summary>
+ [Test]
+ public void TestDeployException([Values(true, false)] bool keepBinary)
+ {
+ VerifyDeploymentException((services, svc) =>
+ services.Deploy(new ServiceConfiguration
+ {
+ Name = SvcName,
+ Service = svc,
+ TotalCount = Grids.Length,
+ MaxPerNodeCount = 1
+ }), keepBinary);
+ }
+
+ /// <summary>
+ /// Verifies the deployment exception.
+ /// </summary>
+ private void VerifyDeploymentException(Action<IServices, IService> deploy, bool keepBinary)
{
var svc = new TestIgniteServiceSerializable { ThrowInit = true };
- var ex = Assert.Throws<IgniteException>(() => Services.DeployMultiple(SvcName, svc, Grids.Length, 1));
+ var services = Services;
+
+ if (keepBinary)
+ {
+ services = services.WithKeepBinary();
+ }
+
+ var deploymentException = Assert.Throws<ServiceDeploymentException>(() => deploy(services, svc));
+
+ var text = keepBinary
+ ? "Service deployment failed with a binary error. Examine BinaryCause for details."
+ : "Service deployment failed with an exception. Examine InnerException for details.";
+
+ Assert.AreEqual(text, deploymentException.Message);
+
+ Exception ex;
+
+ if (keepBinary)
+ {
+ Assert.IsNull(deploymentException.InnerException);
+
+ ex = deploymentException.BinaryCause.Deserialize<Exception>();
+ }
+ else
+ {
+ Assert.IsNull(deploymentException.BinaryCause);
+
+ ex = deploymentException.InnerException;
+ }
+
+ Assert.IsNotNull(ex);
Assert.AreEqual("Expected exception", ex.Message);
- Assert.IsNotNull(ex.InnerException);
- Assert.IsTrue(ex.InnerException.Message.Contains("PlatformCallbackGateway.serviceInit"),
- ex.InnerException.Message);
+ Assert.IsTrue(ex.StackTrace.Trim().StartsWith(
+ "at Apache.Ignite.Core.Tests.Services.ServicesTest.TestIgniteServiceSerializable.Init"));
var svc0 = Services.GetService<TestIgniteServiceSerializable>(SvcName);
-
Assert.IsNull(svc0);
}
@@ -481,19 +534,27 @@ namespace Apache.Ignite.Core.Tests.Services
AssertNoService();
}
+ /// <summary>
+ /// Tests exception in binarizable implementation.
+ /// </summary>
[Test]
public void TestMarshalExceptionOnRead()
{
var svc = new TestIgniteServiceBinarizableErr();
- var ex = Assert.Throws<IgniteException>(() => Services.DeployMultiple(SvcName, svc, Grids.Length, 1));
- Assert.AreEqual("Expected exception", ex.Message);
+ var ex = Assert.Throws<ServiceDeploymentException>(() =>
+ Services.DeployMultiple(SvcName, svc, Grids.Length, 1));
+
+ Assert.AreEqual("Expected exception", ex.InnerException.Message);
var svc0 = Services.GetService<TestIgniteServiceSerializable>(SvcName);
Assert.IsNull(svc0);
}
+ /// <summary>
+ /// Tests exception in binarizable implementation.
+ /// </summary>
[Test]
public void TestMarshalExceptionOnWrite()
{
@@ -507,6 +568,9 @@ namespace Apache.Ignite.Core.Tests.Services
Assert.IsNull(svc0);
}
+ /// <summary>
+ /// Tests Java service invocation.
+ /// </summary>
[Test]
public void TestCallJavaService()
{
@@ -781,6 +845,7 @@ namespace Apache.Ignite.Core.Tests.Services
/** <inheritdoc /> */
public Guid NodeId
{
+ // ReSharper disable once InconsistentlySynchronizedField
get { return _grid.GetCluster().GetLocalNode().Id; }
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/56860d22/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj b/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
index 241e1c6..dd40156 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
@@ -526,6 +526,7 @@
<Compile Include="Services\IServices.cs" />
<Compile Include="Services\Package-Info.cs" />
<Compile Include="Services\ServiceConfiguration.cs" />
+ <Compile Include="Services\ServiceDeploymentException.cs" />
<Compile Include="Services\ServiceInvocationException.cs" />
<Compile Include="Transactions\ITransaction.cs" />
<Compile Include="Transactions\ITransactionMetrics.cs" />
http://git-wip-us.apache.org/repos/asf/ignite/blob/56860d22/modules/platforms/dotnet/Apache.Ignite.Core/Impl/ExceptionUtils.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/ExceptionUtils.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/ExceptionUtils.cs
index c0c261b..14ba666 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/ExceptionUtils.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/ExceptionUtils.cs
@@ -31,6 +31,7 @@ namespace Apache.Ignite.Core.Impl
using Apache.Ignite.Core.Common;
using Apache.Ignite.Core.Compute;
using Apache.Ignite.Core.Impl.Binary;
+ using Apache.Ignite.Core.Services;
using Apache.Ignite.Core.Transactions;
/// <summary>
@@ -103,9 +104,12 @@ namespace Apache.Ignite.Core.Impl
Exs["org.apache.ignite.IgniteAuthenticationException"] = (c, m, e, i) => new SecurityException(m, e);
Exs["org.apache.ignite.plugin.security.GridSecurityException"] = (c, m, e, i) => new SecurityException(m, e);
- // Future exceptions
+ // Future exceptions.
Exs["org.apache.ignite.lang.IgniteFutureCancelledException"] = (c, m, e, i) => new IgniteFutureCancelledException(m, e);
Exs["org.apache.ignite.internal.IgniteFutureCancelledCheckedException"] = (c, m, e, i) => new IgniteFutureCancelledException(m, e);
+
+ // Service exceptions.
+ Exs["org.apache.ignite.services.ServiceDeploymentException"] = (c, m, e, i) => new ServiceDeploymentException(m, e);
}
/// <summary>
http://git-wip-us.apache.org/repos/asf/ignite/blob/56860d22/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/ServiceProxySerializer.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/ServiceProxySerializer.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/ServiceProxySerializer.cs
index 2fd020e..b4273b1 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/ServiceProxySerializer.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/ServiceProxySerializer.cs
@@ -157,6 +157,42 @@ namespace Apache.Ignite.Core.Impl.Services
}
/// <summary>
+ /// Reads service deployment result.
+ /// </summary>
+ /// <param name="stream">Stream.</param>
+ /// <param name="marsh">Marshaller.</param>
+ /// <param name="keepBinary">Binary flag.</param>
+ /// <returns>
+ /// Method invocation result, or exception in case of error.
+ /// </returns>
+ public static void ReadDeploymentResult(IBinaryStream stream, Marshaller marsh, bool keepBinary)
+ {
+ Debug.Assert(stream != null);
+ Debug.Assert(marsh != null);
+
+ var mode = keepBinary ? BinaryMode.ForceBinary : BinaryMode.Deserialize;
+
+ var reader = marsh.StartUnmarshal(stream, mode);
+
+ object err;
+
+ BinaryUtils.ReadInvocationResult(reader, out err);
+
+ if (err == null)
+ {
+ return;
+ }
+
+ var binErr = err as IBinaryObject;
+
+ throw binErr != null
+ ? new ServiceDeploymentException("Service deployment failed with a binary error. " +
+ "Examine BinaryCause for details.", binErr)
+ : new ServiceDeploymentException("Service deployment failed with an exception. " +
+ "Examine InnerException for details.", (Exception) err);
+ }
+
+ /// <summary>
/// Writes the argument in platform-compatible format.
/// </summary>
private static void WriteArgForPlatforms(BinaryWriter writer, ParameterInfo param, object arg)
http://git-wip-us.apache.org/repos/asf/ignite/blob/56860d22/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/Services.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/Services.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/Services.cs
index 93611f7..fca3425 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/Services.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/Services.cs
@@ -24,6 +24,8 @@ namespace Apache.Ignite.Core.Impl.Services
using System.Threading.Tasks;
using Apache.Ignite.Core.Binary;
using Apache.Ignite.Core.Cluster;
+ using Apache.Ignite.Core.Impl.Binary;
+ using Apache.Ignite.Core.Impl.Binary.IO;
using Apache.Ignite.Core.Impl.Common;
using Apache.Ignite.Core.Services;
@@ -200,13 +202,13 @@ namespace Apache.Ignite.Core.Impl.Services
IgniteArgumentCheck.NotNullOrEmpty(name, "name");
IgniteArgumentCheck.NotNull(service, "service");
- DoOutOp(OpDeployMultiple, w =>
+ DoOutInOp(OpDeployMultiple, w =>
{
w.WriteString(name);
w.WriteObject(service);
w.WriteInt(totalCount);
w.WriteInt(maxPerNodeCount);
- });
+ }, ReadDeploymentResult);
}
/** <inheritDoc /> */
@@ -221,7 +223,7 @@ namespace Apache.Ignite.Core.Impl.Services
w.WriteObject(service);
w.WriteInt(totalCount);
w.WriteInt(maxPerNodeCount);
- });
+ }, _keepBinary, ReadDeploymentResult);
}
/** <inheritDoc /> */
@@ -229,7 +231,7 @@ namespace Apache.Ignite.Core.Impl.Services
{
IgniteArgumentCheck.NotNull(configuration, "configuration");
- DoOutOp(OpDeploy, w => WriteServiceConfiguration(configuration, w));
+ DoOutInOp(OpDeploy, w => WriteServiceConfiguration(configuration, w), ReadDeploymentResult);
}
/** <inheritDoc /> */
@@ -237,7 +239,8 @@ namespace Apache.Ignite.Core.Impl.Services
{
IgniteArgumentCheck.NotNull(configuration, "configuration");
- return DoOutOpAsync(OpDeployAsync, w => WriteServiceConfiguration(configuration, w));
+ return DoOutOpAsync(OpDeployAsync, w => WriteServiceConfiguration(configuration, w),
+ _keepBinary, ReadDeploymentResult);
}
/** <inheritDoc /> */
@@ -397,5 +400,22 @@ namespace Apache.Ignite.Core.Impl.Services
else
w.WriteObject<object>(null);
}
+
+ /// <summary>
+ /// Reads the deployment result.
+ /// </summary>
+ private object ReadDeploymentResult(BinaryReader r)
+ {
+ return r != null ? ReadDeploymentResult(r.Stream) : null;
+ }
+
+ /// <summary>
+ /// Reads the deployment result.
+ /// </summary>
+ private object ReadDeploymentResult(IBinaryStream s)
+ {
+ ServiceProxySerializer.ReadDeploymentResult(s, Marshaller, _keepBinary);
+ return null;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/56860d22/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs
index 819eda2..d783c38 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs
@@ -902,20 +902,45 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
#region IMPLEMENTATION: SERVICES
+ [SuppressMessage("Microsoft.Design", "CA1031:DoNotCatchGeneralExceptionTypes",
+ Justification = "User processor can throw any exception")]
private long ServiceInit(long memPtr)
{
using (var stream = IgniteManager.Memory.Get(memPtr).GetStream())
{
- var reader = _ignite.Marshaller.StartUnmarshal(stream);
+ try
+ {
+ var reader = _ignite.Marshaller.StartUnmarshal(stream);
- bool srvKeepBinary = reader.ReadBoolean();
- var svc = reader.ReadObject<IService>();
+ var srvKeepBinary = reader.ReadBoolean();
+ var svc = reader.ReadObject<IService>();
+
+ ResourceProcessor.Inject(svc, _ignite);
+
+ svc.Init(new ServiceContext(_ignite.Marshaller.StartUnmarshal(stream, srvKeepBinary)));
+
+ stream.Reset();
+
+ stream.WriteBool(true); // Success.
+
+ stream.SynchronizeOutput();
- ResourceProcessor.Inject(svc, _ignite);
+ return _handleRegistry.Allocate(svc);
+ }
+ catch (Exception e)
+ {
+ stream.Reset();
+
+ var writer = _ignite.Marshaller.StartMarshal(stream);
- svc.Init(new ServiceContext(_ignite.Marshaller.StartUnmarshal(stream, srvKeepBinary)));
+ BinaryUtils.WriteInvocationResult(writer, false, e);
- return _handleRegistry.Allocate(svc);
+ _ignite.Marshaller.FinishMarshal(writer);
+
+ stream.SynchronizeOutput();
+
+ return 0;
+ }
}
}
http://git-wip-us.apache.org/repos/asf/ignite/blob/56860d22/modules/platforms/dotnet/Apache.Ignite.Core/Services/ServiceDeploymentException.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Services/ServiceDeploymentException.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Services/ServiceDeploymentException.cs
new file mode 100644
index 0000000..825f91e
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Services/ServiceDeploymentException.cs
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+namespace Apache.Ignite.Core.Services
+{
+ using System;
+ using System.Diagnostics.CodeAnalysis;
+ using System.Runtime.Serialization;
+ using Apache.Ignite.Core.Binary;
+ using Apache.Ignite.Core.Common;
+
+ /// <summary>
+ /// Indicates an error during Grid Services deployment.
+ /// </summary>
+ [Serializable]
+ public class ServiceDeploymentException : IgniteException
+ {
+ /** Serializer key. */
+ private const string KeyBinaryCause = "BinaryCause";
+
+ /** Cause. */
+ private readonly IBinaryObject _binaryCause;
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ServiceDeploymentException"/> class.
+ /// </summary>
+ public ServiceDeploymentException()
+ {
+ // No-op.
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ServiceDeploymentException"/> class.
+ /// </summary>
+ /// <param name="message">The message that describes the error.</param>
+ public ServiceDeploymentException(string message) : base(message)
+ {
+ // No-op.
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ServiceDeploymentException"/> class.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ /// <param name="cause">The cause.</param>
+ public ServiceDeploymentException(string message, Exception cause) : base(message, cause)
+ {
+ // No-op.
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="ServiceDeploymentException"/> class.
+ /// </summary>
+ /// <param name="message">The message.</param>
+ /// <param name="binaryCause">The binary cause.</param>
+ public ServiceDeploymentException(string message, IBinaryObject binaryCause)
+ : base(message)
+ {
+ _binaryCause = binaryCause;
+ }
+
+ /// <summary>
+ /// Initializes a new instance of the <see cref="IgniteException"/> class.
+ /// </summary>
+ /// <param name="info">Serialization information.</param>
+ /// <param name="ctx">Streaming context.</param>
+ protected ServiceDeploymentException(SerializationInfo info, StreamingContext ctx)
+ : base(info, ctx)
+ {
+ _binaryCause = (IBinaryObject)info.GetValue(KeyBinaryCause, typeof(IBinaryObject));
+ }
+
+ /// <summary>
+ /// Gets the binary cause.
+ /// </summary>
+ public IBinaryObject BinaryCause
+ {
+ get { return _binaryCause; }
+ }
+
+ /// <summary>
+ /// When overridden in a derived class, sets the <see cref="SerializationInfo" />
+ /// with information about the exception.
+ /// </summary>
+ /// <param name="info">The <see cref="SerializationInfo" /> that holds the serialized object data
+ /// about the exception being thrown.</param>
+ /// <param name="context">The <see cref="StreamingContext" /> that contains contextual information
+ /// about the source or destination.</param>
+ [SuppressMessage("Microsoft.Design", "CA1062:Validate arguments of public methods")]
+ public override void GetObjectData(SerializationInfo info, StreamingContext context)
+ {
+ info.AddValue(KeyBinaryCause, _binaryCause);
+
+ base.GetObjectData(info, context);
+ }
+ }
+}
\ No newline at end of file