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 <[email protected]> Authored: Wed Sep 6 13:27:25 2017 +0300 Committer: Pavel Tupitsyn <[email protected]> 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
