You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by vo...@apache.org on 2015/11/18 14:39:50 UTC

[16/50] [abbrv] ignite git commit: IGNITE-1921 .Net: Fixed handle leak during ComputeJobHolder serialization.

IGNITE-1921 .Net: Fixed handle leak during ComputeJobHolder serialization.


Project: http://git-wip-us.apache.org/repos/asf/ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/ignite/commit/fff85cb2
Tree: http://git-wip-us.apache.org/repos/asf/ignite/tree/fff85cb2
Diff: http://git-wip-us.apache.org/repos/asf/ignite/diff/fff85cb2

Branch: refs/heads/ignite-1917
Commit: fff85cb22bdffb0f758977156d41e683210ed148
Parents: b96886d
Author: Pavel Tupitsyn <pt...@gridgain.com>
Authored: Tue Nov 17 16:46:22 2015 +0300
Committer: vozerov-gridgain <vo...@gridgain.com>
Committed: Tue Nov 17 16:46:22 2015 +0300

----------------------------------------------------------------------
 .../Compute/ComputeApiTest.cs                   | 22 +++++-
 .../Impl/Compute/ComputeImpl.cs                 | 12 ++-
 .../Impl/Compute/ComputeTaskHolder.cs           | 79 +++++++++++++-------
 3 files changed, 84 insertions(+), 29 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/fff85cb2/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
index f02e67e..cb582b7 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
@@ -1087,6 +1087,16 @@ namespace Apache.Ignite.Core.Tests.Compute
             Assert.AreEqual(_grid1.GetCompute().ClusterGroup.GetNodes().Count, res);
         }
 
+        [Test]
+        public void TestExceptions()
+        {
+            Assert.Throws<BinaryObjectException>(() => _grid1.GetCompute().Broadcast(new InvalidComputeAction()));
+
+            Assert.Throws<BinaryObjectException>(
+                () => _grid1.GetCompute().Execute<NetSimpleJobArgument, NetSimpleJobResult, NetSimpleTaskResult>(
+                    typeof (NetSimpleTask), new NetSimpleJobArgument(-1)));
+        }
+
         /// <summary>
         /// Create configuration.
         /// </summary>
@@ -1143,7 +1153,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             for (int i = 0; i < subgrid.Count; i++)
             {
-                NetSimpleJob job = new NetSimpleJob {Arg = arg};
+                var job = arg.Arg > 0 ? new NetSimpleJob {Arg = arg} : new InvalidNetSimpleJob();
 
                 jobs[job] = subgrid[i];
             }
@@ -1183,6 +1193,11 @@ namespace Apache.Ignite.Core.Tests.Compute
         }
     }
 
+    class InvalidNetSimpleJob : NetSimpleJob
+    {
+        // No-op.
+    }
+
     [Serializable]
     class NetSimpleJobArgument
     {
@@ -1234,6 +1249,11 @@ namespace Apache.Ignite.Core.Tests.Compute
         }
     }
 
+    class InvalidComputeAction : ComputeAction
+    {
+        // No-op.
+    }
+
     interface IUserInterface<out T>
     {
         T Invoke();

http://git-wip-us.apache.org/repos/asf/ignite/blob/fff85cb2/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeImpl.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeImpl.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeImpl.cs
index bbb9489..b44b2ee 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeImpl.cs
@@ -583,7 +583,17 @@ namespace Apache.Ignite.Core.Impl.Compute
             var jobHandle = Marshaller.Ignite.HandleRegistry.Allocate(jobHolder);
 
             writer.WriteLong(jobHandle);
-            writer.WriteObject(jobHolder);
+
+            try
+            {
+                writer.WriteObject(jobHolder);
+            }
+            catch (Exception)
+            {
+                Marshaller.Ignite.HandleRegistry.Release(jobHandle);
+
+                throw;
+            }
 
             return jobHandle;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/fff85cb2/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeTaskHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeTaskHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeTaskHolder.cs
index 8f9d06a..e992245 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeTaskHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeTaskHolder.cs
@@ -221,34 +221,8 @@ namespace Apache.Ignite.Core.Impl.Compute
                     else
                     {
                         writer.WriteBoolean(true); // Map produced result.
-                        writer.WriteInt(map.Count); // Amount of mapped jobs.
 
-                        var jobHandles = new List<long>(map.Count);
-
-                        foreach (KeyValuePair<IComputeJob<T>, IClusterNode> mapEntry in map)
-                        {
-                            var job = new ComputeJobHolder(_compute.ClusterGroup.Ignite as Ignite, mapEntry.Key.ToNonGeneric());
-
-                            IClusterNode node = mapEntry.Value;
-
-                            var jobHandle = ignite.HandleRegistry.Allocate(job);
-
-                            jobHandles.Add(jobHandle);
-
-                            writer.WriteLong(jobHandle);
-
-                            if (node.IsLocal)
-                                writer.WriteBoolean(false); // Job is not serialized.
-                            else
-                            {
-                                writer.WriteBoolean(true); // Job is serialized.
-                                writer.WriteObject(job);
-                            }
-
-                            writer.WriteGuid(node.Id);
-                        }
-
-                        _jobHandles = jobHandles;
+                        _jobHandles = WriteJobs(writer, map);
                     }
                 }
                 else
@@ -277,6 +251,57 @@ namespace Apache.Ignite.Core.Impl.Compute
             }
         }
 
+        /// <summary>
+        /// Writes job map.
+        /// </summary>
+        /// <param name="writer">Writer.</param>
+        /// <param name="map">Map</param>
+        /// <returns>Job handle list.</returns>
+        private static List<long> WriteJobs(BinaryWriter writer, IDictionary<IComputeJob<T>, IClusterNode> map)
+        {
+            Debug.Assert(writer != null && map != null);
+
+            writer.WriteInt(map.Count); // Amount of mapped jobs.
+
+            var jobHandles = new List<long>(map.Count);
+            var ignite = writer.Marshaller.Ignite;
+
+            try
+            {
+                foreach (KeyValuePair<IComputeJob<T>, IClusterNode> mapEntry in map)
+                {
+                    var job = new ComputeJobHolder(ignite, mapEntry.Key.ToNonGeneric());
+
+                    IClusterNode node = mapEntry.Value;
+
+                    var jobHandle = ignite.HandleRegistry.Allocate(job);
+
+                    jobHandles.Add(jobHandle);
+
+                    writer.WriteLong(jobHandle);
+
+                    if (node.IsLocal)
+                        writer.WriteBoolean(false); // Job is not serialized.
+                    else
+                    {
+                        writer.WriteBoolean(true); // Job is serialized.
+                        writer.WriteObject(job);
+                    }
+
+                    writer.WriteGuid(node.Id);
+                }
+            }
+            catch (Exception)
+            {
+                foreach (var handle in jobHandles)
+                    ignite.HandleRegistry.Release(handle);
+
+                throw;
+            }
+
+            return jobHandles;
+        }
+
         /** <inheritDoc /> */
         public int JobResultLocal(ComputeJobHolder job)
         {