Repository: ignite
Updated Branches:
  refs/heads/master 2d69ed630 -> 277480c29


IGNITE-3182 .NET: Fix compute jobs executing on client nodes

This closes #748


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

Branch: refs/heads/master
Commit: 277480c293bc27335f9e6618c4c362a6f326c00d
Parents: 2d69ed6
Author: Pavel Tupitsyn <ptupit...@apache.org>
Authored: Thu Jun 16 15:03:59 2016 +0300
Committer: Pavel Tupitsyn <ptupit...@apache.org>
Committed: Thu Jun 16 15:03:59 2016 +0300

----------------------------------------------------------------------
 .../platform/cluster/PlatformClusterGroup.java  |  7 ++
 .../cpp/jni/include/ignite/jni/exports.h        |  1 +
 .../platforms/cpp/jni/include/ignite/jni/java.h |  2 +
 modules/platforms/cpp/jni/project/vs/module.def |  2 +
 modules/platforms/cpp/jni/src/exports.cpp       |  4 ++
 modules/platforms/cpp/jni/src/java.cpp          | 12 ++++
 .../Compute/AbstractTaskTest.cs                 |  9 +++
 .../Compute/BinarizableTaskTest.cs              | 13 ++--
 .../Compute/ComputeApiTest.cs                   | 70 +++++++++-----------
 .../Compute/FailoverTaskSelfTest.cs             |  2 +-
 .../Compute/IgniteExceptionTaskSelfTest.cs      | 18 ++---
 .../Compute/ResourceTaskTest.cs                 |  8 +--
 .../Compute/TaskAdapterTest.cs                  | 16 +++--
 .../Compute/TaskResultTest.cs                   | 10 +--
 .../Apache.Ignite.Core.Tests/EventsTest.cs      |  4 +-
 .../Services/ServicesTest.cs                    | 19 +++---
 .../Apache.Ignite.Core.Tests/TestRunner.cs      |  6 +-
 .../Apache.Ignite.Core/Cluster/IClusterGroup.cs |  6 ++
 .../Impl/Cluster/ClusterGroupImpl.cs            |  6 ++
 .../dotnet/Apache.Ignite.Core/Impl/Ignite.cs    | 10 ++-
 .../Apache.Ignite.Core/Impl/IgniteProxy.cs      |  6 ++
 .../Impl/Unmanaged/IgniteJniNativeMethods.cs    |  3 +
 .../Impl/Unmanaged/UnmanagedUtils.cs            |  7 ++
 23 files changed, 154 insertions(+), 87 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup.java
index d80079c..9a49c2e 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup.java
@@ -304,6 +304,13 @@ public class PlatformClusterGroup extends 
PlatformAbstractTarget {
     }
 
     /**
+     * @return New projection.
+     */
+    public PlatformClusterGroup forServers() {
+        return new PlatformClusterGroup(platformCtx, 
(ClusterGroupEx)prj.forServers());
+    }
+
+    /**
      * @return Projection.
      */
     public ClusterGroupEx projection() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/cpp/jni/include/ignite/jni/exports.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/jni/include/ignite/jni/exports.h 
b/modules/platforms/cpp/jni/include/ignite/jni/exports.h
index bcfc213..bf278e2 100644
--- a/modules/platforms/cpp/jni/include/ignite/jni/exports.h
+++ b/modules/platforms/cpp/jni/include/ignite/jni/exports.h
@@ -114,6 +114,7 @@ extern "C" {
     void* IGNITE_CALL IgniteProjectionForRandom(gcj::JniContext* ctx, void* 
obj);
     void* IGNITE_CALL IgniteProjectionForOldest(gcj::JniContext* ctx, void* 
obj);
     void* IGNITE_CALL IgniteProjectionForYoungest(gcj::JniContext* ctx, void* 
obj);
+    void* IGNITE_CALL IgniteProjectionForServers(gcj::JniContext* ctx, void* 
obj);
     void IGNITE_CALL IgniteProjectionResetMetrics(gcj::JniContext* ctx, void* 
obj);
     void* IGNITE_CALL IgniteProjectionOutOpRet(gcj::JniContext* ctx, void* 
obj, int type, long long memPtr);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/cpp/jni/include/ignite/jni/java.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/jni/include/ignite/jni/java.h 
b/modules/platforms/cpp/jni/include/ignite/jni/java.h
index 8be8a32..3d45ec0 100644
--- a/modules/platforms/cpp/jni/include/ignite/jni/java.h
+++ b/modules/platforms/cpp/jni/include/ignite/jni/java.h
@@ -248,6 +248,7 @@ namespace ignite
                 jmethodID m_PlatformClusterGroup_forRandom;
                 jmethodID m_PlatformClusterGroup_forOldest;
                 jmethodID m_PlatformClusterGroup_forYoungest;
+                jmethodID m_PlatformClusterGroup_forServers;
                 jmethodID m_PlatformClusterGroup_resetMetrics;
 
                 jclass c_PlatformCompute;
@@ -594,6 +595,7 @@ namespace ignite
                 jobject ProjectionForRandom(jobject obj);
                 jobject ProjectionForOldest(jobject obj);
                 jobject ProjectionForYoungest(jobject obj);
+                jobject ProjectionForServers(jobject obj);
                 void ProjectionResetMetrics(jobject obj);
                 jobject ProjectionOutOpRet(jobject obj, int type, long long 
memPtr);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/cpp/jni/project/vs/module.def
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/jni/project/vs/module.def 
b/modules/platforms/cpp/jni/project/vs/module.def
index dc4af3d..cfe658c 100644
--- a/modules/platforms/cpp/jni/project/vs/module.def
+++ b/modules/platforms/cpp/jni/project/vs/module.def
@@ -133,3 +133,5 @@ IgniteAtomicReferenceClose @130
 IgniteProcessorCreateNearCache @131
 IgniteProcessorGetOrCreateNearCache @132
 IgniteProcessorGetCacheNames @133
+IgniteProjectionForServers @134
+ 
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/cpp/jni/src/exports.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/jni/src/exports.cpp 
b/modules/platforms/cpp/jni/src/exports.cpp
index 89878d4..6c4760c 100644
--- a/modules/platforms/cpp/jni/src/exports.cpp
+++ b/modules/platforms/cpp/jni/src/exports.cpp
@@ -343,6 +343,10 @@ extern "C" {
         return ctx->ProjectionForYoungest(static_cast<jobject>(obj));
     }
 
+    void* IGNITE_CALL IgniteProjectionForServers(gcj::JniContext* ctx, void* 
obj) {
+        return ctx->ProjectionForServers(static_cast<jobject>(obj));
+    }
+
     void IGNITE_CALL IgniteProjectionResetMetrics(gcj::JniContext* ctx, void* 
obj) {
         ctx->ProjectionResetMetrics(static_cast<jobject>(obj));
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/cpp/jni/src/java.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/jni/src/java.cpp 
b/modules/platforms/cpp/jni/src/java.cpp
index 282b874..66be0ca 100644
--- a/modules/platforms/cpp/jni/src/java.cpp
+++ b/modules/platforms/cpp/jni/src/java.cpp
@@ -233,6 +233,7 @@ namespace ignite
             JniMethod M_PLATFORM_CLUSTER_GRP_FOR_RANDOM = 
JniMethod("forRandom", 
"()Lorg/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup;",
 false);
             JniMethod M_PLATFORM_CLUSTER_GRP_FOR_OLDEST = 
JniMethod("forOldest", 
"()Lorg/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup;",
 false);
             JniMethod M_PLATFORM_CLUSTER_GRP_FOR_YOUNGEST = 
JniMethod("forYoungest", 
"()Lorg/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup;",
 false);
+            JniMethod M_PLATFORM_CLUSTER_GRP_FOR_SERVERS = 
JniMethod("forServers", 
"()Lorg/apache/ignite/internal/processors/platform/cluster/PlatformClusterGroup;",
 false);
             JniMethod M_PLATFORM_CLUSTER_GRP_RESET_METRICS = 
JniMethod("resetMetrics", "()V", false);
 
             const char* C_PLATFORM_MESSAGING = 
"org/apache/ignite/internal/processors/platform/messaging/PlatformMessaging";
@@ -615,6 +616,7 @@ namespace ignite
                 m_PlatformClusterGroup_forRandom = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_FOR_RANDOM);
                 m_PlatformClusterGroup_forOldest = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_FOR_OLDEST);
                 m_PlatformClusterGroup_forYoungest = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_FOR_YOUNGEST);
+                m_PlatformClusterGroup_forServers = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_FOR_SERVERS);
                 m_PlatformClusterGroup_resetMetrics = FindMethod(env, 
c_PlatformClusterGroup, M_PLATFORM_CLUSTER_GRP_RESET_METRICS);
 
                 c_PlatformCompute = FindClass(env, C_PLATFORM_COMPUTE);
@@ -1955,6 +1957,16 @@ namespace ignite
                 return LocalToGlobal(env, newPrj);
             }
 
+            jobject JniContext::ProjectionForServers(jobject obj) {
+                JNIEnv* env = Attach();
+
+                jobject newPrj = env->CallObjectMethod(obj, 
jvm->GetMembers().m_PlatformClusterGroup_forServers);
+
+                ExceptionCheck(env);
+
+                return LocalToGlobal(env, newPrj);
+            }
+
             void JniContext::ProjectionResetMetrics(jobject obj) {
                 JNIEnv* env = Attach();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs
----------------------------------------------------------------------
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs
index e3d0d96..d31ad43 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/AbstractTaskTest.cs
@@ -19,6 +19,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 {
     using System;
     using System.Collections.Generic;
+    using System.Linq;
     using System.Threading;
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Tests.Process;
@@ -213,5 +214,13 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             // No-op.
         }
+
+        /// <summary>
+        /// Gets the server count.
+        /// </summary>
+        protected int GetServerCount()
+        {
+            return Grid1.GetCluster().GetNodes().Count(x => !x.IsClient);
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableTaskTest.cs
----------------------------------------------------------------------
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableTaskTest.cs
 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableTaskTest.cs
index 5c1ee34..8aa28de 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableTaskTest.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/BinarizableTaskTest.cs
@@ -100,7 +100,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             /** <inheritDoc /> */
             override public IDictionary<IComputeJob<BinarizableWrapper>, 
IClusterNode> Map(IList<IClusterNode> subgrid, BinarizableWrapper arg)
             {
-                Assert.AreEqual(3, subgrid.Count);
+                Assert.AreEqual(2, subgrid.Count);
                 Assert.NotNull(_grid);
 
                 var taskArg = arg;
@@ -114,15 +114,12 @@ namespace Apache.Ignite.Core.Tests.Compute
 
                 foreach (IClusterNode node in subgrid)
                 {
-                    if 
(!Grid3Name.Equals(node.GetAttribute<string>("org.apache.ignite.ignite.name"))) 
// Grid3 does not have cache.
+                    var job = new BinarizableJob
                     {
-                        var job = new BinarizableJob
-                        {
-                            Arg = new BinarizableWrapper {Item = 
ToBinary(_grid, new BinarizableJobArgument(200))}
-                        };
+                        Arg = new BinarizableWrapper {Item = ToBinary(_grid, 
new BinarizableJobArgument(200))}
+                    };
 
-                        jobs.Add(job, node);
-                    }
+                    jobs.Add(job, node);
                 }
 
                 Assert.AreEqual(2, jobs.Count);

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/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 2c5b31e..d431aed 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ComputeApiTest.cs
@@ -560,6 +560,26 @@ namespace Apache.Ignite.Core.Tests.Compute
         }
 
         /// <summary>
+        /// Tests ForServers projection.
+        /// </summary>
+        [Test]
+        public void TestForServers()
+        {
+            var cluster = _grid1.GetCluster();
+
+            var servers = cluster.ForServers().GetNodes();
+            Assert.AreEqual(2, servers.Count);
+            Assert.IsTrue(servers.All(x => !x.IsClient));
+
+            var serverAndClient =
+                cluster.ForNodeIds(new[] { _grid2, _grid3 }.Select(x => 
x.GetCluster().GetLocalNode().Id));
+            Assert.AreEqual(1, serverAndClient.ForServers().GetNodes().Count);
+
+            var client = cluster.ForNodeIds(new[] { _grid3 }.Select(x => 
x.GetCluster().GetLocalNode().Id));
+            Assert.AreEqual(0, client.ForServers().GetNodes().Count);
+        }
+
+        /// <summary>
         /// Test for attribute projection.
         /// </summary>
         [Test]
@@ -957,47 +977,25 @@ namespace Apache.Ignite.Core.Tests.Compute
         /// Test running broadcast task.
         /// </summary>
         [Test]
-        public void TestBroadcastTask()
-        {
-            var res = 
_grid1.GetCompute().ExecuteJavaTask<ICollection>(BroadcastTask, 
null).OfType<Guid>().ToList();
-
-            Assert.AreEqual(3, res.Count);
-            Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(0)).GetNodes().Count);
-            Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(1)).GetNodes().Count);
-            Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(2)).GetNodes().Count);
-
-            var prj = _grid1.GetCluster().ForPredicate(node => 
res.Take(2).Contains(node.Id));
-
-            Assert.AreEqual(2, prj.GetNodes().Count);
-
-            var filteredRes = 
prj.GetCompute().ExecuteJavaTask<ICollection>(BroadcastTask, 
null).OfType<Guid>().ToList();
-
-            Assert.AreEqual(2, filteredRes.Count);
-            Assert.IsTrue(filteredRes.Contains(res.ElementAt(0)));
-            Assert.IsTrue(filteredRes.Contains(res.ElementAt(1)));
-        }
-
-        /// <summary>
-        /// Test running broadcast task in async mode.
-        /// </summary>
-        [Test]
-        public void TestBroadcastTaskAsync()
+        public void TestBroadcastTask([Values(false, true)] bool isAsync)
         {
-            var gridCompute = _grid1.GetCompute();
+            var execTask =
+                isAsync
+                    ? (Func<ICompute, List<Guid>>) (
+                        c => 
c.ExecuteJavaTaskAsync<ICollection>(BroadcastTask, 
null).Result.OfType<Guid>().ToList())
+                    : c => c.ExecuteJavaTask<ICollection>(BroadcastTask, 
null).OfType<Guid>().ToList();
 
-            var res = 
gridCompute.ExecuteJavaTaskAsync<ICollection>(BroadcastTask, 
null).Result.OfType<Guid>().ToList();
+            var res = execTask(_grid1.GetCompute());
 
-            Assert.AreEqual(3, res.Count);
+            Assert.AreEqual(2, res.Count);
             Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(0)).GetNodes().Count);
             Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(1)).GetNodes().Count);
-            Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(2)).GetNodes().Count);
 
             var prj = _grid1.GetCluster().ForPredicate(node => 
res.Take(2).Contains(node.Id));
 
             Assert.AreEqual(2, prj.GetNodes().Count);
 
-            var compute = prj.GetCompute();
-            var filteredRes = 
compute.ExecuteJavaTaskAsync<IList>(BroadcastTask, null).Result;
+            var filteredRes = execTask(prj.GetCompute());
 
             Assert.AreEqual(2, filteredRes.Count);
             Assert.IsTrue(filteredRes.Contains(res.ElementAt(0)));
@@ -1014,7 +1012,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             
             _grid1.GetCompute().Broadcast(new ComputeAction());
 
-            Assert.AreEqual(_grid1.GetCluster().GetNodes().Count, 
ComputeAction.InvokeCount);
+            Assert.AreEqual(2, ComputeAction.InvokeCount);
         }
 
         /// <summary>
@@ -1125,10 +1123,9 @@ namespace Apache.Ignite.Core.Tests.Compute
             var res = 
_grid1.GetCompute().WithNoFailover().ExecuteJavaTask<ICollection>(BroadcastTask,
 null)
                 .OfType<Guid>().ToList();
 
-            Assert.AreEqual(3, res.Count);
+            Assert.AreEqual(2, res.Count);
             Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(0)).GetNodes().Count);
             Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(1)).GetNodes().Count);
-            Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(2)).GetNodes().Count);
         }
 
         /// <summary>
@@ -1140,10 +1137,9 @@ namespace Apache.Ignite.Core.Tests.Compute
             var res = 
_grid1.GetCompute().WithTimeout(1000).ExecuteJavaTask<ICollection>(BroadcastTask,
 null)
                 .OfType<Guid>().ToList();
 
-            Assert.AreEqual(3, res.Count);
+            Assert.AreEqual(2, res.Count);
             Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(0)).GetNodes().Count);
             Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(1)).GetNodes().Count);
-            Assert.AreEqual(1, 
_grid1.GetCluster().ForNodeIds(res.ElementAt(2)).GetNodes().Count);
         }
 
         /// <summary>
@@ -1155,7 +1151,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             int res = _grid1.GetCompute().Execute<NetSimpleJobArgument, 
NetSimpleJobResult, NetSimpleTaskResult>(
                     typeof(NetSimpleTask), new NetSimpleJobArgument(1)).Res;
 
-            Assert.AreEqual(_grid1.GetCompute().ClusterGroup.GetNodes().Count, 
res);
+            Assert.AreEqual(2, res);
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs
----------------------------------------------------------------------
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs
 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs
index 34a1573..45af888 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/FailoverTaskSelfTest.cs
@@ -124,7 +124,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             /** <inheritDoc /> */
             override public IDictionary<IComputeJob<int>, IClusterNode> 
Map(IList<IClusterNode> subgrid, Tuple<bool, bool> arg)
             {
-                Assert.AreEqual(3, subgrid.Count);
+                Assert.AreEqual(2, subgrid.Count);
 
                 Tuple<bool, bool> t = arg;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/IgniteExceptionTaskSelfTest.cs
----------------------------------------------------------------------
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/IgniteExceptionTaskSelfTest.cs
 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/IgniteExceptionTaskSelfTest.cs
index 55d04cd..0c983fd 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/IgniteExceptionTaskSelfTest.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/IgniteExceptionTaskSelfTest.cs
@@ -103,7 +103,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             int res = Execute();
 
-            Assert.AreEqual(2, res);
+            Assert.AreEqual(1, res);
 
             Assert.AreEqual(1, JobErrs.Count);
             Assert.IsNotNull(JobErrs.First() as GoodException);
@@ -120,7 +120,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             int res = Execute();
 
-            Assert.AreEqual(2, res);
+            Assert.AreEqual(1, res);
 
             Assert.AreEqual(1, JobErrs.Count);
             Assert.IsNotNull(JobErrs.First() as BadException); // Local job 
exception is not marshalled.
@@ -136,7 +136,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             int res = Execute();
 
-            Assert.AreEqual(3, res); // Local job result is not marshalled.
+            Assert.AreEqual(2, res); // Local job result is not marshalled.
 
             Assert.AreEqual(0, JobErrs.Count);
         }
@@ -153,13 +153,11 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             Assert.AreEqual(1, res);
 
-            Assert.AreEqual(2, JobErrs.Count);
+            Assert.AreEqual(1, JobErrs.Count);
 
             Assert.IsNotNull(JobErrs.ElementAt(0) as GoodException);
-            Assert.IsNotNull(JobErrs.ElementAt(1) as GoodException);
 
             Assert.AreEqual(ErrorMode.RmtJobErr, ((GoodException) 
JobErrs.ElementAt(0)).Mode);
-            Assert.AreEqual(ErrorMode.RmtJobErr, ((GoodException) 
JobErrs.ElementAt(1)).Mode);
         }
 
         /// <summary>
@@ -174,10 +172,9 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             Assert.AreEqual(1, res);
 
-            Assert.AreEqual(2, JobErrs.Count);
+            Assert.AreEqual(1, JobErrs.Count);
 
             Assert.IsNotNull(JobErrs.ElementAt(0) as IgniteException);
-            Assert.IsNotNull(JobErrs.ElementAt(1) as IgniteException);
         }
 
         /// <summary>
@@ -192,10 +189,9 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             Assert.AreEqual(1, res);
 
-            Assert.AreEqual(2, JobErrs.Count);
+            Assert.AreEqual(1, JobErrs.Count);
 
             Assert.IsNotNull(JobErrs.ElementAt(0) as IgniteException);
-            Assert.IsNotNull(JobErrs.ElementAt(1) as IgniteException);
         }
 
         /// <summary>
@@ -298,7 +294,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             int res = Execute();
 
-            Assert.AreEqual(3, res);
+            Assert.AreEqual(2, res);
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ResourceTaskTest.cs
----------------------------------------------------------------------
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ResourceTaskTest.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ResourceTaskTest.cs
index da72c7b..522341a 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ResourceTaskTest.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/ResourceTaskTest.cs
@@ -50,7 +50,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             int res = Grid1.GetCompute().Execute(new InjectionTask(), 0);
 
-            Assert.AreEqual(Grid1.GetCluster().GetNodes().Count, res);
+            Assert.AreEqual(GetServerCount(), res);
         }
 
         /// <summary>
@@ -61,7 +61,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             var res = Grid1.GetCompute().Broadcast(new InjectionClosure(), 1);
 
-            Assert.AreEqual(Grid1.GetCluster().GetNodes().Count, res.Sum());
+            Assert.AreEqual(GetServerCount(), res.Sum());
         }
 
         /// <summary>
@@ -72,7 +72,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             int res = Grid1.GetCompute().Apply(new InjectionClosure(), new 
List<int> { 1, 1, 1 }, new InjectionReducer());
 
-            Assert.AreEqual(Grid1.GetCluster().GetNodes().Count, res);
+            Assert.AreEqual(3, res);
         }
 
         /// <summary>
@@ -83,7 +83,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             int res = Grid1.GetCompute().Execute(new NoResultCacheTask(), 0);
 
-            Assert.AreEqual(Grid1.GetCluster().GetNodes().Count, res);
+            Assert.AreEqual(GetServerCount(), res);
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskAdapterTest.cs
----------------------------------------------------------------------
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskAdapterTest.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskAdapterTest.cs
index 8418306..7789ac4 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskAdapterTest.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskAdapterTest.cs
@@ -15,10 +15,13 @@
  * limitations under the License.
  */
 
+#pragma warning disable 649
+#pragma warning disable 169
 namespace Apache.Ignite.Core.Tests.Compute
 {
     using System;
     using System.Collections.Generic;
+    using System.Linq;
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Compute;
     using Apache.Ignite.Core.Resource;
@@ -50,7 +53,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             HashSet<Guid> allNodes = new HashSet<Guid>(); 
 
-            for (int i = 0; i < 20 && allNodes.Count < 3; i++)
+            for (int i = 0; i < 20 && allNodes.Count < GetServerCount(); i++)
             {
                 HashSet<Guid> res = Grid1.GetCompute().Execute(new 
TestSplitTask(), 1);
 
@@ -59,7 +62,7 @@ namespace Apache.Ignite.Core.Tests.Compute
                 allNodes.UnionWith(res);
             }
 
-            Assert.AreEqual(3, allNodes.Count);
+            Assert.AreEqual(GetServerCount(), allNodes.Count);
 
             HashSet<Guid> res2 = Grid1.GetCompute().Execute<int, Guid, 
HashSet<Guid>>(typeof(TestSplitTask), 3);
 
@@ -67,7 +70,7 @@ namespace Apache.Ignite.Core.Tests.Compute
 
             Grid1.GetCompute().Execute(new TestSplitTask(), 100);
 
-            Assert.AreEqual(3, allNodes.Count);
+            Assert.AreEqual(GetServerCount(), allNodes.Count);
         }
         
         /// <summary>
@@ -109,10 +112,13 @@ namespace Apache.Ignite.Core.Tests.Compute
         /// </summary>
         public class TestSplitTask : ComputeTaskSplitAdapter<int, Guid, 
HashSet<Guid>>
         {
+            [InstanceResource]
+            private readonly IIgnite _ignite;
+
             /** <inheritDoc /> */
             override protected ICollection<IComputeJob<Guid>> Split(int 
gridSize, int arg)
             {
-                Assert.AreEqual(3, gridSize);
+                Assert.AreEqual(_ignite.GetCluster().GetNodes().Count(x => 
!x.IsClient), gridSize);
 
                 int jobsNum = arg;
 
@@ -241,7 +247,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         public class BinarizableJob : ComputeJobAdapter<bool>
         {
             [InstanceResource]
-            private IIgnite _grid = null;
+            private IIgnite _grid;
 
             public BinarizableJob(params object[] args) : base(args)
             {

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskResultTest.cs
----------------------------------------------------------------------
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskResultTest.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskResultTest.cs
index 4bf1e21..26286de 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskResultTest.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Compute/TaskResultTest.cs
@@ -169,7 +169,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             ICollection<int> res = Grid1.GetCompute().Broadcast(new 
BinarizableOutFunc());
 
-            Assert.AreEqual(3, res.Count);
+            Assert.AreEqual(2, res.Count);
 
             foreach (int r in res)
                 Assert.AreEqual(10, r);
@@ -180,7 +180,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             ICollection<int> res = Grid1.GetCompute().Broadcast(new 
SerializableOutFunc());
 
-            Assert.AreEqual(3, res.Count);
+            Assert.AreEqual(2, res.Count);
 
             foreach (int r in res)
                 Assert.AreEqual(10, r);
@@ -191,7 +191,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             ICollection<int> res = Grid1.GetCompute().Broadcast(new 
BinarizableFunc(), 10);
 
-            Assert.AreEqual(3, res.Count);
+            Assert.AreEqual(2, res.Count);
 
             foreach (int r in res)
                 Assert.AreEqual(11, r);
@@ -202,7 +202,7 @@ namespace Apache.Ignite.Core.Tests.Compute
         {
             ICollection<int> res = Grid1.GetCompute().Broadcast(new 
SerializableFunc(), 10);
 
-            Assert.AreEqual(3, res.Count);
+            Assert.AreEqual(2, res.Count);
 
             foreach (int r in res)
                 Assert.AreEqual(11, r);
@@ -282,7 +282,7 @@ namespace Apache.Ignite.Core.Tests.Compute
             {
                 _gridName = null;
 
-                Assert.AreEqual(3, subgrid.Count);
+                Assert.AreEqual(2, subgrid.Count);
 
                 bool local = arg.Item1;
                 T res = arg.Item2;

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs
index 6f51f4a..c2ccd1a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/EventsTest.cs
@@ -255,7 +255,7 @@ namespace Apache.Ignite.Core.Tests
                     EventType = EventType.JobExecutionAll,
                     EventObjectType = typeof (JobEvent),
                     GenerateEvent = g => GenerateTaskEvent(g),
-                    EventCount = 9
+                    EventCount = 7
                 };
                 
                 yield return new EventTestCase
@@ -447,7 +447,7 @@ namespace Apache.Ignite.Core.Tests
 
             var qryResult = 
remoteQuery.Except(oldEvents).Cast<JobEvent>().ToList();
 
-            Assert.AreEqual(_grids.Length, qryResult.Count);
+            Assert.AreEqual(_grids.Length - 1, qryResult.Count);
 
             Assert.IsTrue(qryResult.All(x => x.Type == EventType.JobStarted));
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/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 3269651..e114f5a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Services/ServicesTest.cs
@@ -155,7 +155,7 @@ namespace Apache.Ignite.Core.Tests.Services
 
             Assert.AreEqual(1, 
Grid1.GetServices().GetServices<ITestIgniteService>(SvcName).Count);
             Assert.AreEqual(1, 
Grid2.GetServices().GetServices<ITestIgniteService>(SvcName).Count);
-            Assert.AreEqual(1, 
Grid3.GetServices().GetServices<ITestIgniteService>(SvcName).Count);
+            Assert.AreEqual(0, 
Grid3.GetServices().GetServices<ITestIgniteService>(SvcName).Count);
         }
 
         /// <summary>
@@ -204,7 +204,7 @@ namespace Apache.Ignite.Core.Tests.Services
 
             Services.DeployMultiple(SvcName, svc, Grids.Length * 5, 5);
 
-            foreach (var grid in Grids)
+            foreach (var grid in Grids.Where(x => 
!x.GetConfiguration().ClientMode))
                 CheckServiceStarted(grid, 5);
         }
 
@@ -250,15 +250,14 @@ namespace Apache.Ignite.Core.Tests.Services
                 ? new TestIgniteServiceBinarizable {TestProperty = 17}
                 : new TestIgniteServiceSerializable {TestProperty = 17};
 
-            
Grid1.GetCluster().ForNodeIds(Grid2.GetCluster().GetLocalNode().Id, 
Grid3.GetCluster().GetLocalNode().Id).GetServices()
-                .DeployNodeSingleton(SvcName,
-                    svc);
+            
Grid1.GetCluster().ForNodeIds(Grid2.GetCluster().GetLocalNode().Id, 
Grid1.GetCluster().GetLocalNode().Id)
+                .GetServices().DeployNodeSingleton(SvcName, svc);
 
-            // Make sure there is no local instance on grid1
-            Assert.IsNull(Services.GetService<ITestIgniteService>(SvcName));
+            // Make sure there is no local instance on grid3
+            
Assert.IsNull(Grid3.GetServices().GetService<ITestIgniteService>(SvcName));
 
             // Get proxy
-            var prx = Services.GetServiceProxy<ITestIgniteService>(SvcName);
+            var prx = 
Grid3.GetServices().GetServiceProxy<ITestIgniteService>(SvcName);
 
             // Check proxy properties
             Assert.IsNotNull(prx);
@@ -282,7 +281,7 @@ namespace Apache.Ignite.Core.Tests.Services
             Assert.AreEqual(2, invokedIds.Count);
 
             // Check sticky = true: all calls should be to the same node
-            prx = Services.GetServiceProxy<ITestIgniteService>(SvcName, true);
+            prx = 
Grid3.GetServices().GetServiceProxy<ITestIgniteService>(SvcName, true);
             invokedIds = Enumerable.Range(1, 100).Select(x => 
prx.NodeId).Distinct().ToList();
             Assert.AreEqual(1, invokedIds.Count);
 
@@ -469,7 +468,7 @@ namespace Apache.Ignite.Core.Tests.Services
         {
             var svc = new TestIgniteServiceSerializable { ThrowCancel = true };
 
-            Services.DeployMultiple(SvcName, svc, Grids.Length, 1);
+            Services.DeployMultiple(SvcName, svc, 2, 1);
 
             CheckServiceStarted(Grid1);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestRunner.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestRunner.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestRunner.cs
index 74ea846..505d972 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestRunner.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestRunner.cs
@@ -21,7 +21,9 @@ namespace Apache.Ignite.Core.Tests
     using System.Diagnostics;
     using System.Reflection;
     using Apache.Ignite.Core.Tests.Cache.Query;
+    using Apache.Ignite.Core.Tests.Compute;
     using Apache.Ignite.Core.Tests.Memory;
+    using Apache.Ignite.Core.Tests.Services;
     using NUnit.ConsoleRunner;
 
     public static class TestRunner
@@ -32,9 +34,9 @@ namespace Apache.Ignite.Core.Tests
             Debug.Listeners.Add(new TextWriterTraceListener(Console.Out));
             Debug.AutoFlush = true;
 
-            TestOne(typeof(CacheLinqTest), "TestExcept");
+            //TestOne(typeof(CacheLinqTest), "TestExcept");
 
-            //TestAll(typeof (CacheQueriesCodeConfigurationTest));
+            TestAll(typeof (TaskAdapterTest));
             //TestAllInAssembly();
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core/Cluster/IClusterGroup.cs
----------------------------------------------------------------------
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core/Cluster/IClusterGroup.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core/Cluster/IClusterGroup.cs
index 4c2df73..bb9adbf 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Cluster/IClusterGroup.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Cluster/IClusterGroup.cs
@@ -180,6 +180,12 @@ namespace Apache.Ignite.Core.Cluster
         IClusterGroup ForDotNet();
 
         /// <summary>
+        /// Creates a cluster group of nodes started in server mode (<see 
cref="IgniteConfiguration.ClientMode"/>).
+        /// </summary>
+        /// <returns>Cluster group of nodes started in server mode.</returns>
+        IClusterGroup ForServers();
+
+        /// <summary>
         /// Gets read-only collections of nodes in this projection.
         /// </summary>
         /// <returns>All nodes in this projection.</returns>

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs
----------------------------------------------------------------------
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs
index e6c0005..95497f3 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs
@@ -312,6 +312,12 @@ namespace Apache.Ignite.Core.Impl.Cluster
         }
 
         /** <inheritDoc /> */
+        public IClusterGroup ForServers()
+        {
+            return GetClusterGroup(UU.ProjectionForServers(Target));
+        }
+
+        /** <inheritDoc /> */
         public IClusterGroup ForDotNet()
         {
             return ForAttribute(AttrPlatform, Platform);

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs
index 0706966..5e2a5d7 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs
@@ -201,7 +201,7 @@ namespace Apache.Ignite.Core.Impl
         /** <inheritdoc /> */
         public ICompute GetCompute()
         {
-            return _prj.GetCompute();
+            return _prj.ForServers().GetCompute();
         }
 
         /** <inheritdoc /> */
@@ -305,6 +305,12 @@ namespace Apache.Ignite.Core.Impl
         }
 
         /** <inheritdoc /> */
+        public IClusterGroup ForServers()
+        {
+            return _prj.ForServers();
+        }
+
+        /** <inheritdoc /> */
         public ICollection<IClusterNode> GetNodes()
         {
             return _prj.GetNodes();
@@ -536,7 +542,7 @@ namespace Apache.Ignite.Core.Impl
         /** <inheritdoc /> */
         public IServices GetServices()
         {
-            return _prj.GetServices();
+            return _prj.ForServers().GetServices();
         }
 
         /** <inheritdoc /> */

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteProxy.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteProxy.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteProxy.cs
index 0ad056a..957018e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteProxy.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IgniteProxy.cs
@@ -190,6 +190,12 @@ namespace Apache.Ignite.Core.Impl
         }
 
         /** <inheritdoc /> */
+        public IClusterGroup ForServers()
+        {
+            return _ignite.GetCluster().ForServers();
+        }
+
+        /** <inheritdoc /> */
         public ICollection<IClusterNode> GetNodes()
         {
             return _ignite.GetCluster().GetNodes();

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/IgniteJniNativeMethods.cs
----------------------------------------------------------------------
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/IgniteJniNativeMethods.cs
 
b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/IgniteJniNativeMethods.cs
index bb26382..4619080 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/IgniteJniNativeMethods.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/IgniteJniNativeMethods.cs
@@ -273,6 +273,9 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
         [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = 
"IgniteProjectionForYoungest")]
         public static extern void* ProjectionForYoungest(void* ctx, void* obj);
 
+        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = 
"IgniteProjectionForServers")]
+        public static extern void* ProjectionForServers(void* ctx, void* obj);
+
         [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = 
"IgniteProjectionResetMetrics")]
         public static extern void ProjectionResetMetrics(void* ctx, void* obj);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/277480c2/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs
----------------------------------------------------------------------
diff --git 
a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs 
b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs
index a0abfaa..924259c 100644
--- 
a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs
+++ 
b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs
@@ -693,6 +693,13 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
             return target.ChangeTarget(res);
         }
         
+        internal static IUnmanagedTarget ProjectionForServers(IUnmanagedTarget 
target)
+        {
+            void* res = JNI.ProjectionForServers(target.Context, 
target.Target);
+
+            return target.ChangeTarget(res);
+        }
+        
         internal static void ProjectionResetMetrics(IUnmanagedTarget target)
         {
             JNI.ProjectionResetMetrics(target.Context, target.Target);

Reply via email to