You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by yz...@apache.org on 2017/07/28 12:07:13 UTC

[01/50] [abbrv] ignite git commit: Merge remote-tracking branch 'remotes/community/ignite-2.1.3'

Repository: ignite
Updated Branches:
  refs/heads/ignite-5658 9936dd850 -> 55f51b54f


Merge remote-tracking branch 'remotes/community/ignite-2.1.3'


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

Branch: refs/heads/ignite-5658
Commit: e5f2d90c6db491ea03b2f76230a1467bc93e35df
Parents: b3bce81 0d6b730
Author: sboikov <sb...@gridgain.com>
Authored: Wed Jul 19 12:08:37 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Wed Jul 19 12:08:37 2017 +0300

----------------------------------------------------------------------
 .../internal/managers/communication/GridIoMessageFactory.java    | 2 +-
 .../wal/record/delta/MetaPageUpdatePartitionDataRecord.java      | 2 ++
 .../processors/cache/persistence/GridCacheOffheapManager.java    | 2 +-
 .../java/org/apache/ignite/internal/GridVersionSelfTest.java     | 2 ++
 .../internal/IgniteUpdateNotifierPerClusterSettingSelfTest.java  | 2 ++
 .../cache/distributed/GridCacheAbstractNodeRestartSelfTest.java  | 2 +-
 .../GridCachePartitionEvictionDuringReadThroughSelfTest.java     | 1 +
 .../replicated/GridCacheReplicatedNodeRestartSelfTest.java       | 2 +-
 .../ignite/internal/processors/database/BPlusTreeSelfTest.java   | 4 +++-
 .../internal/processors/database/FreeListImplSelfTest.java       | 4 +++-
 .../apache/ignite/yardstick/cache/IgnitePutTxLoadBenchmark.java  | 3 +--
 11 files changed, 18 insertions(+), 8 deletions(-)
----------------------------------------------------------------------



[41/50] [abbrv] ignite git commit: Added docker file for 2.1 version.

Posted by yz...@apache.org.
Added docker file for 2.1 version.

Signed-off-by: nikolay_tikhonov <nt...@gridgain.com>


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

Branch: refs/heads/ignite-5658
Commit: 7a6af69563bfdb9dd7043c94c82a60b8e260d595
Parents: e9a0d69
Author: nikolay_tikhonov <nt...@gridgain.com>
Authored: Thu Jul 27 18:26:29 2017 +0300
Committer: nikolay_tikhonov <nt...@gridgain.com>
Committed: Thu Jul 27 18:26:29 2017 +0300

----------------------------------------------------------------------
 modules/docker/2.1.0/Dockerfile | 46 ++++++++++++++++++++++++++++++++
 modules/docker/2.1.0/run.sh     | 51 ++++++++++++++++++++++++++++++++++++
 modules/docker/Dockerfile       |  2 +-
 3 files changed, 98 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/7a6af695/modules/docker/2.1.0/Dockerfile
----------------------------------------------------------------------
diff --git a/modules/docker/2.1.0/Dockerfile b/modules/docker/2.1.0/Dockerfile
new file mode 100644
index 0000000..6a0eecd
--- /dev/null
+++ b/modules/docker/2.1.0/Dockerfile
@@ -0,0 +1,46 @@
+#
+# 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.
+#
+
+# Start from a Java image.
+FROM java:8
+
+# Ignite version
+ENV IGNITE_VERSION 2.1.0
+
+# Ignite home
+ENV IGNITE_HOME /opt/ignite/apache-ignite-fabric-${IGNITE_VERSION}-bin
+
+# Do not rely on anything provided by base image(s), but be explicit, if they are installed already it is noop then
+RUN apt-get update && apt-get install -y --no-install-recommends \
+        unzip \
+        curl \
+    && rm -rf /var/lib/apt/lists/*
+
+WORKDIR /opt/ignite
+
+RUN curl https://dist.apache.org/repos/dist/release/ignite/${IGNITE_VERSION}/apache-ignite-fabric-${IGNITE_VERSION}-bin.zip -o ignite.zip \
+    && unzip ignite.zip \
+    && rm ignite.zip
+
+# Copy sh files and set permission
+COPY ./run.sh $IGNITE_HOME/
+
+RUN chmod +x $IGNITE_HOME/run.sh
+
+CMD $IGNITE_HOME/run.sh
+
+EXPOSE 11211 47100 47500 49112
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/7a6af695/modules/docker/2.1.0/run.sh
----------------------------------------------------------------------
diff --git a/modules/docker/2.1.0/run.sh b/modules/docker/2.1.0/run.sh
new file mode 100644
index 0000000..3aafc30
--- /dev/null
+++ b/modules/docker/2.1.0/run.sh
@@ -0,0 +1,51 @@
+#!/bin/bash
+#
+# 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.
+#
+
+if [ ! -z "$OPTION_LIBS" ]; then
+  IFS=, LIBS_LIST=("$OPTION_LIBS")
+
+  for lib in ${LIBS_LIST[@]}; do
+    cp -r $IGNITE_HOME/libs/optional/"$lib"/* \
+        $IGNITE_HOME/libs/
+  done
+fi
+
+if [ ! -z "$EXTERNAL_LIBS" ]; then
+  IFS=, LIBS_LIST=("$EXTERNAL_LIBS")
+
+  for lib in ${LIBS_LIST[@]}; do
+    echo $lib >> temp
+  done
+
+  wget -i temp -P $IGNITE_HOME/libs
+
+  rm temp
+fi
+
+QUIET=""
+
+if [ "$IGNITE_QUIET" = "false" ]; then
+  QUIET="-v"
+fi
+
+if [ -z $CONFIG_URI ]; then
+  $IGNITE_HOME/bin/ignite.sh $QUIET
+else
+  $IGNITE_HOME/bin/ignite.sh $QUIET $CONFIG_URI
+fi
+

http://git-wip-us.apache.org/repos/asf/ignite/blob/7a6af695/modules/docker/Dockerfile
----------------------------------------------------------------------
diff --git a/modules/docker/Dockerfile b/modules/docker/Dockerfile
index 2292981..6a0eecd 100644
--- a/modules/docker/Dockerfile
+++ b/modules/docker/Dockerfile
@@ -19,7 +19,7 @@
 FROM java:8
 
 # Ignite version
-ENV IGNITE_VERSION 2.0.0
+ENV IGNITE_VERSION 2.1.0
 
 # Ignite home
 ENV IGNITE_HOME /opt/ignite/apache-ignite-fabric-${IGNITE_VERSION}-bin


[23/50] [abbrv] ignite git commit: ignite-5805 Fixed some lgtm.com analysis alerts

Posted by yz...@apache.org.
ignite-5805 Fixed some lgtm.com analysis alerts


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

Branch: refs/heads/ignite-5658
Commit: 301943361bd29c9c33b7ba15e9567a0e05bf27e2
Parents: 24e4d5d
Author: sboikov <sb...@gridgain.com>
Authored: Mon Jul 24 23:46:57 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Mon Jul 24 23:46:57 2017 +0300

----------------------------------------------------------------------
 .../configuration/CacheConfiguration.java       |  5 --
 .../ignite/internal/MarshallerContextImpl.java  |  4 +-
 .../affinity/GridAffinityProcessor.java         |  2 +-
 .../cache/CacheAffinitySharedManager.java       |  8 +--
 .../binary/CacheObjectBinaryProcessorImpl.java  |  5 --
 .../dht/GridClientPartitionTopology.java        | 11 ++--
 .../cache/distributed/dht/GridDhtGetFuture.java | 14 ++---
 .../dht/atomic/GridDhtAtomicCache.java          |  2 +-
 .../cache/local/GridLocalLockFuture.java        |  5 --
 .../freelist/io/PagesListMetaIO.java            |  2 +-
 .../cache/transactions/IgniteTxHandler.java     | 66 ++++++++++----------
 .../cache/transactions/IgniteTxManager.java     |  2 +-
 .../processors/igfs/IgfsDataManager.java        |  2 +-
 .../string/GridRedisIncrDecrCommandHandler.java |  2 +-
 .../ignite/internal/util/IgniteUtils.java       | 16 ++---
 .../ignite/internal/util/nio/GridNioServer.java | 14 +++--
 .../cache/VisorCacheMetricsCollectorTask.java   |  2 +-
 .../communication/tcp/TcpCommunicationSpi.java  | 25 ++++++--
 .../ignite/spi/discovery/tcp/ServerImpl.java    |  2 +-
 .../spi/failover/always/AlwaysFailoverSpi.java  |  2 +-
 .../apache/ignite/mesos/ClusterProperties.java  |  4 +-
 .../cache/websession/WebSessionFilter.java      |  2 +-
 22 files changed, 100 insertions(+), 97 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
index 670046f..708913a 100644
--- a/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
+++ b/modules/core/src/main/java/org/apache/ignite/configuration/CacheConfiguration.java
@@ -2075,11 +2075,6 @@ public class CacheConfiguration<K, V> extends MutableConfiguration<K, V> {
                 txtIdx.setName(idxEntry.getKey());
             }
             else {
-                Collection<String> grp = new ArrayList<>();
-
-                for (String fieldName : idx.fields())
-                    grp.add(idx.descending(fieldName) ? fieldName + " desc" : fieldName);
-
                 QueryIndex sortedIdx = new QueryIndex();
 
                 sortedIdx.setIndexType(idx.type());

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
index 6f15507..bb93354 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/MarshallerContextImpl.java
@@ -197,9 +197,7 @@ public class MarshallerContextImpl implements MarshallerContext {
      * @throws IOException In case of error.
      */
     private void processResource(URL url) throws IOException {
-        try (InputStream in = url.openStream()) {
-            BufferedReader rdr = new BufferedReader(new InputStreamReader(in));
-
+        try (BufferedReader rdr = new BufferedReader(new InputStreamReader(url.openStream()))) {
             String line;
 
             while ((line = rdr.readLine()) != null) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityProcessor.java
index b2989d3..4ee0502 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityProcessor.java
@@ -471,7 +471,7 @@ public class GridAffinityProcessor extends GridProcessorAdapter {
                     continue;
                 }
 
-                affMap.remove(cacheName, fut0);
+                affMap.remove(key, fut0);
 
                 fut0.onDone(new IgniteCheckedException("Failed to get affinity mapping from node: " + n, e));
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
index f519b4e..0f46a90 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
@@ -762,7 +762,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
         Set<Integer> gprs = new HashSet<>();
 
         for (ExchangeActions.CacheActionData action : exchActions.cacheStartRequests()) {
-            Integer grpId = action.descriptor().groupId();
+            int grpId = action.descriptor().groupId();
 
             if (gprs.add(grpId)) {
                 if (crd)
@@ -1109,7 +1109,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
         if (grpDesc.config().getCacheMode() == LOCAL)
             return;
 
-        Integer grpId = grpDesc.groupId();
+        int grpId = grpDesc.groupId();
 
         CacheGroupHolder grpHolder = grpHolders.get(grpId);
 
@@ -1360,7 +1360,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
         for (int i = 0; i < fetchFuts.size(); i++) {
             GridDhtAssignmentFetchFuture fetchFut = fetchFuts.get(i);
 
-            Integer grpId = fetchFut.groupId();
+            int grpId = fetchFut.groupId();
 
             fetchAffinity(fut.topologyVersion(),
                 fut.discoveryEvent(),
@@ -1472,7 +1472,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
                     return;
 
                 // Need initialize holders and affinity if this node became coordinator during this exchange.
-                final Integer grpId = desc.groupId();
+                int grpId = desc.groupId();
 
                 CacheGroupContext grp = cctx.cache().cacheGroup(grpId);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java
index c0f3515..6a1b6dc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/binary/CacheObjectBinaryProcessorImpl.java
@@ -541,11 +541,6 @@ public class CacheObjectBinaryProcessorImpl extends IgniteCacheObjectProcessorIm
     @Override public Map<Integer, BinaryType> metadata(Collection<Integer> typeIds)
         throws BinaryObjectException {
         try {
-            Collection<BinaryMetadataKey> keys = new ArrayList<>(typeIds.size());
-
-            for (Integer typeId : typeIds)
-                keys.add(new BinaryMetadataKey(typeId));
-
             Map<Integer, BinaryType> res = U.newHashMap(metadataLocCache.size());
 
             for (Map.Entry<Integer, BinaryMetadataHolder> e : metadataLocCache.entrySet())

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
index 232ce38..b5b193b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
@@ -70,9 +70,6 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
     /** Flag to control amount of output for full map. */
     private static final boolean FULL_MAP_DEBUG = false;
 
-    /** */
-    private static final Long ZERO = 0L;
-
     /** Cache shared context. */
     private GridCacheSharedContext cctx;
 
@@ -1041,8 +1038,12 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
                 Map<Integer, T2<Long, Long>> res = U.newHashMap(cntrMap.size());
 
                 for (Map.Entry<Integer, T2<Long, Long>> e : cntrMap.entrySet()) {
-                    if (!e.getValue().equals(ZERO))
-                        res.put(e.getKey(), e.getValue());
+                    T2<Long, Long> val = e.getValue();
+
+                    if (val.get1() == 0L && val.get2() == 0L)
+                        continue;
+
+                    res.put(e.getKey(), e.getValue());
                 }
 
                 return res;

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
index 0ea48e3..8430f84 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtGetFuture.java
@@ -181,13 +181,13 @@ public final class GridDhtGetFuture<K, V> extends GridCompoundIdentityFuture<Col
             }
 
             fut.listen(new CI1<IgniteInternalFuture<Object>>() {
-            @Override public void apply(IgniteInternalFuture<Object> fut) {
-                try {
-                    fut.get();
-                }
-                catch (IgniteCheckedException e) {
-                    if (log.isDebugEnabled())
-                        log.debug("Failed to request keys from preloader [keys=" + keys + ", err=" + e + ']');
+                @Override public void apply(IgniteInternalFuture<Object> fut) {
+                    try {
+                        fut.get();
+                    }
+                    catch (IgniteCheckedException e) {
+                        if (log.isDebugEnabled())
+                            log.debug("Failed to request keys from preloader [keys=" + keys + ", err=" + e + ']');
 
                         onDone(e);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
index e67dabf..712babd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
@@ -3493,7 +3493,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
         assert futIds != null && futIds.size() > 0 : futIds;
 
         for (int i = 0; i < futIds.size(); i++) {
-            Long id = futIds.get(i);
+            long id = futIds.get(i);
 
             GridDhtAtomicAbstractUpdateFuture updateFut = (GridDhtAtomicAbstractUpdateFuture)ctx.mvcc().atomicFuture(id);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalLockFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalLockFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalLockFuture.java
index e2311b8..0197acf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalLockFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/GridLocalLockFuture.java
@@ -448,11 +448,6 @@ public final class GridLocalLockFuture<K, V> extends GridCacheFutureAdapter<Bool
     }
 
     /** {@inheritDoc} */
-    @Override public int hashCode() {
-        return futId.hashCode();
-    }
-
-    /** {@inheritDoc} */
     @Override public String toString() {
         return S.toString(GridLocalLockFuture.class, this);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/io/PagesListMetaIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/io/PagesListMetaIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/io/PagesListMetaIO.java
index 41e1bb5..1490a5c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/io/PagesListMetaIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/freelist/io/PagesListMetaIO.java
@@ -151,7 +151,7 @@ public class PagesListMetaIO extends PageIO {
         int off = offset(0);
 
         for (int i = 0; i < cnt; i++) {
-            Integer bucket = (int)PageUtils.getShort(pageAddr, off);
+            int bucket = (int)PageUtils.getShort(pageAddr, off);
             assert bucket >= 0 && bucket <= Short.MAX_VALUE : bucket;
 
             long tailId = PageUtils.getLong(pageAddr, off + 2);

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
index c473bfe..34a9fc1 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
@@ -1502,39 +1502,39 @@ public class IgniteTxHandler {
                                 entry.op() == TRANSFORM &&
                                 entry.oldValueOnPrimary() &&
                                 !entry.hasValue()) {
-                                while (true) {
-                                    try {
-                                        GridCacheEntryEx cached = entry.cached();
-
-                                        if (cached == null) {
-                                            cached = cacheCtx.cache().entryEx(entry.key(), req.topologyVersion());
-
-                                            entry.cached(cached);
-                                        }
-
-                                        CacheObject val = cached.innerGet(
-                                            /*ver*/null,
-                                            tx,
-                                            /*readThrough*/false,
-                                            /*updateMetrics*/false,
-                                            /*evt*/false,
-                                            tx.subjectId(),
-                                            /*transformClo*/null,
-                                            tx.resolveTaskName(),
-                                            /*expiryPlc*/null,
-                                            /*keepBinary*/true);
-
-                                        if (val == null)
-                                            val = cacheCtx.toCacheObject(cacheCtx.store().load(null, entry.key()));
-
-                                        if (val != null)
-                                            entry.readValue(val);
-
-                                    break;
-                                }
-                                catch (GridCacheEntryRemovedException ignored) {
-                                    if (log.isDebugEnabled())
-                                        log.debug("Got entry removed exception, will retry: " + entry.txKey());
+                                    while (true) {
+                                        try {
+                                            GridCacheEntryEx cached = entry.cached();
+
+                                            if (cached == null) {
+                                                cached = cacheCtx.cache().entryEx(entry.key(), req.topologyVersion());
+
+                                                entry.cached(cached);
+                                            }
+
+                                            CacheObject val = cached.innerGet(
+                                                /*ver*/null,
+                                                tx,
+                                                /*readThrough*/false,
+                                                /*updateMetrics*/false,
+                                                /*evt*/false,
+                                                tx.subjectId(),
+                                                /*transformClo*/null,
+                                                tx.resolveTaskName(),
+                                                /*expiryPlc*/null,
+                                                /*keepBinary*/true);
+
+                                            if (val == null)
+                                                val = cacheCtx.toCacheObject(cacheCtx.store().load(null, entry.key()));
+
+                                            if (val != null)
+                                                entry.readValue(val);
+
+                                        break;
+                                    }
+                                    catch (GridCacheEntryRemovedException ignored) {
+                                        if (log.isDebugEnabled())
+                                            log.debug("Got entry removed exception, will retry: " + entry.txKey());
 
                                         entry.cached(cacheCtx.cache().entryEx(entry.key(), req.topologyVersion()));
                                     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java
index 26a4a91..e4e0061 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxManager.java
@@ -2159,7 +2159,7 @@ public class IgniteTxManager extends GridCacheSharedManagerAdapter {
                         }
                     }
                     // Special case for optimal sequence of nodes processing.
-                    else if (nearTxLoc && requestedKeys != null && requestedKeys.contains(txKey.key())) {
+                    else if (nearTxLoc && requestedKeys != null && requestedKeys.contains(txKey)) {
                         TxLock txLock = new TxLock(
                             tx.nearXidVersion(),
                             tx.nodeId(),

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsDataManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsDataManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsDataManager.java
index 4243074..e73fa6c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsDataManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsDataManager.java
@@ -202,7 +202,7 @@ public class IgfsDataManager extends IgfsManager {
         grpSize = mapper instanceof IgfsGroupDataBlocksKeyMapper ?
             ((IgfsGroupDataBlocksKeyMapper)mapper).getGroupSize() : 1;
 
-        grpBlockSize = igfsCtx.configuration().getBlockSize() * grpSize;
+        grpBlockSize = igfsCtx.configuration().getBlockSize() * (long)grpSize;
 
         assert grpBlockSize != 0;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/redis/string/GridRedisIncrDecrCommandHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/redis/string/GridRedisIncrDecrCommandHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/redis/string/GridRedisIncrDecrCommandHandler.java
index a57b82e..99453aa 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/redis/string/GridRedisIncrDecrCommandHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/rest/handlers/redis/string/GridRedisIncrDecrCommandHandler.java
@@ -93,7 +93,7 @@ public class GridRedisIncrDecrCommandHandler extends GridRedisRestCommandHandler
             restReq.initial(0L);
         else {
             if (getResp.getResponse() instanceof String) {
-                Long init;
+                long init;
 
                 try {
                     init = Long.parseLong((String)getResp.getResponse());

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
index 54ffe41..acfd914 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteUtils.java
@@ -3380,18 +3380,18 @@ public abstract class IgniteUtils {
      * @throws IOException If error occurred.
      */
     public static String readFileToString(String fileName, String charset) throws IOException {
-        Reader input = new InputStreamReader(new FileInputStream(fileName), charset);
+        try (Reader input = new InputStreamReader(new FileInputStream(fileName), charset)) {
+            StringWriter output = new StringWriter();
 
-        StringWriter output = new StringWriter();
+            char[] buf = new char[4096];
 
-        char[] buf = new char[4096];
+            int n;
 
-        int n;
+            while ((n = input.read(buf)) != -1)
+                output.write(buf, 0, n);
 
-        while ((n = input.read(buf)) != -1)
-            output.write(buf, 0, n);
-
-        return output.toString();
+            return output.toString();
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
index ce7e7f3..3b8b22c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/nio/GridNioServer.java
@@ -2129,14 +2129,16 @@ public class GridNioServer<T> {
 
                     int cnt = 0;
 
-                for (SessionWriteRequest req : ses.writeQueue()) {
-                    Object msg = req.message();
+                    for (SessionWriteRequest req : ses.writeQueue()) {
+                        Object msg = req.message();
 
                         if (shortInfo && msg instanceof GridIoMessage)
-                            msg = ((GridIoMessage)msg).message().getClass().getSimpleName();if (cnt == 0)
-                        sb.append(",\n opQueue=[").append(msg);
-                    else
-                        sb.append(',').append(msg);
+                            msg = ((GridIoMessage)msg).message().getClass().getSimpleName();
+
+                        if (cnt == 0)
+                            sb.append(",\n opQueue=[").append(msg);
+                        else
+                            sb.append(',').append(msg);
 
                         if (++cnt == 5) {
                             sb.append(']');

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
index 5cc8154..8ce3c8c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheMetricsCollectorTask.java
@@ -94,7 +94,7 @@ public class VisorCacheMetricsCollectorTask extends VisorMultiNodeTask<VisorCach
         @Override protected Collection<VisorCacheMetrics> run(final VisorCacheMetricsCollectorTaskArg arg) {
             assert arg != null;
 
-            Boolean showSysCaches = arg.isShowSystemCaches();
+            boolean showSysCaches = arg.isShowSystemCaches();
 
             Collection<String> cacheNames = arg.getCacheNames();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
index 5b952e8..1b00b5d 100755
--- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
@@ -3260,14 +3260,17 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter implements Communicati
                     "operating system firewall is disabled on local and remote hosts) " +
                     "[addrs=" + addrs + ']');
 
-            if (enableForcibleNodeKill) {if (getSpiContext().node(node.id()) != null && (CU.clientNode(node) || !CU.clientNode(getLocalNode())) &&
-                X.hasCause(errs, ConnectException.class,HandshakeException.class, SocketTimeoutException.class, HandshakeTimeoutException.class,
-                    IgniteSpiOperationTimeoutException.class)) {String msg = "TcpCommunicationSpi failed to establish connection to node, node will be dropped from " +
+            if (enableForcibleNodeKill) {
+                if (getSpiContext().node(node.id()) != null
+                    && (CU.clientNode(node) ||  !CU.clientNode(getLocalNode())) &&
+                    connectionError(errs)) {
+                    String msg = "TcpCommunicationSpi failed to establish connection to node, node will be dropped from " +
                         "cluster [" + "rmtNode=" + node + ']';
 
-                if(enableTroubleshootingLog)U.error(log, msg, errs);
+                    if (enableTroubleshootingLog)
+                        U.error(log, msg, errs);
                     else
-                    U.warn(log, msg);
+                        U.warn(log, msg);
 
                     getSpiContext().failNode(node.id(), "TcpCommunicationSpi failed to establish connection to node [" +
                         "rmtNode=" + node +
@@ -3284,6 +3287,18 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter implements Communicati
     }
 
     /**
+     * @param errs Error.
+     * @return {@code True} if error was caused by some connection IO error.
+     */
+    private static boolean connectionError(IgniteCheckedException errs) {
+        return X.hasCause(errs, ConnectException.class,
+            HandshakeException.class,
+            SocketTimeoutException.class,
+            HandshakeTimeoutException.class,
+            IgniteSpiOperationTimeoutException.class);
+    }
+
+    /**
      * Performs handshake in timeout-safe way.
      *
      * @param client Client.

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
index d621fb3..e098787 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/discovery/tcp/ServerImpl.java
@@ -6249,7 +6249,7 @@ class ServerImpl extends TcpDiscoveryImpl {
             else {
                 spi.stats.onMessageProcessingStarted(msg);
 
-                Integer res;
+                int res;
 
                 SocketAddress rmtAddr = sock.getRemoteSocketAddress();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/core/src/main/java/org/apache/ignite/spi/failover/always/AlwaysFailoverSpi.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/failover/always/AlwaysFailoverSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/failover/always/AlwaysFailoverSpi.java
index 468a627..f074119 100644
--- a/modules/core/src/main/java/org/apache/ignite/spi/failover/always/AlwaysFailoverSpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/failover/always/AlwaysFailoverSpi.java
@@ -237,7 +237,7 @@ public class AlwaysFailoverSpi extends IgniteSpiAdapter implements FailoverSpi {
         if (failedNodes == null)
             failedNodes = U.newHashSet(1);
 
-        Integer failoverCnt = failedNodes.size();
+        int failoverCnt = failedNodes.size();
 
         if (failoverCnt >= maxFailoverAttempts) {
             U.warn(log, "Job failover failed because number of maximum failover attempts is exceeded [failedJob=" +

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/mesos/src/main/java/org/apache/ignite/mesos/ClusterProperties.java
----------------------------------------------------------------------
diff --git a/modules/mesos/src/main/java/org/apache/ignite/mesos/ClusterProperties.java b/modules/mesos/src/main/java/org/apache/ignite/mesos/ClusterProperties.java
index 3c8f396..3e66cc6 100644
--- a/modules/mesos/src/main/java/org/apache/ignite/mesos/ClusterProperties.java
+++ b/modules/mesos/src/main/java/org/apache/ignite/mesos/ClusterProperties.java
@@ -478,7 +478,9 @@ public class ClusterProperties {
             if (cfg != null) {
                 props = new Properties();
 
-                props.load(new FileInputStream(cfg));
+                try (FileInputStream in = new FileInputStream(cfg)) {
+                    props.load(in);
+                }
             }
 
             ClusterProperties prop = new ClusterProperties();

http://git-wip-us.apache.org/repos/asf/ignite/blob/30194336/modules/web/src/main/java/org/apache/ignite/cache/websession/WebSessionFilter.java
----------------------------------------------------------------------
diff --git a/modules/web/src/main/java/org/apache/ignite/cache/websession/WebSessionFilter.java b/modules/web/src/main/java/org/apache/ignite/cache/websession/WebSessionFilter.java
index 0644c0f..6cbf575 100644
--- a/modules/web/src/main/java/org/apache/ignite/cache/websession/WebSessionFilter.java
+++ b/modules/web/src/main/java/org/apache/ignite/cache/websession/WebSessionFilter.java
@@ -740,7 +740,7 @@ public class WebSessionFilter implements Filter {
     private <T> IgniteCache<String, T> cacheWithExpiryPolicy(final int maxInactiveInteval,
         final IgniteCache<String, T> cache) {
         if (maxInactiveInteval > 0) {
-            long ttl = maxInactiveInteval * 1000;
+            long ttl = maxInactiveInteval * 1000L;
 
             ExpiryPolicy plc = new ModifiedExpiryPolicy(new Duration(MILLISECONDS, ttl));
 


[37/50] [abbrv] ignite git commit: Removed unused methods from IgniteThreadPoolExecutor.

Posted by yz...@apache.org.
Removed unused methods from IgniteThreadPoolExecutor.


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

Branch: refs/heads/ignite-5658
Commit: 2574bebde0fc5591bc09e2241f1352e1f0e9cbca
Parents: 5704e39
Author: sboikov <sb...@gridgain.com>
Authored: Thu Jul 27 13:21:14 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Jul 27 13:21:14 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/internal/IgnitionEx.java  |   3 +-
 .../internal/processors/igfs/IgfsImpl.java      |   2 +-
 .../ignite/thread/IgniteThreadPoolExecutor.java | 144 +------------------
 .../loadtests/colocation/GridTestMain.java      |  45 ------
 .../marshaller/GridMarshallerResourceBean.java  |   5 +-
 .../GridThreadPoolExecutorServiceSelfTest.java  |   7 +-
 6 files changed, 10 insertions(+), 196 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/2574bebd/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
index d219333..1139ec6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
@@ -1776,8 +1776,7 @@ public class IgnitionEx {
                 cfg.getIgfsThreadPoolSize(),
                 DFLT_THREAD_KEEP_ALIVE_TIME,
                 new LinkedBlockingQueue<Runnable>(),
-                new IgfsThreadFactory(cfg.getIgniteInstanceName(), "igfs"),
-                null /* Abort policy will be used. */);
+                new IgfsThreadFactory(cfg.getIgniteInstanceName(), "igfs"));
 
             igfsExecSvc.allowCoreThreadTimeOut(true);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/2574bebd/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
index 7eb61d1..5808e7c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/igfs/IgfsImpl.java
@@ -247,7 +247,7 @@ public final class IgfsImpl implements IgfsEx {
         }
 
         dualPool = secondaryFs != null ? new IgniteThreadPoolExecutor(4, Integer.MAX_VALUE, 5000L,
-            new SynchronousQueue<Runnable>(), new IgfsThreadFactory(cfg.getName()), null) : null;
+            new SynchronousQueue<Runnable>(), new IgfsThreadFactory(cfg.getName())) : null;
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/2574bebd/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
index 8002aaa..639ef94 100644
--- a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
+++ b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
@@ -19,150 +19,14 @@ package org.apache.ignite.thread;
 
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingDeque;
-import java.util.concurrent.RejectedExecutionHandler;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
-import org.jetbrains.annotations.Nullable;
 
 /**
  * An {@link ExecutorService} that executes submitted tasks using pooled grid threads.
  */
 public class IgniteThreadPoolExecutor extends ThreadPoolExecutor {
-    /** Default core pool size (value is {@code 100}). */
-    public static final int DFLT_CORE_POOL_SIZE = 100;
-
-    /**
-     * Creates a new service with default initial parameters.
-     * Default values are:
-     * <table class="doctable">
-     * <tr>
-     *      <th>Name</th>
-     *      <th>Default Value</th>
-     * </tr>
-     * <tr>
-     *      <td>Core Pool Size</td>
-     *      <td>{@code 100} (see {@link #DFLT_CORE_POOL_SIZE}).</td>
-     * </tr>
-     * <tr>
-     *      <td>Maximum Pool Size</td>
-     *      <td>None, is it is not used for unbounded queues.</td>
-     * </tr>
-     * <tr>
-     *      <td>Keep alive time</td>
-     *      <td>No limit (see {@link Long#MAX_VALUE}).</td>
-     * </tr>
-     * <tr>
-     *      <td>Blocking Queue (see {@link BlockingQueue}).</td>
-     *      <td>Unbounded linked blocking queue (see {@link LinkedBlockingDeque}).</td>
-     * </tr>
-     * </table>
-     */
-    public IgniteThreadPoolExecutor() {
-        this(
-            DFLT_CORE_POOL_SIZE,
-            DFLT_CORE_POOL_SIZE,
-            0,
-            new LinkedBlockingDeque<Runnable>(),
-            new IgniteThreadFactory(null),
-            null
-        );
-    }
-
-    /**
-     * Creates a new service with the given initial parameters.
-     *
-     * @param corePoolSize The number of threads to keep in the pool, even if they are idle.
-     * @param maxPoolSize The maximum number of threads to allow in the pool.
-     * @param keepAliveTime When the number of threads is greater than the core, this is the maximum time
-     *      that excess idle threads will wait for new tasks before terminating.
-     * @param workQueue The queue to use for holding tasks before they are executed. This queue will hold only
-     *      runnable tasks submitted by the {@link #execute(Runnable)} method.
-     */
-    public IgniteThreadPoolExecutor(
-        int corePoolSize,
-        int maxPoolSize,
-        long keepAliveTime,
-        BlockingQueue<Runnable> workQueue) {
-        this(
-            corePoolSize,
-            maxPoolSize,
-            keepAliveTime,
-            workQueue,
-            new IgniteThreadFactory(null),
-            null
-        );
-    }
-
-    /**
-     * Creates a new service with the given initial parameters.
-     *
-     * @param corePoolSize The number of threads to keep in the pool, even if they are idle.
-     * @param maxPoolSize The maximum number of threads to allow in the pool.
-     * @param keepAliveTime When the number of threads is greater than the core, this is the maximum time
-     *      that excess idle threads will wait for new tasks before terminating.
-     * @param workQ The queue to use for holding tasks before they are executed. This queue will hold only the
-     *      runnable tasks submitted by the {@link #execute(Runnable)} method.
-     * @param hnd Optional handler to use when execution is blocked because the thread bounds and queue
-     *      capacities are reached. If {@code null} then {@code AbortPolicy}
-     *      handler is used by default.
-     */
-    public IgniteThreadPoolExecutor(
-        int corePoolSize,
-        int maxPoolSize,
-        long keepAliveTime,
-        BlockingQueue<Runnable> workQ,
-        RejectedExecutionHandler hnd) {
-        this(
-            corePoolSize,
-            maxPoolSize,
-            keepAliveTime,
-            workQ,
-            new IgniteThreadFactory(null),
-            hnd
-        );
-    }
-
-    /**
-     * Creates a new service with default initial parameters.
-     * Default values are:
-     * <table class="doctable">
-     * <tr>
-     *      <th>Name</th>
-     *      <th>Default Value</th>
-     * </tr>
-     * <tr>
-     *      <td>Core Pool Size</td>
-     *      <td>{@code 100} (see {@link #DFLT_CORE_POOL_SIZE}).</td>
-     * </tr>
-     * <tr>
-     *      <td>Maximum Pool Size</td>
-     *      <td>None, is it is not used for unbounded queues.</td>
-     * </tr>
-     * <tr>
-     *      <td>Keep alive time</td>
-     *      <td>No limit (see {@link Long#MAX_VALUE}).</td>
-     * </tr>
-     * <tr>
-     *      <td>Blocking Queue (see {@link BlockingQueue}).</td>
-     *      <td>Unbounded linked blocking queue (see {@link LinkedBlockingDeque}).</td>
-     * </tr>
-     * </table>
-     *
-     * @param igniteInstanceName Name of the grid.
-     */
-    public IgniteThreadPoolExecutor(String igniteInstanceName) {
-        this(
-            DFLT_CORE_POOL_SIZE,
-            DFLT_CORE_POOL_SIZE,
-            0,
-            new LinkedBlockingDeque<Runnable>(),
-            new IgniteThreadFactory(igniteInstanceName),
-            null
-        );
-    }
-
     /**
      * Creates a new service with the given initial parameters.
      *
@@ -202,17 +66,13 @@ public class IgniteThreadPoolExecutor extends ThreadPoolExecutor {
      * @param workQ The queue to use for holding tasks before they are executed. This queue will hold only the
      *      runnable tasks submitted by the {@link #execute(Runnable)} method.
      * @param threadFactory Thread factory.
-     * @param hnd Optional handler to use when execution is blocked because the thread bounds and queue
-     *      capacities are reached. If {@code null} then {@code AbortPolicy}
-     *      handler is used by default.
      */
     public IgniteThreadPoolExecutor(
         int corePoolSize,
         int maxPoolSize,
         long keepAliveTime,
         BlockingQueue<Runnable> workQ,
-        ThreadFactory threadFactory,
-        @Nullable RejectedExecutionHandler hnd) {
+        ThreadFactory threadFactory) {
         super(
             corePoolSize,
             maxPoolSize,
@@ -220,7 +80,7 @@ public class IgniteThreadPoolExecutor extends ThreadPoolExecutor {
             TimeUnit.MILLISECONDS,
             workQ,
             threadFactory,
-            hnd == null ? new AbortPolicy() : hnd
+            new AbortPolicy()
         );
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/2574bebd/modules/core/src/test/java/org/apache/ignite/loadtests/colocation/GridTestMain.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/loadtests/colocation/GridTestMain.java b/modules/core/src/test/java/org/apache/ignite/loadtests/colocation/GridTestMain.java
index bf34545..aa0764e 100644
--- a/modules/core/src/test/java/org/apache/ignite/loadtests/colocation/GridTestMain.java
+++ b/modules/core/src/test/java/org/apache/ignite/loadtests/colocation/GridTestMain.java
@@ -119,51 +119,6 @@ public class GridTestMain {
     }
 
     /**
-     *
-     */
-    private static void localPoolRun() {
-        X.println("Local thread pool run...");
-
-        ExecutorService exe = new IgniteThreadPoolExecutor(400, 400, 0, new ArrayBlockingQueue<Runnable>(400) {
-            @Override public boolean offer(Runnable runnable) {
-                try {
-                    put(runnable);
-                }
-                catch (InterruptedException e) {
-                    e.printStackTrace();
-                }
-
-                return true;
-            }
-        });
-
-        long start = System.currentTimeMillis();
-
-        final IgniteCache<GridTestKey, Long> cache = G.ignite().cache("partitioned");
-
-        // Collocate computations and data.
-        for (long i = 0; i < GridTestConstants.ENTRY_COUNT; i++) {
-            final long key = i;
-
-            exe.submit(new Runnable() {
-                @Override public void run() {
-                    Long val = cache.localPeek(new GridTestKey(key), CachePeekMode.ONHEAP);
-
-                    if (val == null || val != key)
-                        throw new RuntimeException("Invalid value found [key=" + key + ", val=" + val + ']');
-                }
-            });
-
-            if (i % 10000 == 0)
-                X.println("Executed jobs: " + i);
-        }
-
-        long end = System.currentTimeMillis();
-
-        X.println("Executed " + GridTestConstants.ENTRY_COUNT + " computations in " + (end - start) + "ms.");
-    }
-
-    /**
      * Load cache from data store. Also take a look at
      * {@link GridTestCacheStore#loadAll} method.
      *

http://git-wip-us.apache.org/repos/asf/ignite/blob/2574bebd/modules/core/src/test/java/org/apache/ignite/marshaller/GridMarshallerResourceBean.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/marshaller/GridMarshallerResourceBean.java b/modules/core/src/test/java/org/apache/ignite/marshaller/GridMarshallerResourceBean.java
index a0bdf7e..0887879 100644
--- a/modules/core/src/test/java/org/apache/ignite/marshaller/GridMarshallerResourceBean.java
+++ b/modules/core/src/test/java/org/apache/ignite/marshaller/GridMarshallerResourceBean.java
@@ -21,7 +21,7 @@ import java.io.Serializable;
 import java.lang.management.ManagementFactory;
 import java.util.Collection;
 import java.util.concurrent.ExecutorService;
-import java.util.concurrent.LinkedBlockingQueue;
+import java.util.concurrent.Executors;
 import javax.management.MBeanServer;
 import org.apache.ignite.GridTestJobContext;
 import org.apache.ignite.GridTestTaskSession;
@@ -74,7 +74,7 @@ class GridMarshallerResourceBean implements Serializable {
         marshaller = new JdkMarshaller();
         mbeanSrv = ManagementFactory.getPlatformMBeanServer();
         ses = new GridTestTaskSession();
-        execSvc = new IgniteThreadPoolExecutor(1, 1, 0, new LinkedBlockingQueue<Runnable>());
+        execSvc = Executors.newSingleThreadExecutor();
         appCtx = new GenericApplicationContext();
         jobCtx = new GridTestJobContext();
         balancer = new LoadBalancer();
@@ -98,6 +98,7 @@ class GridMarshallerResourceBean implements Serializable {
     private static class LoadBalancer extends GridLoadBalancerAdapter {
         /** */
         public LoadBalancer() {
+            // No-op.
         }
 
         /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/2574bebd/modules/core/src/test/java/org/apache/ignite/thread/GridThreadPoolExecutorServiceSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/thread/GridThreadPoolExecutorServiceSelfTest.java b/modules/core/src/test/java/org/apache/ignite/thread/GridThreadPoolExecutorServiceSelfTest.java
index bad42b0..3948f6a 100644
--- a/modules/core/src/test/java/org/apache/ignite/thread/GridThreadPoolExecutorServiceSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/thread/GridThreadPoolExecutorServiceSelfTest.java
@@ -85,7 +85,7 @@ public class GridThreadPoolExecutorServiceSelfTest extends GridCommonAbstractTes
      * @throws ExecutionException If failed.
      */
     public void testGridThreadPoolExecutor() throws Exception {
-        IgniteThreadPoolExecutor exec = new IgniteThreadPoolExecutor(1, 1, 0, new LinkedBlockingQueue<Runnable>());
+        IgniteThreadPoolExecutor exec = new IgniteThreadPoolExecutor("", "", 1, 1, 0, new LinkedBlockingQueue<Runnable>());
 
         exec.submit(new InterruptingRunnable()).get();
 
@@ -101,7 +101,7 @@ public class GridThreadPoolExecutorServiceSelfTest extends GridCommonAbstractTes
      * @throws ExecutionException If failed.
      */
     public void testGridThreadPoolExecutorRejection() throws Exception {
-        IgniteThreadPoolExecutor exec = new IgniteThreadPoolExecutor(1, 1, 0, new LinkedBlockingQueue<Runnable>());
+        IgniteThreadPoolExecutor exec = new IgniteThreadPoolExecutor("", "", 1, 1, 0, new LinkedBlockingQueue<Runnable>());
 
         for (int i = 0; i < 10; i++)
             exec.submit(new TestRunnable());
@@ -141,8 +141,7 @@ public class GridThreadPoolExecutorServiceSelfTest extends GridCommonAbstractTes
                         }
                     });
                 }
-            },
-            null
+            }
         );
 
         assert exec.prestartAllCoreThreads() == THREAD_CNT;


[09/50] [abbrv] ignite git commit: IGNITE-5791 Block matrix introduction

Posted by yz...@apache.org.
IGNITE-5791 Block matrix introduction

This closes #2326


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

Branch: refs/heads/ignite-5658
Commit: 0d2b989d2be62533a36061940497a734463b5f10
Parents: db43b0c
Author: Yury Babak <yb...@gridgain.com>
Authored: Fri Jul 21 15:28:21 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Fri Jul 21 15:28:21 2017 +0300

----------------------------------------------------------------------
 .../apache/ignite/ml/math/DistanceMeasure.java  |   2 +-
 .../ignite/ml/math/EuclideanDistance.java       |   3 +-
 .../math/decompositions/EigenDecomposition.java |   2 +-
 .../apache/ignite/ml/math/impls/CacheUtils.java | 198 +++++++--
 .../ml/math/impls/matrix/AbstractMatrix.java    |   4 +-
 .../ignite/ml/math/impls/matrix/BlockEntry.java |  50 +++
 .../ml/math/impls/matrix/CacheMatrix.java       |   9 +-
 .../matrix/SparseBlockDistributedMatrix.java    | 208 +++++++++
 .../impls/matrix/SparseDistributedMatrix.java   |  26 +-
 .../storage/matrix/BaseBlockMatrixKey.java      |  41 ++
 .../impls/storage/matrix/BlockMatrixKey.java    | 144 ++++++
 .../storage/matrix/BlockMatrixStorage.java      | 435 +++++++++++++++++++
 .../vector/SparseLocalOnHeapVectorStorage.java  |   4 +-
 .../ignite/ml/math/statistics/Variance.java     |   1 +
 .../ignite/ml/math/statistics/package-info.java |  22 +
 .../org/apache/ignite/ml/math/util/MapUtil.java |   2 +-
 .../ignite/ml/math/util/package-info.java       |  22 +
 .../java/org/apache/ignite/ml/package-info.java |  22 +
 .../ml/math/MathImplDistributedTestSuite.java   |   2 +
 .../SparseDistributedBlockMatrixTest.java       | 379 ++++++++++++++++
 .../matrix/SparseDistributedMatrixTest.java     |  32 +-
 21 files changed, 1528 insertions(+), 80 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/DistanceMeasure.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/DistanceMeasure.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/DistanceMeasure.java
index 09be0c3..df235a7 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/DistanceMeasure.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/DistanceMeasure.java
@@ -34,5 +34,5 @@ public interface DistanceMeasure extends Externalizable {
      * @return the distance between the two vectors
      * @throws CardinalityException if the array lengths differ.
      */
-    double compute(Vector a, Vector b) throws CardinalityException;
+    public double compute(Vector a, Vector b) throws CardinalityException;
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/EuclideanDistance.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/EuclideanDistance.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/EuclideanDistance.java
index 5f962ce..edc11dc 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/EuclideanDistance.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/EuclideanDistance.java
@@ -30,8 +30,7 @@ public class EuclideanDistance implements DistanceMeasure {
     private static final long serialVersionUID = 1717556319784040040L;
 
     /** {@inheritDoc} */
-    @Override
-    public double compute(Vector a, Vector b)
+    @Override public double compute(Vector a, Vector b)
         throws CardinalityException {
         return MatrixUtil.localCopyOf(a).minus(b).kNorm(2.0);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java
index d0e91a5..a5c92e6 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/EigenDecomposition.java
@@ -446,7 +446,7 @@ public class EigenDecomposition implements Destroyable {
 
         // Store roots isolated by balanc and compute matrix norm
 
-        double norm = h.foldMap(Functions.PLUS, Functions.ABS, 0.0);
+        double norm = h.foldMap(Functions.PLUS, Functions.ABS, 0.0d);
 
         // Outer loop over eigenvalue index
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java
index 1bda5e6..369840b 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java
@@ -39,11 +39,16 @@ import org.apache.ignite.ml.math.KeyMapper;
 import org.apache.ignite.ml.math.ValueMapper;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.functions.IgniteConsumer;
+import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
 import org.apache.ignite.ml.math.functions.IgniteFunction;
-import org.apache.ignite.ml.math.impls.storage.matrix.SparseDistributedMatrixStorage;
+import org.apache.ignite.ml.math.impls.matrix.BlockEntry;
+import org.apache.ignite.ml.math.impls.storage.matrix.BlockMatrixKey;
+import org.apache.ignite.internal.util.typedef.internal.A;
 
 /**
  * Distribution-related misc. support.
+ *
+ * TODO: IGNITE-5102, fix sparse key filters
  */
 public class CacheUtils {
     /**
@@ -127,19 +132,38 @@ public class CacheUtils {
      * @param matrixUuid Matrix UUID.
      * @return Sum obtained using sparse logic.
      */
-    public static <K, V> double sparseSum(IgniteUuid matrixUuid) {
-        Collection<Double> subSums = fold(SparseDistributedMatrixStorage.ML_CACHE_NAME, (CacheEntry<IgniteBiTuple<Integer, IgniteUuid>, Map<Integer, Double>> ce, Double acc) -> {
-            Cache.Entry<IgniteBiTuple<Integer, IgniteUuid>, Map<Integer, Double>> entry = ce.entry();
-            if (entry.getKey().get2().equals(matrixUuid)) {
-                Map<Integer, Double> map = entry.getValue();
+    @SuppressWarnings("unchecked")
+    public static <K, V> double sparseSum(IgniteUuid matrixUuid, String cacheName) {
+        A.notNull(matrixUuid, "matrixUuid");
+        A.notNull(cacheName, "cacheName");
+
+        Collection<Double> subSums = fold(cacheName, (CacheEntry<K, V> ce, Double acc) -> {
+            V v = ce.entry().getValue();
+
+            double sum = 0.0;
 
-                double sum = sum(map.values());
+            if (v instanceof Map) {
+                Map<Integer, Double> map = (Map<Integer, Double>)v;
 
-                return acc == null ? sum : acc + sum;
+                sum = sum(map.values());
+            }
+            else if (v instanceof BlockEntry) {
+                BlockEntry be = (BlockEntry)v;
+
+                sum = be.sum();
             }
             else
-                return acc;
-        }, key -> key.get2().equals(matrixUuid));
+                throw new UnsupportedOperationException();
+
+            return acc == null ? sum : acc + sum;
+        }, key -> {
+            if (key instanceof BlockMatrixKey)
+                return ((BlockMatrixKey)key).matrixId().equals(matrixUuid);
+            else if (key instanceof IgniteBiTuple)
+                return ((IgniteBiTuple<Integer, IgniteUuid>)key).get2().equals(matrixUuid);
+            else
+                throw new UnsupportedOperationException();
+        });
 
         return sum(subSums);
     }
@@ -186,23 +210,42 @@ public class CacheUtils {
      * @param matrixUuid Matrix UUID.
      * @return Minimum value obtained using sparse logic.
      */
-    public static <K, V> double sparseMin(IgniteUuid matrixUuid) {
-        Collection<Double> mins = fold(SparseDistributedMatrixStorage.ML_CACHE_NAME, (CacheEntry<IgniteBiTuple<Integer, IgniteUuid>, Map<Integer, Double>> ce, Double acc) -> {
-            Cache.Entry<IgniteBiTuple<Integer, IgniteUuid>, Map<Integer, Double>> entry = ce.entry();
+    @SuppressWarnings("unchecked")
+    public static <K, V> double sparseMin(IgniteUuid matrixUuid, String cacheName) {
+        A.notNull(matrixUuid, "matrixUuid");
+        A.notNull(cacheName, "cacheName");
 
-            if (entry.getKey().get2().equals(matrixUuid)) {
-                Map<Integer, Double> map = entry.getValue();
+        Collection<Double> mins = fold(cacheName, (CacheEntry<K, V> ce, Double acc) -> {
+            V v = ce.entry().getValue();
 
-                double min = Collections.min(map.values());
+            double min;
 
-                if (acc == null)
-                    return min;
-                else
-                    return Math.min(acc, min);
+            if (v instanceof Map) {
+                Map<Integer, Double> map = (Map<Integer, Double>)v;
+
+                min = Collections.min(map.values());
+            }
+            else if (v instanceof BlockEntry) {
+                BlockEntry be = (BlockEntry)v;
+
+                min = be.minValue();
             }
             else
-                return acc;
-        }, key -> key.get2().equals(matrixUuid));
+                throw new UnsupportedOperationException();
+
+            if (acc == null)
+                return min;
+            else
+                return Math.min(acc, min);
+
+        }, key -> {
+            if (key instanceof BlockMatrixKey)
+                return ((BlockMatrixKey)key).matrixId().equals(matrixUuid);
+            else if (key instanceof IgniteBiTuple)
+                return ((IgniteBiTuple<Integer, IgniteUuid>)key).get2().equals(matrixUuid);
+            else
+                throw new UnsupportedOperationException();
+        });
 
         return Collections.min(mins);
     }
@@ -211,22 +254,42 @@ public class CacheUtils {
      * @param matrixUuid Matrix UUID.
      * @return Maximum value obtained using sparse logic.
      */
-    public static <K, V> double sparseMax(IgniteUuid matrixUuid) {
-        Collection<Double> maxes = fold(SparseDistributedMatrixStorage.ML_CACHE_NAME, (CacheEntry<IgniteBiTuple<Integer, IgniteUuid>, Map<Integer, Double>> ce, Double acc) -> {
-            Cache.Entry<IgniteBiTuple<Integer, IgniteUuid>, Map<Integer, Double>> entry = ce.entry();
-            if (entry.getKey().get2().equals(matrixUuid)) {
-                Map<Integer, Double> map = entry.getValue();
+    @SuppressWarnings("unchecked")
+    public static <K, V> double sparseMax(IgniteUuid matrixUuid, String cacheName) {
+        A.notNull(matrixUuid, "matrixUuid");
+        A.notNull(cacheName, "cacheName");
+
+        Collection<Double> maxes = fold(cacheName, (CacheEntry<K, V> ce, Double acc) -> {
+            V v = ce.entry().getValue();
 
-                double max = Collections.max(map.values());
+            double max;
 
-                if (acc == null)
-                    return max;
-                else
-                    return Math.max(acc, max);
+            if (v instanceof Map) {
+                Map<Integer, Double> map = (Map<Integer, Double>)v;
+
+                max = Collections.max(map.values());
+            }
+            else if (v instanceof BlockEntry) {
+                BlockEntry be = (BlockEntry)v;
+
+                max = be.maxValue();
             }
             else
-                return acc;
-        }, key -> key.get2().equals(matrixUuid));
+                throw new UnsupportedOperationException();
+
+            if (acc == null)
+                return max;
+            else
+                return Math.max(acc, max);
+
+        }, key -> {
+            if (key instanceof BlockMatrixKey)
+                return ((BlockMatrixKey)key).matrixId().equals(matrixUuid);
+            else if (key instanceof IgniteBiTuple)
+                return ((IgniteBiTuple<Integer, IgniteUuid>)key).get2().equals(matrixUuid);
+            else
+                throw new UnsupportedOperationException();
+        });
 
         return Collections.max(maxes);
     }
@@ -279,17 +342,41 @@ public class CacheUtils {
      * @param matrixUuid Matrix UUID.
      * @param mapper Mapping {@link IgniteFunction}.
      */
-    public static <K, V> void sparseMap(IgniteUuid matrixUuid, IgniteFunction<Double, Double> mapper) {
-        foreach(SparseDistributedMatrixStorage.ML_CACHE_NAME, (CacheEntry<IgniteBiTuple<Integer, IgniteUuid>, Map<Integer, Double>> ce) -> {
-            IgniteBiTuple k = ce.entry().getKey();
+    @SuppressWarnings("unchecked")
+    public static <K, V> void sparseMap(IgniteUuid matrixUuid, IgniteDoubleFunction<Double> mapper, String cacheName) {
+        A.notNull(matrixUuid, "matrixUuid");
+        A.notNull(cacheName, "cacheName");
+        A.notNull(mapper, "mapper");
+
+        foreach(cacheName, (CacheEntry<K, V> ce) -> {
+            K k = ce.entry().getKey();
+
+            V v = ce.entry().getValue();
 
-            Map<Integer, Double> v = ce.entry().getValue();
+            if (v instanceof Map) {
+                Map<Integer, Double> map = (Map<Integer, Double>)v;
 
-            for (Map.Entry<Integer, Double> e : v.entrySet())
-                e.setValue(mapper.apply(e.getValue()));
+                for (Map.Entry<Integer, Double> e : (map.entrySet()))
+                    e.setValue(mapper.apply(e.getValue()));
+
+            }
+            else if (v instanceof BlockEntry) {
+                BlockEntry be = (BlockEntry)v;
+
+                be.map(mapper);
+            }
+            else
+                throw new UnsupportedOperationException();
 
             ce.cache().put(k, v);
-        }, key -> key.get2().equals(matrixUuid));
+        }, key -> {
+            if (key instanceof BlockMatrixKey)
+                return ((BlockMatrixKey)key).matrixId().equals(matrixUuid);
+            else if (key instanceof IgniteBiTuple)
+                return ((IgniteBiTuple<Integer, IgniteUuid>)key).get2().equals(matrixUuid);
+            else
+                throw new UnsupportedOperationException();
+        });
     }
 
     /**
@@ -327,8 +414,7 @@ public class CacheUtils {
 
                 // Iterate over given partition.
                 // Query returns an empty cursor if this partition is not stored on this node.
-                for (Cache.Entry<K, V> entry : cache.query(new ScanQuery<K, V>(part,
-                    (k, v) -> affinity.mapPartitionToNode(p) == locNode && (keyFilter == null || keyFilter.apply(k)))))
+                for (Cache.Entry<K, V> entry : cache.query(new ScanQuery<K, V>(part, (k, v) -> affinity.mapPartitionToNode(p) == locNode && (keyFilter == null || keyFilter.apply(k)))))
                     fun.accept(new CacheEntry<>(entry, cache));
             }
         });
@@ -387,12 +473,34 @@ public class CacheUtils {
         });
     }
 
+    /**
+     * Distributed version of fold operation.
+     *
+     * @param cacheName Cache name.
+     * @param folder Folder.
+     * @param keyFilter Key filter.
+     * @param accumulator Accumulator.
+     * @param zeroVal Zero value.
+     */
     public static <K, V, A> A distributedFold(String cacheName, IgniteBiFunction<Cache.Entry<K, V>, A, A> folder,
         IgnitePredicate<K> keyFilter, BinaryOperator<A> accumulator, A zeroVal) {
         return sparseFold(cacheName, folder, keyFilter, accumulator, zeroVal, null, null, 0,
             false);
     }
 
+    /**
+     * Sparse version of fold. This method also applicable to sparse zeroes.
+     *
+     * @param cacheName Cache name.
+     * @param folder Folder.
+     * @param keyFilter Key filter.
+     * @param accumulator Accumulator.
+     * @param zeroVal Zero value.
+     * @param defVal Def value.
+     * @param defKey Def key.
+     * @param defValCnt Def value count.
+     * @param isNilpotent Is nilpotent.
+     */
     private static <K, V, A> A sparseFold(String cacheName, IgniteBiFunction<Cache.Entry<K, V>, A, A> folder,
         IgnitePredicate<K> keyFilter, BinaryOperator<A> accumulator, A zeroVal, V defVal, K defKey, long defValCnt,
         boolean isNilpotent) {
@@ -411,7 +519,7 @@ public class CacheUtils {
 
             // Use affinity in filter for ScanQuery. Otherwise we accept consumer in each node which is wrong.
             Affinity affinity = ignite.affinity(cacheName);
-            ClusterNode localNode = ignite.cluster().localNode();
+            ClusterNode locNode = ignite.cluster().localNode();
 
             A a = zeroVal;
 
@@ -422,7 +530,7 @@ public class CacheUtils {
                 // Iterate over given partition.
                 // Query returns an empty cursor if this partition is not stored on this node.
                 for (Cache.Entry<K, V> entry : cache.query(new ScanQuery<K, V>(part,
-                    (k, v) -> affinity.mapPartitionToNode(p) == localNode && (keyFilter == null || keyFilter.apply(k)))))
+                    (k, v) -> affinity.mapPartitionToNode(p) == locNode && (keyFilter == null || keyFilter.apply(k)))))
                     a = folder.apply(entry, a);
             }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
index d1d3904..3dc9b43 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
@@ -503,7 +503,7 @@ public abstract class AbstractMatrix implements Matrix {
 
     /** {@inheritDoc} */
     @Override public double determinant() {
-        //TODO: This decomposition should be cached
+        //TODO: IGNITE-5799, This decomposition should be cached
         LUDecomposition dec = new LUDecomposition(this);
         double res = dec.determinant();
         dec.destroy();
@@ -515,7 +515,7 @@ public abstract class AbstractMatrix implements Matrix {
         if (rowSize() != columnSize())
             throw new CardinalityException(rowSize(), columnSize());
 
-        //TODO: This decomposition should be cached
+        //TODO: IGNITE-5799, This decomposition should be cached
         LUDecomposition dec = new LUDecomposition(this);
 
         Matrix res = dec.solve(likeIdentity());

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/BlockEntry.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/BlockEntry.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/BlockEntry.java
new file mode 100644
index 0000000..47f07ce
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/BlockEntry.java
@@ -0,0 +1,50 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math.impls.matrix;
+
+import org.apache.ignite.ml.math.Matrix;
+
+/**
+ * Block for {@link SparseBlockDistributedMatrix}.
+ */
+public final class BlockEntry extends SparseLocalOnHeapMatrix {
+    /** Max block size. */
+    public static final int MAX_BLOCK_SIZE = 32;
+
+    /** */
+    public BlockEntry() {
+        // No-op.
+    }
+
+    /** */
+    public BlockEntry(int row, int col) {
+        super(row, col);
+
+        assert col <= MAX_BLOCK_SIZE;
+        assert row <= MAX_BLOCK_SIZE;
+    }
+
+    /** */
+    public BlockEntry(Matrix mtx) {
+        assert mtx.columnSize() <= MAX_BLOCK_SIZE;
+        assert mtx.rowSize() <= MAX_BLOCK_SIZE;
+
+        setStorage(mtx.getStorage());
+    }
+
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrix.java
index a7f0afc..7f00bcb 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrix.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/CacheMatrix.java
@@ -65,7 +65,6 @@ public class CacheMatrix<K, V> extends AbstractMatrix {
 
     /**
      *
-     *
      */
     @SuppressWarnings({"unchecked"})
     private CacheMatrixStorage<K, V> storage() {
@@ -93,7 +92,7 @@ public class CacheMatrix<K, V> extends AbstractMatrix {
      * @param d Value to divide to.
      */
     @Override public Matrix divide(double d) {
-        return mapOverValues((Double v) -> v / d);
+        return mapOverValues(v -> v / d);
     }
 
     /**
@@ -102,7 +101,7 @@ public class CacheMatrix<K, V> extends AbstractMatrix {
      * @param x Value to add.
      */
     @Override public Matrix plus(double x) {
-        return mapOverValues((Double v) -> v + x);
+        return mapOverValues(v -> v + x);
     }
 
     /**
@@ -111,12 +110,12 @@ public class CacheMatrix<K, V> extends AbstractMatrix {
      * @param x Value to multiply to.
      */
     @Override public Matrix times(double x) {
-        return mapOverValues((Double v) -> v * x);
+        return mapOverValues(v -> v * x);
     }
 
     /** {@inheritDoc} */
     @Override public Matrix assign(double val) {
-        return mapOverValues((Double v) -> val);
+        return mapOverValues(v -> val);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseBlockDistributedMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseBlockDistributedMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseBlockDistributedMatrix.java
new file mode 100644
index 0000000..b3481f9
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseBlockDistributedMatrix.java
@@ -0,0 +1,208 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math.impls.matrix;
+
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.cache.affinity.Affinity;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.impls.CacheUtils;
+import org.apache.ignite.ml.math.impls.storage.matrix.BlockMatrixKey;
+import org.apache.ignite.ml.math.impls.storage.matrix.BlockMatrixStorage;
+
+/**
+ * Sparse block distributed matrix. This matrix represented by blocks 32x32 {@link BlockEntry}.
+ *
+ * Using separate cache with keys {@link BlockMatrixKey} and values {@link BlockEntry}.
+ */
+public class SparseBlockDistributedMatrix extends AbstractMatrix implements StorageConstants {
+    /**
+     *
+     */
+    public SparseBlockDistributedMatrix() {
+        // No-op.
+    }
+
+    /**
+     * @param rows Amount of rows in the matrix.
+     * @param cols Amount of columns in the matrix.
+     */
+    public SparseBlockDistributedMatrix(int rows, int cols) {
+        assert rows > 0;
+        assert cols > 0;
+
+        setStorage(new BlockMatrixStorage(rows, cols));
+    }
+
+    /**
+     * Return the same matrix with updates values (broken contract).
+     *
+     * @param d Value to divide to.
+     */
+    @Override public Matrix divide(double d) {
+        return mapOverValues(v -> v / d);
+    }
+
+    /**
+     * Return the same matrix with updates values (broken contract).
+     *
+     * @param x Value to add.
+     */
+    @Override public Matrix plus(double x) {
+        return mapOverValues(v -> v + x);
+    }
+
+    /**
+     * Return the same matrix with updates values (broken contract).
+     *
+     * @param x Value to multiply.
+     */
+    @Override public Matrix times(double x) {
+        return mapOverValues(v -> v * x);
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @SuppressWarnings({"unchecked"})
+    @Override public Matrix times(final Matrix mtx) {
+        if (mtx == null)
+            throw new IllegalArgumentException("The matrix should be not null.");
+
+        if (columnSize() != mtx.rowSize())
+            throw new CardinalityException(columnSize(), mtx.rowSize());
+
+        SparseBlockDistributedMatrix matrixA = this;
+        SparseBlockDistributedMatrix matrixB = (SparseBlockDistributedMatrix)mtx;
+
+        String cacheName = BlockMatrixStorage.ML_BLOCK_CACHE_NAME;
+        SparseBlockDistributedMatrix matrixC = new SparseBlockDistributedMatrix(matrixA.rowSize(), matrixB.columnSize());
+
+        CacheUtils.bcast(BlockMatrixStorage.ML_BLOCK_CACHE_NAME, () -> {
+            Ignite ignite = Ignition.localIgnite();
+            Affinity affinity = ignite.affinity(cacheName);
+
+            IgniteCache<BlockMatrixKey, BlockEntry> cache = ignite.getOrCreateCache(cacheName);
+            ClusterNode locNode = ignite.cluster().localNode();
+
+            BlockMatrixStorage storageC = matrixC.storage();
+
+            Map<ClusterNode, Collection<BlockMatrixKey>> keysCToNodes = affinity.mapKeysToNodes(storageC.getAllKeys());
+            Collection<BlockMatrixKey> locKeys = keysCToNodes.get(locNode);
+
+            if (locKeys == null)
+                return;
+
+            // compute Cij locally on each node
+            // TODO: IGNITE:5114, exec in parallel
+            locKeys.forEach(key -> {
+                long newBlockId = key.blockId();
+                BlockEntry blockC = null;
+
+                List<BlockEntry> aRow = matrixA.storage().getRowForBlock(newBlockId, storageC);
+                List<BlockEntry> bCol = matrixB.storage().getColForBlock(newBlockId, storageC);
+
+                for (int i = 0; i < aRow.size(); i++) {
+                    BlockEntry blockA = aRow.get(i);
+                    BlockEntry blockB = bCol.get(i);
+
+                    BlockEntry tmpBlock = new BlockEntry(blockA.times(blockB));
+
+                    blockC = blockC == null ? tmpBlock : new BlockEntry(blockC.plus(tmpBlock));
+                }
+
+                cache.put(storageC.getCacheKey(newBlockId), blockC);
+            });
+        });
+
+        return matrixC;
+    }
+
+    /** {@inheritDoc} */
+    @Override public Matrix assign(double val) {
+        return mapOverValues(v -> val);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Matrix map(IgniteDoubleFunction<Double> fun) {
+        return mapOverValues(fun);
+    }
+
+    /** {@inheritDoc} */
+    @Override public double sum() {
+        return CacheUtils.sparseSum(getUUID(), BlockMatrixStorage.ML_BLOCK_CACHE_NAME);
+    }
+
+    /** {@inheritDoc} */
+    @Override public double maxValue() {
+        return CacheUtils.sparseMax(getUUID(), BlockMatrixStorage.ML_BLOCK_CACHE_NAME);
+    }
+
+    /** {@inheritDoc} */
+    @Override public double minValue() {
+        return CacheUtils.sparseMin(getUUID(), BlockMatrixStorage.ML_BLOCK_CACHE_NAME);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Matrix copy() {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Matrix like(int rows, int cols) {
+        return new SparseBlockDistributedMatrix(rows, cols);
+    }
+
+    /** {@inheritDoc} */
+    @Override public Vector likeVector(int crd) {
+        throw new UnsupportedOperationException();
+    }
+
+    /** */
+    private IgniteUuid getUUID() {
+        return ((BlockMatrixStorage)getStorage()).getUUID();
+    }
+
+    /**
+     * @param mapper Mapping function.
+     * @return Matrix with mapped values.
+     */
+    private Matrix mapOverValues(IgniteDoubleFunction<Double> mapper) {
+        CacheUtils.sparseMap(getUUID(), mapper, BlockMatrixStorage.ML_BLOCK_CACHE_NAME);
+
+        return this;
+    }
+
+    /**
+     *
+     */
+    private BlockMatrixStorage storage() {
+        return (BlockMatrixStorage)getStorage();
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
index df2ddc4..a86db95 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrix.java
@@ -23,7 +23,6 @@ import org.apache.ignite.ml.math.StorageConstants;
 import org.apache.ignite.ml.math.Vector;
 import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
 import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
-import org.apache.ignite.ml.math.functions.IgniteFunction;
 import org.apache.ignite.ml.math.impls.CacheUtils;
 import org.apache.ignite.ml.math.impls.storage.matrix.SparseDistributedMatrixStorage;
 
@@ -61,10 +60,7 @@ public class SparseDistributedMatrix extends AbstractMatrix implements StorageCo
         setStorage(new SparseDistributedMatrixStorage(rows, cols, stoMode, acsMode));
     }
 
-    /**
-     *
-     *
-     */
+    /** */
     private SparseDistributedMatrixStorage storage() {
         return (SparseDistributedMatrixStorage)getStorage();
     }
@@ -75,7 +71,7 @@ public class SparseDistributedMatrix extends AbstractMatrix implements StorageCo
      * @param d Value to divide to.
      */
     @Override public Matrix divide(double d) {
-        return mapOverValues((Double v) -> v / d);
+        return mapOverValues(v -> v / d);
     }
 
     /**
@@ -84,7 +80,7 @@ public class SparseDistributedMatrix extends AbstractMatrix implements StorageCo
      * @param x Value to add.
      */
     @Override public Matrix plus(double x) {
-        return mapOverValues((Double v) -> v + x);
+        return mapOverValues(v -> v + x);
     }
 
     /**
@@ -93,42 +89,42 @@ public class SparseDistributedMatrix extends AbstractMatrix implements StorageCo
      * @param x Value to multiply.
      */
     @Override public Matrix times(double x) {
-        return mapOverValues((Double v) -> v * x);
+        return mapOverValues(v -> v * x);
     }
 
     /** {@inheritDoc} */
     @Override public Matrix assign(double val) {
-        return mapOverValues((Double v) -> val);
+        return mapOverValues(v -> val);
     }
 
     /** {@inheritDoc} */
     @Override public Matrix map(IgniteDoubleFunction<Double> fun) {
-        return mapOverValues(fun::apply);
+        return mapOverValues(fun);
     }
 
     /**
      * @param mapper Mapping function.
      * @return Matrix with mapped values.
      */
-    private Matrix mapOverValues(IgniteFunction<Double, Double> mapper) {
-        CacheUtils.sparseMap(getUUID(), mapper);
+    private Matrix mapOverValues(IgniteDoubleFunction<Double> mapper) {
+        CacheUtils.sparseMap(getUUID(), mapper, SparseDistributedMatrixStorage.ML_CACHE_NAME);
 
         return this;
     }
 
     /** {@inheritDoc} */
     @Override public double sum() {
-        return CacheUtils.sparseSum(getUUID());
+        return CacheUtils.sparseSum(getUUID(), SparseDistributedMatrixStorage.ML_CACHE_NAME);
     }
 
     /** {@inheritDoc} */
     @Override public double maxValue() {
-        return CacheUtils.sparseMax(getUUID());
+        return CacheUtils.sparseMax(getUUID(), SparseDistributedMatrixStorage.ML_CACHE_NAME);
     }
 
     /** {@inheritDoc} */
     @Override public double minValue() {
-        return CacheUtils.sparseMin(getUUID());
+        return CacheUtils.sparseMin(getUUID(), SparseDistributedMatrixStorage.ML_CACHE_NAME);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BaseBlockMatrixKey.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BaseBlockMatrixKey.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BaseBlockMatrixKey.java
new file mode 100644
index 0000000..74ddfe5
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BaseBlockMatrixKey.java
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math.impls.storage.matrix;
+
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.ml.math.impls.matrix.SparseBlockDistributedMatrix;
+
+/**
+ * Cache key for blocks in {@link SparseBlockDistributedMatrix}.
+ */
+public interface BaseBlockMatrixKey {
+    /**
+     * @return block id.
+     */
+    public long blockId();
+
+    /**
+     * @return matrix id.
+     */
+    public IgniteUuid matrixId();
+
+    /**
+     * @return key affinity key.
+     */
+    public IgniteUuid affinityKey();
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BlockMatrixKey.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BlockMatrixKey.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BlockMatrixKey.java
new file mode 100644
index 0000000..3749f44
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BlockMatrixKey.java
@@ -0,0 +1,144 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math.impls.storage.matrix;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import org.apache.ignite.binary.BinaryObjectException;
+import org.apache.ignite.binary.BinaryRawReader;
+import org.apache.ignite.binary.BinaryRawWriter;
+import org.apache.ignite.binary.BinaryReader;
+import org.apache.ignite.binary.BinaryWriter;
+import org.apache.ignite.binary.Binarylizable;
+import org.apache.ignite.internal.binary.BinaryUtils;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.ml.math.impls.matrix.BlockEntry;
+import org.apache.ignite.ml.math.impls.matrix.SparseBlockDistributedMatrix;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ * Key implementation for {@link BlockEntry} using for {@link SparseBlockDistributedMatrix}.
+ */
+public class BlockMatrixKey implements BaseBlockMatrixKey, Externalizable, Binarylizable {
+    /** */
+    private static final long serialVersionUID = 0L;
+    /** Block ID */
+    private long blockId;
+    /** Matrix ID */
+    private IgniteUuid matrixUuid;
+    /** Block affinity key. */
+    private IgniteUuid affinityKey;
+
+    /**
+     * Empty constructor required for {@link Externalizable}.
+     */
+    public BlockMatrixKey() {
+        // No-op.
+    }
+
+    /**
+     * Construct matrix block key.
+     *
+     * @param blockId Block id.
+     * @param matrixUuid Matrix uuid.
+     * @param affinityKey Affinity key.
+     */
+    public BlockMatrixKey(long blockId, IgniteUuid matrixUuid, @Nullable IgniteUuid affinityKey) {
+        assert blockId >= 0;
+        assert matrixUuid != null;
+
+        this.blockId = blockId;
+        this.matrixUuid = matrixUuid;
+        this.affinityKey = affinityKey;
+    }
+
+    /** {@inheritDoc} */
+    @Override public long blockId() {
+        return blockId;
+    }
+
+    /** {@inheritDoc} */
+    @Override public IgniteUuid matrixId() {
+        return matrixUuid;
+    }
+
+    /** {@inheritDoc} */
+    @Override public IgniteUuid affinityKey() {
+        return affinityKey;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeExternal(ObjectOutput out) throws IOException {
+        U.writeGridUuid(out, matrixUuid);
+        U.writeGridUuid(out, affinityKey);
+        out.writeLong(blockId);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        matrixUuid = U.readGridUuid(in);
+        affinityKey = U.readGridUuid(in);
+        blockId = in.readLong();
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeBinary(BinaryWriter writer) throws BinaryObjectException {
+        BinaryRawWriter out = writer.rawWriter();
+
+        BinaryUtils.writeIgniteUuid(out, matrixUuid);
+        BinaryUtils.writeIgniteUuid(out, affinityKey);
+        out.writeLong(blockId);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void readBinary(BinaryReader reader) throws BinaryObjectException {
+        BinaryRawReader in = reader.rawReader();
+
+        matrixUuid = BinaryUtils.readIgniteUuid(in);
+        affinityKey = BinaryUtils.readIgniteUuid(in);
+        blockId = in.readLong();
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        return matrixUuid.hashCode() + (int)(blockId ^ (blockId >>> 32));
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean equals(Object obj) {
+        if (obj == this)
+            return true;
+
+        if (obj == null || obj.getClass() != getClass())
+            return false;
+
+        BlockMatrixKey that = (BlockMatrixKey)obj;
+
+        return blockId == that.blockId && matrixUuid.equals(that.matrixUuid) && F.eq(affinityKey, that.affinityKey);
+    }
+
+    /** {@inheritDoc} */
+    @Override public String toString() {
+        return S.toString(BlockMatrixKey.class, this);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BlockMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BlockMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BlockMatrixStorage.java
new file mode 100644
index 0000000..6640e5a
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/BlockMatrixStorage.java
@@ -0,0 +1,435 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math.impls.storage.matrix;
+
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.Collection;
+import java.util.LinkedList;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import java.util.stream.LongStream;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.Ignition;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.cache.CachePeekMode;
+import org.apache.ignite.cache.CacheWriteSynchronizationMode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.impls.CacheUtils;
+import org.apache.ignite.ml.math.impls.matrix.BlockEntry;
+import org.apache.ignite.ml.math.impls.matrix.SparseBlockDistributedMatrix;
+
+import static org.apache.ignite.ml.math.impls.matrix.BlockEntry.MAX_BLOCK_SIZE;
+
+/**
+ * Storage for {@link SparseBlockDistributedMatrix}.
+ */
+public class BlockMatrixStorage extends CacheUtils implements MatrixStorage, StorageConstants {
+    /** Cache name used for all instances of {@link BlockMatrixStorage}. */
+    public static final String ML_BLOCK_CACHE_NAME = "ML_BLOCK_SPARSE_MATRICES_CONTAINER";
+    /** */
+    private int blocksInCol;
+    /** */
+    private int blocksInRow;
+    /** Amount of rows in the matrix. */
+    private int rows;
+    /** Amount of columns in the matrix. */
+    private int cols;
+    /** Matrix uuid. */
+    private IgniteUuid uuid;
+    /** Block size about 8 KB of data. */
+    private int maxBlockEdge = MAX_BLOCK_SIZE;
+
+    /** Actual distributed storage. */
+    private IgniteCache<
+        BlockMatrixKey /* Matrix block number with uuid. */,
+        BlockEntry /* Block of matrix, local sparse matrix. */
+        > cache = null;
+
+    /**
+     *
+     */
+    public BlockMatrixStorage() {
+        // No-op.
+    }
+
+    /**
+     * @param rows Amount of rows in the matrix.
+     * @param cols Amount of columns in the matrix.
+     */
+    public BlockMatrixStorage(int rows, int cols) {
+        assert rows > 0;
+        assert cols > 0;
+
+        this.rows = rows;
+        this.cols = cols;
+
+        //cols % maxBlockEdge > 0 ? 1 : 0
+
+        this.blocksInRow = cols % maxBlockEdge == 0 ? cols / maxBlockEdge : cols / maxBlockEdge + 1;
+        this.blocksInCol = rows % maxBlockEdge == 0 ? rows / maxBlockEdge : rows / maxBlockEdge + 1;
+
+        cache = newCache();
+
+        uuid = IgniteUuid.randomUuid();
+    }
+
+    /**
+     *
+     */
+    public IgniteCache<BlockMatrixKey, BlockEntry> cache() {
+        return cache;
+    }
+
+    /** {@inheritDoc} */
+    @Override public double get(int x, int y) {
+        return matrixGet(x, y);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void set(int x, int y, double v) {
+        matrixSet(x, y, v);
+    }
+
+    /** {@inheritDoc} */
+    @Override public int columnSize() {
+        return cols;
+    }
+
+    /** {@inheritDoc} */
+    @Override public int rowSize() {
+        return rows;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeExternal(ObjectOutput out) throws IOException {
+        out.writeInt(rows);
+        out.writeInt(cols);
+        out.writeInt(blocksInRow);
+        out.writeInt(blocksInCol);
+        U.writeGridUuid(out, uuid);
+        out.writeUTF(cache.getName());
+    }
+
+    /** {@inheritDoc} */
+    @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+        rows = in.readInt();
+        cols = in.readInt();
+        blocksInRow = in.readInt();
+        blocksInCol = in.readInt();
+        uuid = U.readGridUuid(in);
+        cache = ignite().getOrCreateCache(in.readUTF());
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isSequentialAccess() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isDense() {
+        return false;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isRandomAccess() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isDistributed() {
+        return true;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean isArrayBased() {
+        return false;
+    }
+
+    /** Delete all data from cache. */
+    @Override public void destroy() {
+        long maxBlockId = getBlockId(cols, rows);
+
+        Set<BlockMatrixKey> keyset = LongStream.rangeClosed(0, maxBlockId).mapToObj(this::getCacheKey).collect(Collectors.toSet());
+
+        cache.clearAll(keyset);
+    }
+
+    /** {@inheritDoc} */
+    @Override public int hashCode() {
+        int res = 1;
+
+        res = res * 37 + cols;
+        res = res * 37 + rows;
+        res = res * 37 + uuid.hashCode();
+        res = res * 37 + cache.hashCode();
+
+        return res;
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+
+        if (obj == null || getClass() != obj.getClass())
+            return false;
+
+        BlockMatrixStorage that = (BlockMatrixStorage)obj;
+
+        return rows == that.rows && cols == that.cols && uuid.equals(that.uuid)
+            && (cache != null ? cache.equals(that.cache) : that.cache == null);
+    }
+
+    /**
+     * Get storage UUID.
+     *
+     * @return storage UUID.
+     */
+    public IgniteUuid getUUID() {
+        return uuid;
+    }
+
+    /**
+     * Build the cache key for the given block id
+     */
+    public BlockMatrixKey getCacheKey(long blockId) {
+        return new BlockMatrixKey(blockId, uuid, getAffinityKey(blockId));
+    }
+
+    /**
+     * Get rows for current block.
+     *
+     * @param blockId block id.
+     * @param storageC result storage.
+     * @return The list of block entries.
+     */
+    public List<BlockEntry> getRowForBlock(long blockId, BlockMatrixStorage storageC) {
+        long blockRow = blockId / storageC.blocksInCol;
+        long blockCol = blockId % storageC.blocksInRow;
+
+        long locBlock = this.blocksInRow * (blockRow) + (blockCol >= this.blocksInRow ? (blocksInRow - 1) : blockCol);
+
+        return getRowForBlock(locBlock);
+    }
+
+    /**
+     * Get cols for current block.
+     *
+     * @param blockId block id.
+     * @param storageC result storage.
+     * @return The list of block entries.
+     */
+    public List<BlockEntry> getColForBlock(long blockId, BlockMatrixStorage storageC) {
+        long blockRow = blockId / storageC.blocksInCol;
+        long blockCol = blockId % storageC.blocksInRow;
+
+        long locBlock = this.blocksInRow * (blockRow) + (blockCol >= this.blocksInRow ? (blocksInRow - 1) : blockCol);
+
+        return getColForBlock(locBlock);
+    }
+
+    /**
+     * Build a keyset for this matrix storage.
+     */
+    public Collection<BlockMatrixKey> getAllKeys() {
+        long maxBlockId = numberOfBlocks();
+        Collection<BlockMatrixKey> keys = new LinkedList<>();
+
+        for (long id = 0; id < maxBlockId; id++)
+            keys.add(getCacheKey(id));
+
+        return keys;
+    }
+
+    /** */
+    private List<BlockEntry> getRowForBlock(long blockId) {
+        List<BlockEntry> res = new LinkedList<>();
+
+        boolean isFirstRow = blockId < blocksInRow;
+
+        long startBlock = isFirstRow ? 0 : blockId - blockId % blocksInRow;
+        long endBlock = startBlock + blocksInRow - 1;
+
+        for (long i = startBlock; i <= endBlock; i++)
+            res.add(getEntryById(i));
+
+        return res;
+    }
+
+    /** */
+    private List<BlockEntry> getColForBlock(long blockId) {
+        List<BlockEntry> res = new LinkedList<>();
+
+        long startBlock = blockId % blocksInRow;
+        long endBlock = startBlock + blocksInRow * (blocksInCol - 1);
+
+        for (long i = startBlock; i <= endBlock; i += blocksInRow)
+            res.add(getEntryById(i));
+
+        return res;
+    }
+
+    /**
+     *
+     */
+    private BlockEntry getEntryById(long blockId) {
+        BlockMatrixKey key = getCacheKey(blockId);
+
+        BlockEntry entry = cache.localPeek(key);
+        entry = entry != null ? entry : cache.get(key);
+
+        if (entry == null) {
+            long colId = blockId == 0 ? 0 : blockId + 1;
+
+            boolean isLastRow = (blockId) >= blocksInRow * (blocksInCol - 1);
+            boolean isLastCol = (colId) % blocksInRow == 0;
+
+            entry = new BlockEntry(isLastRow && rows % maxBlockEdge != 0 ? rows % maxBlockEdge : maxBlockEdge, isLastCol && cols % maxBlockEdge != 0 ? cols % maxBlockEdge : maxBlockEdge);
+        }
+
+        return entry;
+    }
+
+    /**
+     *
+     */
+    private long numberOfBlocks() {
+        int rows = rowSize();
+        int cols = columnSize();
+
+        return ((rows / maxBlockEdge) + (((rows % maxBlockEdge) > 0) ? 1 : 0))
+            * ((cols / maxBlockEdge) + (((cols % maxBlockEdge) > 0) ? 1 : 0));
+    }
+
+    /**
+     * TODO: IGNITE-5646, WIP
+     *
+     * Get affinity key for the given id.
+     */
+    private IgniteUuid getAffinityKey(long id) {
+        return null;
+    }
+
+    /**
+     * Distributed matrix set.
+     *
+     * @param a Row or column index.
+     * @param b Row or column index.
+     * @param v New value to set.
+     */
+    private void matrixSet(int a, int b, double v) {
+        long id = getBlockId(a, b);
+        // Remote set on the primary node (where given row or column is stored locally).
+        ignite().compute(groupForKey(ML_BLOCK_CACHE_NAME, id)).run(() -> {
+            IgniteCache<BlockMatrixKey, BlockEntry> cache = Ignition.localIgnite().getOrCreateCache(ML_BLOCK_CACHE_NAME);
+
+            BlockMatrixKey key = getCacheKey(getBlockId(a, b));
+
+            // Local get.
+            BlockEntry block = cache.localPeek(key, CachePeekMode.PRIMARY);
+
+            if (block == null)
+                block = cache.get(key); //Remote entry get.
+
+            if (block == null)
+                block = initBlockFor(a, b);
+
+            block.set(a % block.rowSize(), b % block.columnSize(), v);
+
+            // Local put.
+            cache.put(key, block);
+        });
+    }
+
+    /** */
+    private long getBlockId(int x, int y) {
+        return (y / maxBlockEdge) * blockShift(cols) + (x / maxBlockEdge);
+    }
+
+    /** */
+    private BlockEntry initBlockFor(int x, int y) {
+        int blockRows = rows - x >= maxBlockEdge ? maxBlockEdge : rows - x;
+        int blockCols = cols - y >= maxBlockEdge ? maxBlockEdge : cols - y;
+
+        return new BlockEntry(blockRows, blockCols);
+    }
+
+    /** */
+    private int blockShift(int i) {
+        return (i) / maxBlockEdge + ((i) % maxBlockEdge > 0 ? 1 : 0);
+    }
+
+    /**
+     * Distributed matrix get.
+     *
+     * @param a Row or column index.
+     * @param b Row or column index.
+     * @return Matrix value at (a, b) index.
+     */
+    private double matrixGet(int a, int b) {
+        // Remote get from the primary node (where given row or column is stored locally).
+        return ignite().compute(groupForKey(ML_BLOCK_CACHE_NAME, getBlockId(a, b))).call(() -> {
+            IgniteCache<BlockMatrixKey, BlockEntry> cache = Ignition.localIgnite().getOrCreateCache(ML_BLOCK_CACHE_NAME);
+
+            BlockMatrixKey key = getCacheKey(getBlockId(a, b));
+
+            // Local get.
+            BlockEntry block = cache.localPeek(key, CachePeekMode.PRIMARY);
+
+            if (block == null)
+                block = cache.get(key);
+
+            return block == null ? 0.0 : block.get(a % block.rowSize(), b % block.columnSize());
+        });
+    }
+
+    /**
+     * Create new ML cache if needed.
+     */
+    private IgniteCache<BlockMatrixKey, BlockEntry> newCache() {
+        CacheConfiguration<BlockMatrixKey, BlockEntry> cfg = new CacheConfiguration<>();
+
+        // Write to primary.
+        cfg.setWriteSynchronizationMode(CacheWriteSynchronizationMode.PRIMARY_SYNC);
+
+        // Atomic transactions only.
+        cfg.setAtomicityMode(CacheAtomicityMode.ATOMIC);
+
+        // No eviction.
+        cfg.setEvictionPolicy(null);
+
+        // No copying of values.
+        cfg.setCopyOnRead(false);
+
+        // Cache is partitioned.
+        cfg.setCacheMode(CacheMode.PARTITIONED);
+
+        // Random cache name.
+        cfg.setName(ML_BLOCK_CACHE_NAME);
+
+        return Ignition.localIgnite().getOrCreateCache(cfg);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
index f2efe74..5145376 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
@@ -46,9 +46,7 @@ public class SparseLocalOnHeapVectorStorage implements VectorStorage, StorageCon
         // No-op.
     }
 
-    /**
-     * @param map
-     */
+    /** */
     public SparseLocalOnHeapVectorStorage(Map<Integer, Double> map, boolean copy) {
         assert map.size() > 0;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/statistics/Variance.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/statistics/Variance.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/statistics/Variance.java
index e406b5b..525e6e9 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/statistics/Variance.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/statistics/Variance.java
@@ -30,6 +30,7 @@ public class Variance {
     /** */
     private double m2;
 
+    /** */
     public Variance() {
         mean = 0;
         n = 0;

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/statistics/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/statistics/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/statistics/package-info.java
new file mode 100644
index 0000000..7b65fce
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/statistics/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+/**
+ * <!-- Package description. -->
+ * Statistics stuff.
+ */
+package org.apache.ignite.ml.math.statistics;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MapUtil.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MapUtil.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MapUtil.java
index 6c25f0e..9190901 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MapUtil.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MapUtil.java
@@ -25,7 +25,7 @@ import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
 /**
- *
+ * Some {@link Map} related utils.
  */
 public class MapUtil {
     /** */

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/math/util/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/util/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/util/package-info.java
new file mode 100644
index 0000000..2507ee4
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/util/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+/**
+ * <!-- Package description. -->
+ * Some math utils.
+ */
+package org.apache.ignite.ml.math.util;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/main/java/org/apache/ignite/ml/package-info.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/package-info.java b/modules/ml/src/main/java/org/apache/ignite/ml/package-info.java
new file mode 100644
index 0000000..779581b
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+/**
+ * <!-- Package description. -->
+ * Root ML package.
+ */
+package org.apache.ignite.ml;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplDistributedTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplDistributedTestSuite.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplDistributedTestSuite.java
index 9899d3b..5dc860c 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplDistributedTestSuite.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplDistributedTestSuite.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.ml.math;
 
 import org.apache.ignite.ml.math.impls.matrix.CacheMatrixTest;
+import org.apache.ignite.ml.math.impls.matrix.SparseDistributedBlockMatrixTest;
 import org.apache.ignite.ml.math.impls.matrix.SparseDistributedMatrixTest;
 import org.apache.ignite.ml.math.impls.storage.matrix.SparseDistributedMatrixStorageTest;
 import org.apache.ignite.ml.math.impls.vector.CacheVectorTest;
@@ -33,6 +34,7 @@ import org.junit.runners.Suite;
     CacheMatrixTest.class,
     SparseDistributedMatrixStorageTest.class,
     SparseDistributedMatrixTest.class,
+    SparseDistributedBlockMatrixTest.class
 })
 public class MathImplDistributedTestSuite {
     // No-op.

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedBlockMatrixTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedBlockMatrixTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedBlockMatrixTest.java
new file mode 100644
index 0000000..1228f05
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedBlockMatrixTest.java
@@ -0,0 +1,379 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math.impls.matrix;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.internal.util.IgniteUtils;
+import org.apache.ignite.lang.IgniteUuid;
+import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
+import org.apache.ignite.ml.math.impls.MathTestConstants;
+import org.apache.ignite.ml.math.impls.storage.matrix.BlockMatrixKey;
+import org.apache.ignite.ml.math.impls.storage.matrix.BlockMatrixStorage;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+import org.apache.ignite.testframework.junits.common.GridCommonTest;
+
+import static org.apache.ignite.ml.math.impls.MathTestConstants.UNEXPECTED_VAL;
+
+/**
+ * Tests for {@link SparseBlockDistributedMatrix}.
+ */
+@GridCommonTest(group = "Distributed Models")
+public class SparseDistributedBlockMatrixTest extends GridCommonAbstractTest {
+    /** Number of nodes in grid */
+    private static final int NODE_COUNT = 3;
+    /** Precision. */
+    private static final double PRECISION = 0.0;
+    /** Grid instance. */
+    private Ignite ignite;
+    /** Matrix rows */
+    private final int rows = MathTestConstants.STORAGE_SIZE;
+    /** Matrix cols */
+    private final int cols = MathTestConstants.STORAGE_SIZE;
+    /** Matrix for tests */
+    private SparseBlockDistributedMatrix cacheMatrix;
+
+    /**
+     * Default constructor.
+     */
+    public SparseDistributedBlockMatrixTest() {
+        super(false);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        for (int i = 1; i <= NODE_COUNT; i++)
+            startGrid(i);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTestsStopped() throws Exception {
+        stopAllGrids();
+    }
+
+    /**
+     * {@inheritDoc}
+     */
+    @Override protected void beforeTest() throws Exception {
+        ignite = grid(NODE_COUNT);
+
+        ignite.configuration().setPeerClassLoadingEnabled(true);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        if (cacheMatrix != null) {
+            cacheMatrix.destroy();
+            cacheMatrix = null;
+        }
+    }
+
+    /** */
+    public void testGetSet() throws Exception {
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        cacheMatrix = new SparseBlockDistributedMatrix(rows, cols);
+
+        for (int i = 0; i < rows; i++) {
+            for (int j = 0; j < cols; j++) {
+                double v = Math.random();
+                cacheMatrix.set(i, j, v);
+
+                assertEquals("Unexpected value for matrix element["+ i +" " + j + "]", v, cacheMatrix.get(i, j), PRECISION);
+            }
+        }
+    }
+
+    /** */
+    public void testExternalize() throws IOException, ClassNotFoundException {
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        cacheMatrix = new SparseBlockDistributedMatrix(rows, cols);
+
+        cacheMatrix.set(1, 1, 1.0);
+
+        ByteArrayOutputStream byteArrOutputStream = new ByteArrayOutputStream();
+        ObjectOutputStream objOutputStream = new ObjectOutputStream(byteArrOutputStream);
+
+        objOutputStream.writeObject(cacheMatrix);
+
+        ByteArrayInputStream byteArrInputStream = new ByteArrayInputStream(byteArrOutputStream.toByteArray());
+        ObjectInputStream objInputStream = new ObjectInputStream(byteArrInputStream);
+
+        SparseBlockDistributedMatrix objRestored = (SparseBlockDistributedMatrix)objInputStream.readObject();
+
+        assertTrue(MathTestConstants.VAL_NOT_EQUALS, cacheMatrix.equals(objRestored));
+        assertEquals(MathTestConstants.VAL_NOT_EQUALS, objRestored.get(1, 1), 1.0, PRECISION);
+    }
+
+    /** Test simple math. */
+    public void testMath() {
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        cacheMatrix = new SparseBlockDistributedMatrix(rows, cols);
+        initMtx(cacheMatrix);
+
+        cacheMatrix.assign(2.0);
+        for (int i = 0; i < cacheMatrix.rowSize(); i++)
+            for (int j = 0; j < cacheMatrix.columnSize(); j++)
+                assertEquals(UNEXPECTED_VAL, 2.0, cacheMatrix.get(i, j), PRECISION);
+
+        cacheMatrix.plus(3.0);
+        for (int i = 0; i < cacheMatrix.rowSize(); i++)
+            for (int j = 0; j < cacheMatrix.columnSize(); j++)
+                assertEquals(UNEXPECTED_VAL, 5.0, cacheMatrix.get(i, j), PRECISION);
+
+        cacheMatrix.times(2.0);
+        for (int i = 0; i < cacheMatrix.rowSize(); i++)
+            for (int j = 0; j < cacheMatrix.columnSize(); j++)
+                assertEquals(UNEXPECTED_VAL, 10.0, cacheMatrix.get(i, j), PRECISION);
+
+        cacheMatrix.divide(10.0);
+        for (int i = 0; i < cacheMatrix.rowSize(); i++)
+            for (int j = 0; j < cacheMatrix.columnSize(); j++)
+                assertEquals(UNEXPECTED_VAL, 1.0, cacheMatrix.get(i, j), PRECISION);
+
+        assertEquals(UNEXPECTED_VAL, cacheMatrix.rowSize() * cacheMatrix.columnSize(), cacheMatrix.sum(), PRECISION);
+    }
+
+    /** */
+    public void testMinMax() {
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        cacheMatrix = new SparseBlockDistributedMatrix(rows, cols);
+
+        for (int i = 0; i < cacheMatrix.rowSize(); i++)
+            for (int j = 0; j < cacheMatrix.columnSize(); j++)
+                cacheMatrix.set(i, j, i * cols + j + 1);
+
+        assertEquals(UNEXPECTED_VAL, 1.0, cacheMatrix.minValue(), PRECISION);
+        assertEquals(UNEXPECTED_VAL, rows * cols, cacheMatrix.maxValue(), PRECISION);
+
+        for (int i = 0; i < cacheMatrix.rowSize(); i++)
+            for (int j = 0; j < cacheMatrix.columnSize(); j++)
+                cacheMatrix.set(i, j, -1.0 * (i * cols + j + 1));
+
+        assertEquals(UNEXPECTED_VAL, -rows * cols, cacheMatrix.minValue(), PRECISION);
+        assertEquals(UNEXPECTED_VAL, -1.0, cacheMatrix.maxValue(), PRECISION);
+
+        for (int i = 0; i < cacheMatrix.rowSize(); i++)
+            for (int j = 0; j < cacheMatrix.columnSize(); j++)
+                cacheMatrix.set(i, j, i * cols + j);
+
+        assertEquals(UNEXPECTED_VAL, 0.0, cacheMatrix.minValue(), PRECISION);
+        assertEquals(UNEXPECTED_VAL, rows * cols - 1.0, cacheMatrix.maxValue(), PRECISION);
+    }
+
+    /** */
+    public void testMap() {
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        cacheMatrix = new SparseBlockDistributedMatrix(rows, cols);
+        initMtx(cacheMatrix);
+
+        cacheMatrix.map(i -> 100.0);
+        for (int i = 0; i < cacheMatrix.rowSize(); i++)
+            for (int j = 0; j < cacheMatrix.columnSize(); j++)
+                assertEquals(UNEXPECTED_VAL, 100.0, cacheMatrix.get(i, j), PRECISION);
+    }
+
+    /** */
+    public void testCopy() {
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        cacheMatrix = new SparseBlockDistributedMatrix(rows, cols);
+
+        try {
+            cacheMatrix.copy();
+            fail("UnsupportedOperationException expected.");
+        }
+        catch (UnsupportedOperationException e) {
+            return;
+        }
+        fail("UnsupportedOperationException expected.");
+    }
+
+    /** */
+    public void testCacheBehaviour(){
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        SparseBlockDistributedMatrix cacheMatrix1 = new SparseBlockDistributedMatrix(rows, cols);
+        SparseBlockDistributedMatrix cacheMatrix2 = new SparseBlockDistributedMatrix(rows, cols);
+
+        initMtx(cacheMatrix1);
+        initMtx(cacheMatrix2);
+
+        Collection<String> cacheNames = ignite.cacheNames();
+
+        assert cacheNames.contains(BlockMatrixStorage.ML_BLOCK_CACHE_NAME);
+
+        IgniteCache<BlockMatrixKey, Object> cache = ignite.getOrCreateCache(BlockMatrixStorage.ML_BLOCK_CACHE_NAME);
+
+        Set<BlockMatrixKey> keySet1 = buildKeySet(cacheMatrix1);
+        Set<BlockMatrixKey> keySet2 = buildKeySet(cacheMatrix2);
+
+        assert cache.containsKeys(keySet1);
+        assert cache.containsKeys(keySet2);
+
+        cacheMatrix2.destroy();
+
+        assert cache.containsKeys(keySet1);
+        assert !cache.containsKeys(keySet2);
+
+        cacheMatrix1.destroy();
+
+        assert !cache.containsKeys(keySet1);
+    }
+
+    /** */
+    public void testLike() {
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        cacheMatrix = new SparseBlockDistributedMatrix(rows, cols);
+
+        assertNotNull(cacheMatrix.like(1, 1));
+    }
+
+    /** */
+    public void testLikeVector() {
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        cacheMatrix = new SparseBlockDistributedMatrix(rows, cols);
+
+        try {
+            cacheMatrix.likeVector(1);
+            fail("UnsupportedOperationException expected.");
+        }
+        catch (UnsupportedOperationException e) {
+            return;
+        }
+        fail("UnsupportedOperationException expected.");
+    }
+
+    /**
+     * Simple test for two square matrices.
+     */
+    public void testSquareMatrixTimes(){
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        int size = 100;
+
+        Matrix cacheMatrix1 = new SparseBlockDistributedMatrix(size, size);
+        Matrix cacheMatrix2 = new SparseBlockDistributedMatrix(size, size);
+
+        for (int i = 0; i < size; i++) {
+            cacheMatrix1.setX(i, i, i);
+            cacheMatrix2.setX(i, i, i);
+        }
+
+        Matrix res = cacheMatrix1.times(cacheMatrix2);
+
+        for(int i = 0; i < size; i++)
+            for(int j = 0; j < size; j++)
+                if (i == j)
+                    assertEquals(UNEXPECTED_VAL + " for "+ i +":"+ j, i * i, res.get(i, j), PRECISION);
+                else
+                    assertEquals(UNEXPECTED_VAL + " for "+ i +":"+ j, 0, res.get(i, j), PRECISION);
+    }
+
+    /**
+     *
+     */
+    public void testNonSquareMatrixTimes(){
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        int size = BlockEntry.MAX_BLOCK_SIZE + 1;
+        int size2 = BlockEntry.MAX_BLOCK_SIZE * 2 + 1;
+
+        Matrix cacheMatrix1 = new SparseBlockDistributedMatrix(size2, size);
+        Matrix cacheMatrix2 = new SparseBlockDistributedMatrix(size, size2);
+
+        for (int i = 0; i < size; i++) {
+            cacheMatrix1.setX(i, i, i);
+            cacheMatrix2.setX(i, i, i);
+        }
+
+        Matrix res = cacheMatrix1.times(cacheMatrix2);
+
+        for(int i = 0; i < size; i++)
+            for(int j = 0; j < size; j++)
+                if (i == j)
+                    assertEquals(UNEXPECTED_VAL + " for "+ i +":"+ j, i * i, res.get(i, j), PRECISION);
+                else
+                    assertEquals(UNEXPECTED_VAL + " for "+ i +":"+ j, 0, res.get(i, j), PRECISION);
+    }
+
+    /**
+     *
+     */
+    public void testNonSquareMatrixTimes2(){
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        int size = BlockEntry.MAX_BLOCK_SIZE + 1;
+        int size2 = BlockEntry.MAX_BLOCK_SIZE * 2 + 1;
+
+        Matrix cacheMatrix1 = new SparseBlockDistributedMatrix(size, size2);
+        Matrix cacheMatrix2 = new SparseBlockDistributedMatrix(size2, size);
+
+        for (int i = 0; i < size; i++) {
+            cacheMatrix1.setX(i, i, i);
+            cacheMatrix2.setX(i, i, i);
+        }
+
+        Matrix res = cacheMatrix1.times(cacheMatrix2);
+
+        for(int i = 0; i < size; i++)
+            for(int j = 0; j < size; j++)
+                if (i == j)
+                    assertEquals(UNEXPECTED_VAL + " for "+ i +":"+ j, i * i, res.get(i, j), PRECISION);
+                else
+                    assertEquals(UNEXPECTED_VAL + " for "+ i +":"+ j, 0, res.get(i, j), PRECISION);
+    }
+
+    /** */
+    private void initMtx(Matrix m) {
+        for (int i = 0; i < m.rowSize(); i++)
+            for (int j = 0; j < m.columnSize(); j++)
+                m.set(i, j, 1.0);
+    }
+
+    /** Build key set for SparseBlockDistributedMatrix. */
+    private Set<BlockMatrixKey> buildKeySet(SparseBlockDistributedMatrix m){
+        Set<BlockMatrixKey> set = new HashSet<>();
+
+        BlockMatrixStorage storage = (BlockMatrixStorage)m.getStorage();
+
+        IgniteUuid uuid = storage.getUUID();
+
+        long maxBlock = (rows / 32 + (rows % 32 > 0 ? 1 : 0)) * (cols / 32 + (cols % 32 > 0 ? 1 : 0));
+
+        for (long i = 0; i < maxBlock; i++)
+            set.add(new BlockMatrixKey(i,uuid,null));
+
+        return set;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2b989d/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrixTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrixTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrixTest.java
index a7cd6b5..3fec83c 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrixTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/SparseDistributedMatrixTest.java
@@ -48,10 +48,10 @@ import static org.apache.ignite.ml.math.impls.MathTestConstants.UNEXPECTED_VAL;
 public class SparseDistributedMatrixTest extends GridCommonAbstractTest {
     /** Number of nodes in grid */
     private static final int NODE_COUNT = 3;
-    /** Cache name. */
-    private static final String CACHE_NAME = "test-cache";
     /** Precision. */
     private static final double PRECISION = 0.0;
+    /** */
+    private static final int MATRIX_SIZE = 10;
     /** Grid instance. */
     private Ignite ignite;
     /** Matrix rows */
@@ -90,8 +90,6 @@ public class SparseDistributedMatrixTest extends GridCommonAbstractTest {
 
     /** {@inheritDoc} */
     @Override protected void afterTest() throws Exception {
-        ignite.destroyCache(CACHE_NAME);
-
         if (cacheMatrix != null) {
             cacheMatrix.destroy();
             cacheMatrix = null;
@@ -166,7 +164,9 @@ public class SparseDistributedMatrixTest extends GridCommonAbstractTest {
         assertEquals(UNEXPECTED_VAL, cacheMatrix.rowSize() * cacheMatrix.columnSize(), cacheMatrix.sum(), PRECISION);
     }
 
-    /** */
+    /**
+     * TODO: IGNITE-5102, wrong min/max, wait for fold/map fix
+     */
     public void testMinMax() {
         IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
 
@@ -286,6 +286,28 @@ public class SparseDistributedMatrixTest extends GridCommonAbstractTest {
     }
 
     /** */
+    public void testMatrixTimes(){
+        IgniteUtils.setCurrentIgniteName(ignite.configuration().getIgniteInstanceName());
+
+        SparseDistributedMatrix cacheMatrix1 = new SparseDistributedMatrix(MATRIX_SIZE, MATRIX_SIZE, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+        SparseDistributedMatrix cacheMatrix2 = new SparseDistributedMatrix(MATRIX_SIZE, MATRIX_SIZE, StorageConstants.ROW_STORAGE_MODE, StorageConstants.RANDOM_ACCESS_MODE);
+
+        for (int i = 0; i < MATRIX_SIZE; i++) {
+            cacheMatrix1.setX(i, i, i);
+            cacheMatrix2.setX(i, i, i);
+        }
+
+        Matrix res = cacheMatrix1.times(cacheMatrix2);
+
+        for(int i = 0; i < MATRIX_SIZE; i++)
+            for(int j = 0; j < MATRIX_SIZE; j++)
+                if (i == j)
+                    assertEquals(UNEXPECTED_VAL, i * i, res.get(i, j), PRECISION);
+                else
+                    assertEquals(UNEXPECTED_VAL, 0, res.get(i, j), PRECISION);
+    }
+
+    /** */
     private void initMtx(Matrix m) {
         for (int i = 0; i < m.rowSize(); i++)
             for (int j = 0; j < m.columnSize(); j++)


[35/50] [abbrv] ignite git commit: IGNITE-5806 - Fixed assertion with a side-effect - Fixes #2335.

Posted by yz...@apache.org.
IGNITE-5806 - Fixed assertion with a side-effect - Fixes #2335.

Signed-off-by: Alexey Goncharuk <al...@gmail.com>


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

Branch: refs/heads/ignite-5658
Commit: 9e79c4b69da2e553d845edcfa5d61717a8ebb5f0
Parents: e96225f
Author: dpavlov <dp...@gridgain.com>
Authored: Wed Jul 26 17:23:05 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Wed Jul 26 17:23:05 2017 +0300

----------------------------------------------------------------------
 .../processors/cache/store/GridCacheStoreManagerAdapter.java    | 5 ++---
 1 file changed, 2 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/9e79c4b6/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/store/GridCacheStoreManagerAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/store/GridCacheStoreManagerAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/store/GridCacheStoreManagerAdapter.java
index 99541ba..9cba3dd 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/store/GridCacheStoreManagerAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/store/GridCacheStoreManagerAdapter.java
@@ -875,9 +875,8 @@ public abstract class GridCacheStoreManagerAdapter extends GridCacheManagerAdapt
                         lsnr.onSessionEnd(locSes, !threwEx);
                 }
 
-                assert !sesHolder.get().ended(store);
-
-                store.sessionEnd(!threwEx);
+                if (!sesHolder.get().ended(store))
+                    store.sessionEnd(!threwEx);
             }
         }
         catch (Exception e) {


[31/50] [abbrv] ignite git commit: IGNITE-5802: Fix all wrong TODO comments in ML component

Posted by yz...@apache.org.
IGNITE-5802: Fix all wrong TODO comments in ML component

This closes #2340


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

Branch: refs/heads/ignite-5658
Commit: 131847203d55f4f3907a7ff62d53ff69345fa605
Parents: bdc9e4b
Author: Yury Babak <yb...@gridgain.com>
Authored: Tue Jul 25 15:22:34 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Tue Jul 25 15:22:34 2017 +0300

----------------------------------------------------------------------
 .../ml/clustering/KMeansDistributedClusterer.java       |  6 +++---
 .../ignite/ml/clustering/KMeansLocalClusterer.java      |  2 +-
 .../main/java/org/apache/ignite/ml/math/MathUtils.java  |  1 +
 .../java/org/apache/ignite/ml/math/VectorUtils.java     |  7 +++++--
 .../ignite/ml/math/decompositions/LUDecomposition.java  |  2 +-
 .../ignite/ml/math/decompositions/QRDecomposition.java  |  2 +-
 .../ml/math/exceptions/MathIllegalNumberException.java  |  8 ++++----
 .../org/apache/ignite/ml/math/impls/CacheUtils.java     |  4 ++--
 .../ignite/ml/math/impls/matrix/AbstractMatrix.java     |  2 --
 .../impls/storage/matrix/DenseOffHeapMatrixStorage.java |  2 +-
 .../storage/vector/DenseLocalOffHeapVectorStorage.java  |  2 +-
 .../storage/vector/SparseLocalOffHeapVectorStorage.java |  2 +-
 .../storage/vector/SparseLocalOnHeapVectorStorage.java  |  4 ++--
 .../apache/ignite/ml/math/impls/vector/CacheVector.java |  4 ++--
 .../ignite/ml/math/impls/vector/MapWrapperVector.java   |  1 -
 .../ignite/ml/math/impls/vector/SparseLocalVector.java  |  6 +++---
 .../apache/ignite/ml/math/impls/vector/VectorView.java  |  2 +-
 .../java/org/apache/ignite/ml/math/util/MatrixUtil.java |  4 ++--
 .../regressions/AbstractMultipleLinearRegression.java   |  4 ++--
 .../ml/regressions/OLSMultipleLinearRegression.java     |  2 +-
 .../src/test/java/org/apache/ignite/ml/TestUtils.java   |  2 +-
 .../apache/ignite/ml/math/benchmark/MathBenchmark.java  |  2 +-
 .../ignite/ml/math/benchmark/VectorBenchmarkTest.java   |  2 +-
 .../ml/math/decompositions/EigenDecompositionTest.java  |  2 +-
 .../ml/math/impls/matrix/MatrixAttributeTest.java       |  2 --
 .../storage/matrix/MatrixStorageImplementationTest.java |  2 +-
 .../ignite/ml/math/impls/vector/AbstractVectorTest.java |  4 ++--
 .../impls/vector/PivotedVectorViewConstructorTest.java  |  2 +-
 .../ml/math/impls/vector/VectorAttributesTest.java      |  2 +-
 .../ignite/ml/math/impls/vector/VectorFoldMapTest.java  |  2 +-
 .../ml/math/impls/vector/VectorImplementationsTest.java | 12 ++++++------
 .../ignite/ml/math/impls/vector/VectorIterableTest.java |  2 +-
 .../ignite/ml/math/impls/vector/VectorToMatrixTest.java |  4 ++--
 .../ml/regressions/OLSMultipleLinearRegressionTest.java |  4 ++--
 34 files changed, 55 insertions(+), 56 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/clustering/KMeansDistributedClusterer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/clustering/KMeansDistributedClusterer.java b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/KMeansDistributedClusterer.java
index 5f702d2..2ef61ad 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/clustering/KMeansDistributedClusterer.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/KMeansDistributedClusterer.java
@@ -80,7 +80,7 @@ public class KMeansDistributedClusterer extends BaseKMeansClusterer<SparseDistri
         MathIllegalArgumentException, ConvergenceException {
         SparseDistributedMatrix pointsCp = (SparseDistributedMatrix)points.like(points.rowSize(), points.columnSize());
 
-        // TODO: this copy is very ineffective, just for POC. Immutability of data should be guaranteed by other methods
+        // TODO: IGNITE-5825, this copy is very ineffective, just for POC. Immutability of data should be guaranteed by other methods
         // such as logical locks for example.
         pointsCp.assign(points);
 
@@ -117,10 +117,10 @@ public class KMeansDistributedClusterer extends BaseKMeansClusterer<SparseDistri
     /** Initialize cluster centers. */
     private Vector[] initClusterCenters(SparseDistributedMatrix points, int k) {
         // Initialize empty centers and point costs.
-        int ptsCount = points.rowSize();
+        int ptsCnt = points.rowSize();
 
         // Initialize the first center to a random point.
-        Vector sample = localCopyOf(points.viewRow(rnd.nextInt(ptsCount)));
+        Vector sample = localCopyOf(points.viewRow(rnd.nextInt(ptsCnt)));
 
         List<Vector> centers = new ArrayList<>();
         List<Vector> newCenters = new ArrayList<>();

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/clustering/KMeansLocalClusterer.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/clustering/KMeansLocalClusterer.java b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/KMeansLocalClusterer.java
index 9f2aefb..3d005b4 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/clustering/KMeansLocalClusterer.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/clustering/KMeansLocalClusterer.java
@@ -92,7 +92,7 @@ public class KMeansLocalClusterer extends BaseKMeansClusterer<DenseLocalOnHeapMa
             }
 
             if (j == 0)
-                // TODO: Process this case more carefully
+                // TODO: IGNITE-5825, Process this case more carefully
                 centers[i] = localCopyOf(points.viewRow(0));
             else
                 centers[i] = localCopyOf(points.viewRow(j - 1));

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/MathUtils.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/MathUtils.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/MathUtils.java
index c2164ab..c7b33c3 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/MathUtils.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/MathUtils.java
@@ -23,6 +23,7 @@ import org.apache.ignite.ml.math.exceptions.NullArgumentException;
  * Miscellaneous utility functions.
  */
 public final class MathUtils {
+    /** */
     public static void checkNotNull(Object o)
         throws NullArgumentException {
         if (o == null)

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorUtils.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorUtils.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorUtils.java
index 061d5ae..6bb0276 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorUtils.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/VectorUtils.java
@@ -21,6 +21,9 @@ import java.util.Map;
 import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
 import org.apache.ignite.ml.math.impls.vector.MapWrapperVector;
 
+/**
+ * Some utils for {@link Vector}.
+ */
 public class VectorUtils {
     /** Create new vector like given vector initialized by zeroes. */
     public static Vector zeroesLike(Vector v) {
@@ -33,7 +36,7 @@ public class VectorUtils {
     }
 
     /** */
-    public static Vector fromMap(Map<Integer, Double> value, boolean copy) {
-        return new MapWrapperVector(value);
+    public static Vector fromMap(Map<Integer, Double> val, boolean cp) {
+        return new MapWrapperVector(val);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java
index 4c388b3..df7b6cd 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/LUDecomposition.java
@@ -35,7 +35,7 @@ import static org.apache.ignite.ml.math.util.MatrixUtil.likeVector;
  * @see <a href="http://mathworld.wolfram.com/LUDecomposition.html">MathWorld</a>
  * @see <a href="http://en.wikipedia.org/wiki/LU_decomposition">Wikipedia</a>
  *
- * TODO: Maybe we should make this class (and other decompositions) Externalizable.
+ * TODO: IGNITE-5828, Maybe we should make this class (and other decompositions) Externalizable.
  */
 public class LUDecomposition implements Destroyable {
     /** Default bound to determine effective singularity in LU decomposition. */

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java
index 5ffa574..3d0bb5d 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/QRDecomposition.java
@@ -227,7 +227,7 @@ public class QRDecomposition implements Destroyable {
      * @throws SingularMatrixException if the matrix is singular and {@code raise} is {@code true}.
      */
     private static boolean checkSingular(Matrix r, double min, boolean raise) {
-        // TODO: Not a very fast approach for distributed matrices. would be nice if we could independently check
+        // TODO: IGNITE-5828, Not a very fast approach for distributed matrices. would be nice if we could independently check
         // parts on different nodes for singularity and do fold with 'or'.
 
         final int len = r.columnSize();

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathIllegalNumberException.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathIllegalNumberException.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathIllegalNumberException.java
index 2e7280b..b2abf63 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathIllegalNumberException.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/exceptions/MathIllegalNumberException.java
@@ -28,7 +28,7 @@ public class MathIllegalNumberException extends MathIllegalArgumentException {
     private static final long serialVersionUID = -7447085893598031110L;
 
     /** Requested. */
-    private final Number argument;
+    private final Number arg;
 
     /**
      * Construct an exception.
@@ -39,13 +39,13 @@ public class MathIllegalNumberException extends MathIllegalArgumentException {
      */
     protected MathIllegalNumberException(String msg, Number wrong, Object... arguments) {
         super(msg, wrong, arguments);
-        argument = wrong;
+        arg = wrong;
     }
 
     /**
      * @return the requested value.
      */
-    public Number getArgument() {
-        return argument;
+    public Number getArg() {
+        return arg;
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java
index 369840b..2c519f0 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/CacheUtils.java
@@ -30,6 +30,7 @@ import org.apache.ignite.cache.query.ScanQuery;
 import org.apache.ignite.cluster.ClusterGroup;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.processors.cache.CacheEntryImpl;
+import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.apache.ignite.lang.IgniteCallable;
 import org.apache.ignite.lang.IgnitePredicate;
@@ -43,12 +44,11 @@ import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
 import org.apache.ignite.ml.math.functions.IgniteFunction;
 import org.apache.ignite.ml.math.impls.matrix.BlockEntry;
 import org.apache.ignite.ml.math.impls.storage.matrix.BlockMatrixKey;
-import org.apache.ignite.internal.util.typedef.internal.A;
 
 /**
  * Distribution-related misc. support.
  *
- * TODO: IGNITE-5102, fix sparse key filters
+ * TODO: IGNITE-5102, fix sparse key filters.
  */
 public class CacheUtils {
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
index 3dc9b43..647ebc6 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
@@ -44,8 +44,6 @@ import org.apache.ignite.ml.math.impls.vector.MatrixVectorView;
  * interface to minimize the effort required to implement it.
  * Subclasses may override some of the implemented methods if a more
  * specific or optimized implementation is desirable.
- *
- * TODO: add row/column optimization.
  */
 public abstract class AbstractMatrix implements Matrix {
     // Stochastic sparsity analysis.

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
index 62060d1..7405a4e 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
@@ -33,7 +33,7 @@ public class DenseOffHeapMatrixStorage implements MatrixStorage {
     private int cols;
     /** */
     private transient long ptr;
-    //TODO: temp solution.
+    //TODO: IGNITE-5535, temp solution.
     /** */
     private int ptrInitHash;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java
index a9965cc..71b7793 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/DenseLocalOffHeapVectorStorage.java
@@ -33,7 +33,7 @@ public class DenseLocalOffHeapVectorStorage implements VectorStorage {
 
     /** */
     private transient long ptr;
-    //TODO: temp solution.
+    //TODO: IGNITE-5535, temp solution.
     /** */
     private int ptrInitHash;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java
index f6148c8..a858364 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOffHeapVectorStorage.java
@@ -76,7 +76,7 @@ public class SparseLocalOffHeapVectorStorage implements VectorStorage {
 
     /** {@inheritDoc} */
     @Override public void writeExternal(ObjectOutput out) throws IOException {
-        throw new UnsupportedOperationException(); // TODO: add externalization support.
+        throw new UnsupportedOperationException(); // TODO: IGNITE-5801, add externalization support.
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
index 5145376..deef010 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
@@ -47,7 +47,7 @@ public class SparseLocalOnHeapVectorStorage implements VectorStorage, StorageCon
     }
 
     /** */
-    public SparseLocalOnHeapVectorStorage(Map<Integer, Double> map, boolean copy) {
+    public SparseLocalOnHeapVectorStorage(Map<Integer, Double> map, boolean cp) {
         assert map.size() > 0;
 
         this.size = map.size();
@@ -59,7 +59,7 @@ public class SparseLocalOnHeapVectorStorage implements VectorStorage, StorageCon
         else
             acsMode = UNKNOWN_STORAGE_MODE;
 
-        if (copy)
+        if (cp)
             switch (acsMode) {
                 case SEQUENTIAL_ACCESS_MODE:
                     sto = new Int2DoubleRBTreeMap(map);

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/CacheVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/CacheVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/CacheVector.java
index f78113c..fec230f 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/CacheVector.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/CacheVector.java
@@ -88,8 +88,8 @@ public class CacheVector<K, V> extends AbstractVector {
 
     /** {@inheritDoc} */
     @Override public Vector map(IgniteBiFunction<Double, Double, Double> fun, double y) {
-        // TODO: provide cache-optimized implementation.
-        return super.map(fun, y); // TODO
+        // TODO: IGNTIE-5723, provide cache-optimized implementation.
+        return super.map(fun, y);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MapWrapperVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MapWrapperVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MapWrapperVector.java
index a093d0e..83b40c1 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MapWrapperVector.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/MapWrapperVector.java
@@ -26,7 +26,6 @@ import org.apache.ignite.ml.math.impls.storage.matrix.MapWrapperStorage;
  * Vector wrapping a given map.
  */
 public class MapWrapperVector extends AbstractVector {
-
     /**
      * Construct a vector wrapping given map.
      *

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java
index be5d0f6..9e345bb 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java
@@ -37,10 +37,10 @@ public class SparseLocalVector extends AbstractVector implements StorageConstant
 
     /**
      * @param map Underlying map.
-     * @param copy Should given map be copied.
+     * @param cp Should given map be copied.
      */
-    public SparseLocalVector(Map<Integer, Double> map, boolean copy) {
-        setStorage(new SparseLocalOnHeapVectorStorage(map, copy));
+    public SparseLocalVector(Map<Integer, Double> map, boolean cp) {
+        setStorage(new SparseLocalOnHeapVectorStorage(map, cp));
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/VectorView.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/VectorView.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/VectorView.java
index 0988059..071c6ed 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/VectorView.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/VectorView.java
@@ -60,7 +60,7 @@ public class VectorView extends AbstractVector {
 
     /** {@inheritDoc} */
     @Override public Vector copy() {
-        // TODO: revise this
+        // TODO: IGNTIE-5723, revise this
         DelegateVectorStorage sto = storage();
 
         return new VectorView(sto.delegate(), sto.offset(), sto.length());

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java
index 7a90ba1..752929d 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java
@@ -53,7 +53,7 @@ public class MatrixUtil {
      */
     public static Matrix identityLike(Matrix matrix, int n) {
         Matrix res = like(matrix, n, n);
-        // TODO: Maybe we should introduce API for walking(and changing) matrix in
+        // TODO: IGNITE-5216, Maybe we should introduce API for walking(and changing) matrix in.
         // a fastest possible visiting order.
         for (int i = 0; i < n; i++)
             res.setX(i, i, 1.0);
@@ -143,7 +143,7 @@ public class MatrixUtil {
         return res;
     }
 
-    /** TODO: rewrite in a more optimal way. */
+    /** TODO: IGNTIE-5723, rewrite in a more optimal way. */
     public static DenseLocalOnHeapVector localCopyOf(Vector vec) {
         DenseLocalOnHeapVector res = new DenseLocalOnHeapVector(vec.size());
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/regressions/AbstractMultipleLinearRegression.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/regressions/AbstractMultipleLinearRegression.java b/modules/ml/src/main/java/org/apache/ignite/ml/regressions/AbstractMultipleLinearRegression.java
index d558dc0..a2a8f16 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/regressions/AbstractMultipleLinearRegression.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/regressions/AbstractMultipleLinearRegression.java
@@ -138,7 +138,7 @@ public abstract class AbstractMultipleLinearRegression implements MultipleLinear
             throw new NullArgumentException();
         if (y.size() == 0)
             throw new NoDataException();
-        // TODO: Should we copy here?
+        // TODO: IGNITE-5826, Should we copy here?
         yVector = y;
     }
 
@@ -174,7 +174,7 @@ public abstract class AbstractMultipleLinearRegression implements MultipleLinear
         if (x.rowSize() == 0)
             throw new NoDataException();
         if (noIntercept)
-            // TODO: Should we copy here?
+            // TODO: IGNITE-5826, Should we copy here?
             xMatrix = x;
         else { // Augment design matrix with initial unitary column
             xMatrix = MatrixUtil.like(x, x.rowSize(), x.columnSize() + 1);

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/main/java/org/apache/ignite/ml/regressions/OLSMultipleLinearRegression.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/regressions/OLSMultipleLinearRegression.java b/modules/ml/src/main/java/org/apache/ignite/ml/regressions/OLSMultipleLinearRegression.java
index c53a77e..36d5f2c 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/regressions/OLSMultipleLinearRegression.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/regressions/OLSMultipleLinearRegression.java
@@ -155,7 +155,7 @@ public class OLSMultipleLinearRegression extends AbstractMultipleLinearRegressio
         if (isNoIntercept())
             return getY().foldMap(Functions.PLUS, Functions.SQUARE, 0.0);
         else {
-            // TODO: think about incremental update formula.
+            // TODO: IGNITE-5826, think about incremental update formula.
             final double mean = getY().sum() / getY().size();
             return getY().foldMap(Functions.PLUS, x -> (mean - x) * (mean - x), 0.0);
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/TestUtils.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/TestUtils.java b/modules/ml/src/test/java/org/apache/ignite/ml/TestUtils.java
index 9c3b4c9..62fdf2c 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/TestUtils.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/TestUtils.java
@@ -160,7 +160,7 @@ public class TestUtils {
                 double eij = exp.getX(i, j);
                 double aij = actual.getX(i, j);
 
-                // TODO: Check precision here.
+                // TODO: IGNITE-5824, Check precision here.
                 Assert.assertEquals(eij, aij, 0.0);
             }
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmark.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmark.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmark.java
index 33ccfc9..69737f7 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmark.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/MathBenchmark.java
@@ -197,7 +197,7 @@ class MathBenchmark {
 
     /** */
     interface BenchmarkCode {
-        // todo find out why Callable<Void> failed to work here
+        //TODO: IGNITE-5827, find out why Callable<Void> failed to work here
 
         /** */
         void call() throws Exception;

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/VectorBenchmarkTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/VectorBenchmarkTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/VectorBenchmarkTest.java
index fd98382..98a93d9 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/VectorBenchmarkTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/benchmark/VectorBenchmarkTest.java
@@ -30,7 +30,7 @@ import static org.junit.Assert.assertNotNull;
 
 /** */
 public class VectorBenchmarkTest {
-    // todo add benchmarks for other methods in Vector and for other types of Vector and Matrix
+    //TODO: IGNITE-5827, add benchmarks for other methods in Vector and for other types of Vector and Matrix
 
     /** */
     @Test

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/EigenDecompositionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/EigenDecompositionTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/EigenDecompositionTest.java
index d283ce7..76aca0b 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/EigenDecompositionTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/decompositions/EigenDecompositionTest.java
@@ -78,7 +78,7 @@ public class EigenDecompositionTest {
             {0.0d, 1.0d, 0.0d},
             {0.0d, 0.0d, 2.0d},
             {1.0d, 1.0d, 0.0d}}));
-        // todo find out why decomposition of 3X4 matrix throws row index exception
+        // TODO: IGNITE-5828, find out why decomposition of 3X4 matrix throws row index exception
 
         Matrix d = decomposition.getD();
         Matrix v = decomposition.getV();

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixAttributeTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixAttributeTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixAttributeTest.java
index 79cb13a..c645bd7 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixAttributeTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixAttributeTest.java
@@ -27,8 +27,6 @@ import static org.junit.Assert.assertEquals;
 
 /**
  * Attribute tests for matrices.
- *
- * TODO: WIP
  */
 public class MatrixAttributeTest {
     /** */

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageImplementationTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageImplementationTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageImplementationTest.java
index 72daeca..7f1b6b3 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageImplementationTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixStorageImplementationTest.java
@@ -28,7 +28,7 @@ import static org.junit.Assert.assertTrue;
 /**
  * Unit tests for {@link MatrixStorage} implementations.
  *
- * TODO: add attribute tests.
+ * TODO: IGNITE-5723, add attribute tests.
  */
 public class MatrixStorageImplementationTest extends ExternalizeTest<MatrixStorage> {
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/AbstractVectorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/AbstractVectorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/AbstractVectorTest.java
index a7954cd..be7532f 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/AbstractVectorTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/AbstractVectorTest.java
@@ -357,7 +357,7 @@ public class AbstractVectorTest {
      */
     @SuppressWarnings("ClassWithoutNoArgConstructor")
     private AbstractVector getAbstractVector(VectorStorage storage) {
-        return new AbstractVector(storage) { // TODO: find out how to fix warning about missing constructor
+        return new AbstractVector(storage) { // TODO: IGNTIE-5723, find out how to fix warning about missing constructor
             /** {@inheritDoc} */
             @Override public boolean isDense() {
                 return false;
@@ -426,7 +426,7 @@ public class AbstractVectorTest {
      * @return AbstractVector.
      */
     private AbstractVector getAbstractVector() {
-        return new AbstractVector() { // TODO: find out how to fix warning about missing constructor
+        return new AbstractVector() { // TODO: IGNTIE-5723, find out how to fix warning about missing constructor
             /** {@inheritDoc} */
             @Override public boolean isDense() {
                 return false;

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorViewConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorViewConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorViewConstructorTest.java
index 72be324..f07a3fd 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorViewConstructorTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/PivotedVectorViewConstructorTest.java
@@ -177,7 +177,7 @@ public class PivotedVectorViewConstructorTest {
     }
 
     /** */
-    private static class Metric { // todo consider if softer tolerance (like say 0.1 or 0.01) would make sense here
+    private static class Metric { // TODO: IGNITE-5824, consider if softer tolerance (like say 0.1 or 0.01) would make sense here
         /** */
         private final double exp;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorAttributesTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorAttributesTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorAttributesTest.java
index e2f6a40..52232ca 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorAttributesTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorAttributesTest.java
@@ -75,7 +75,7 @@ public class VectorAttributesTest {
             "isRandomAccess", "isDistributed"),
         new Specification(new MatrixVectorView(new DenseLocalOnHeapMatrix(1, 1), 0, 0, 1, 1),
             DenseLocalOnHeapVector.class, "isDense",
-            "isRandomAccess", "isDistributed"), // todo find out why "isSequentialAccess" fails here
+            "isRandomAccess", "isDistributed"), // TODO: IGNTIE-5723, find out why "isSequentialAccess" fails here
         new Specification(new MatrixVectorView(new DenseLocalOffHeapMatrix(1, 1), 0, 0, 1, 1),
             DenseLocalOffHeapVector.class, "isDense",
             "isRandomAccess", "isDistributed"));

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorFoldMapTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorFoldMapTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorFoldMapTest.java
index 676bb17..d18dff2 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorFoldMapTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorFoldMapTest.java
@@ -101,7 +101,7 @@ public class VectorFoldMapTest {
     private void operationVectorTest(BiFunction<Double, Double, Double> operation,
         BiFunction<Vector, Vector, Vector> vecOperation) {
         consumeSampleVectors((v, desc) -> {
-            // TODO find out if more elaborate testing scenario is needed or it's okay as is.
+            // TODO: IGNTIE-5723, find out if more elaborate testing scenario is needed or it's okay as is.
             final int size = v.size();
             final double[] ref = new double[size];
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsTest.java
index 48dcc36..8075b29 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorImplementationsTest.java
@@ -39,7 +39,7 @@ import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
 /** See also: {@link AbstractVectorTest} and {@link VectorToMatrixTest}. */
-public class VectorImplementationsTest { // todo split this to smaller cohesive test classes
+public class VectorImplementationsTest { // TODO: IGNTIE-5723, split this to smaller cohesive test classes
     /** */
     @Test
     public void vectorImplementationsFixturesTest() {
@@ -95,7 +95,7 @@ public class VectorImplementationsTest { // todo split this to smaller cohesive
     public void operateXOutOfBoundsTest() {
         consumeSampleVectors((v, desc) -> {
             if (v instanceof DenseLocalOffHeapVector || v instanceof SparseLocalVector || v instanceof SparseLocalOffHeapVector)
-                return; // todo find out if it's OK to skip by instances here
+                return; // TODO: IGNTIE-5723, find out if it's OK to skip by instances here
 
             boolean expECaught = false;
 
@@ -485,7 +485,7 @@ public class VectorImplementationsTest { // todo split this to smaller cohesive
             @Override public void externalizeTest() {
                 consumeSampleVectors((v, desc) -> {
                     if (v instanceof SparseLocalOffHeapVector)
-                        return; //TODO: wait till SparseLocalOffHeapVector externalization support.
+                        return; //TODO: IGNITE-5801, wait till SparseLocalOffHeapVector externalization support.
 
                     externalizeTest(v);
                 });
@@ -501,7 +501,7 @@ public class VectorImplementationsTest { // todo split this to smaller cohesive
 
     /** */
     private boolean getXOutOfBoundsOK(Vector v) {
-        // todo find out if this is indeed OK
+        // TODO: IGNTIE-5723, find out if this is indeed OK
         return v instanceof RandomVector || v instanceof ConstantVector
             || v instanceof SingleElementVector || v instanceof SingleElementVectorView;
     }
@@ -569,7 +569,7 @@ public class VectorImplementationsTest { // todo split this to smaller cohesive
     private void operationVectorTest(BiFunction<Double, Double, Double> operation,
         BiFunction<Vector, Vector, Vector> vecOperation) {
         consumeSampleVectors((v, desc) -> {
-            // TODO find out if more elaborate testing scenario is needed or it's okay as is.
+            // TODO : IGNTIE-5723, find out if more elaborate testing scenario is needed or it's okay as is.
             final int size = v.size();
             final double[] ref = new double[size];
 
@@ -827,7 +827,7 @@ public class VectorImplementationsTest { // todo split this to smaller cohesive
     }
 
     /** */
-    static class Metric { // todo consider if softer tolerance (like say 0.1 or 0.01) would make sense here
+    static class Metric { //TODO: IGNITE-5824, consider if softer tolerance (like say 0.1 or 0.01) would make sense here
         /** */
         private final double exp;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorIterableTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorIterableTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorIterableTest.java
index 16c2571..6400c80 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorIterableTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorIterableTest.java
@@ -148,7 +148,7 @@ public class VectorIterableTest {
     /** */
     @Test
     public void nonZeroesTest() {
-        // todo make RandomVector constructor that accepts a function and use it here
+        // TODO: IGNTIE-5723, make RandomVector constructor that accepts a function and use it here.
         //  in order to *reliably* test non-zeroes in there
         consumeSampleVectors(
             (v, desc) -> consumeSampleVectorsWithZeroes(v, (vec, numZeroes)

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorToMatrixTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorToMatrixTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorToMatrixTest.java
index 4d5bc56..a003dcf 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorToMatrixTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/vector/VectorToMatrixTest.java
@@ -268,7 +268,7 @@ public class VectorToMatrixTest {
             put(DenseLocalOffHeapVector.class, DenseLocalOffHeapMatrix.class);
             put(RandomVector.class, RandomMatrix.class);
             put(SparseLocalVector.class, SparseLocalOnHeapMatrix.class);
-            put(SingleElementVector.class, null); // todo find out if we need SingleElementMatrix to match, or skip it
+            put(SingleElementVector.class, null); // TODO: IGNTIE-5723, find out if we need SingleElementMatrix to match, or skip it.
             put(ConstantVector.class, null);
             put(FunctionVector.class, null);
             put(PivotedVectorView.class, DenseLocalOnHeapMatrix.class); // IMPL NOTE per fixture
@@ -280,7 +280,7 @@ public class VectorToMatrixTest {
     }
 
     /** */
-    private static class Metric { // todo consider if softer tolerance (like say 0.1 or 0.01) would make sense here
+    private static class Metric { //TODO: IGNITE-5824, consider if softer tolerance (like say 0.1 or 0.01) would make sense here.
         /** */
         private final double exp;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/13184720/modules/ml/src/test/java/org/apache/ignite/ml/regressions/OLSMultipleLinearRegressionTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/regressions/OLSMultipleLinearRegressionTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/regressions/OLSMultipleLinearRegressionTest.java
index 7f76750..c0069b5 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/regressions/OLSMultipleLinearRegressionTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/regressions/OLSMultipleLinearRegressionTest.java
@@ -186,7 +186,7 @@ public class OLSMultipleLinearRegressionTest extends AbstractMultipleLinearRegre
         Assert.assertEquals(0.995479004577296, mdl.calculateRSquared(), 1E-12);
         Assert.assertEquals(0.992465007628826, mdl.calculateAdjustedRSquared(), 1E-12);
 
-        // TODO: uncomment
+        // TODO: IGNITE-5826, uncomment.
         // checkVarianceConsistency(model);
 
         // Estimate model without intercept
@@ -336,7 +336,7 @@ public class OLSMultipleLinearRegressionTest extends AbstractMultipleLinearRegre
         Assert.assertEquals(0.649789742860228, mdl.calculateRSquared(), 1E-12);
         Assert.assertEquals(0.6164363850373927, mdl.calculateAdjustedRSquared(), 1E-12);
 
-        // TODO: uncomment
+        // TODO: IGNITE-5826, uncomment.
         // checkVarianceConsistency(model);
 
         // Estimate the model with no intercept


[18/50] [abbrv] ignite git commit: IGNITE-5754 Web Console agent: Use POST instead of GET for requests.

Posted by yz...@apache.org.
IGNITE-5754 Web Console agent: Use POST instead of GET for requests.


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

Branch: refs/heads/ignite-5658
Commit: abc6e46fb9ec1c5ee228c01943c516ba0f602456
Parents: 95f4abc
Author: Andrey Novikov <an...@gridgain.com>
Authored: Mon Jul 24 10:54:01 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Mon Jul 24 10:54:01 2017 +0700

----------------------------------------------------------------------
 modules/web-console/backend/app/agentSocket.js  |  4 +-
 .../web-console/backend/app/browsersHandler.js  |  2 +-
 .../console/agent/handlers/RestListener.java    |  7 +--
 .../ignite/console/agent/rest/RestExecutor.java | 49 +++++++-------------
 4 files changed, 22 insertions(+), 40 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/abc6e46f/modules/web-console/backend/app/agentSocket.js
----------------------------------------------------------------------
diff --git a/modules/web-console/backend/app/agentSocket.js b/modules/web-console/backend/app/agentSocket.js
index db1deaa..0853339 100644
--- a/modules/web-console/backend/app/agentSocket.js
+++ b/modules/web-console/backend/app/agentSocket.js
@@ -126,7 +126,7 @@ module.exports.factory = function(_) {
          * Send event to agent.
          *
          * @param {String} event - Event name.
-         * @param {Array.<Object>?} args - Transmitted arguments.
+         * @param {Object?} args - Transmitted arguments.
          * @returns {Promise}
          */
         emitEvent(event, ...args) {
@@ -202,7 +202,7 @@ module.exports.factory = function(_) {
                 params[`p${idx + 1}`] = args[idx];
             });
 
-            return this.emitEvent('node:rest', {uri: 'ignite', demo, params, method: 'GET'})
+            return this.emitEvent('node:rest', {uri: 'ignite', demo, params})
                 .then(this.restResultParse);
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/abc6e46f/modules/web-console/backend/app/browsersHandler.js
----------------------------------------------------------------------
diff --git a/modules/web-console/backend/app/browsersHandler.js b/modules/web-console/backend/app/browsersHandler.js
index c4ea532..4fb5088 100644
--- a/modules/web-console/backend/app/browsersHandler.js
+++ b/modules/web-console/backend/app/browsersHandler.js
@@ -179,7 +179,7 @@ module.exports.factory = (_, socketio, configure, errors, mongo) => {
          */
         executeOnNode(agent, demo, params) {
             return agent
-                .then((agentSock) => agentSock.emitEvent('node:rest', {uri: 'ignite', demo, params, method: 'GET'}))
+                .then((agentSock) => agentSock.emitEvent('node:rest', {uri: 'ignite', demo, params}))
                 .then((res) => {
                     if (res.status === 0)
                         return JSON.parse(res.data);

http://git-wip-us.apache.org/repos/asf/ignite/blob/abc6e46f/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/handlers/RestListener.java
----------------------------------------------------------------------
diff --git a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/handlers/RestListener.java b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/handlers/RestListener.java
index c70514d..8855060 100644
--- a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/handlers/RestListener.java
+++ b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/handlers/RestListener.java
@@ -61,11 +61,6 @@ public class RestListener extends AbstractListener {
 
         boolean demo = (boolean)args.get("demo");
 
-        if (!args.containsKey("method"))
-            throw new IllegalArgumentException("Missing method in arguments: " + args);
-
-        String mtd = args.get("method").toString();
-
         Map<String, Object> headers = null;
 
         if (args.containsKey("headers"))
@@ -76,6 +71,6 @@ public class RestListener extends AbstractListener {
         if (args.containsKey("body"))
             body = args.get("body").toString();
 
-        return restExecutor.execute(demo, path, params, mtd, headers, body);
+        return restExecutor.execute(demo, path, params, headers, body);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/abc6e46f/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/rest/RestExecutor.java
----------------------------------------------------------------------
diff --git a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/rest/RestExecutor.java b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/rest/RestExecutor.java
index 3936374..03eca4e 100644
--- a/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/rest/RestExecutor.java
+++ b/modules/web-console/web-agent/src/main/java/org/apache/ignite/console/agent/rest/RestExecutor.java
@@ -90,7 +90,7 @@ public class RestExecutor {
 
     /** */
     private RestResult sendRequest(boolean demo, String path, Map<String, Object> params,
-        String mtd, Map<String, Object> headers, String body) throws IOException {
+        Map<String, Object> headers, String body) throws IOException {
         if (demo && AgentClusterDemo.getDemoUrl() == null) {
             try {
                 AgentClusterDemo.tryStart().await();
@@ -120,36 +120,24 @@ public class RestExecutor {
                     reqBuilder.addHeader(entry.getKey(), entry.getValue().toString());
         }
 
-        if ("GET".equalsIgnoreCase(mtd)) {
+        if (body != null) {
+            MediaType contentType = MediaType.parse("text/plain");
+
+            reqBuilder.post(RequestBody.create(contentType, body));
+        }
+        else {
+            FormBody.Builder formBody = new FormBody.Builder();
+
             if (params != null) {
                 for (Map.Entry<String, Object> entry : params.entrySet()) {
                     if (entry.getValue() != null)
-                        urlBuilder.addQueryParameter(entry.getKey(), entry.getValue().toString());
+                        formBody.add(entry.getKey(), entry.getValue().toString());
                 }
             }
-        }
-        else if ("POST".equalsIgnoreCase(mtd)) {
-            if (body != null) {
-                MediaType contentType = MediaType.parse("text/plain");
-
-                reqBuilder.post(RequestBody.create(contentType, body));
-            }
-            else {
-                FormBody.Builder formBody = new FormBody.Builder();
-
-                if (params != null) {
-                    for (Map.Entry<String, Object> entry : params.entrySet()) {
-                        if (entry.getValue() != null)
-                            formBody.add(entry.getKey(), entry.getValue().toString());
-                    }
-                }
 
-                reqBuilder.post(formBody.build());
-            }
+            reqBuilder.post(formBody.build());
         }
-        else
-            throw new IllegalArgumentException("Unknown HTTP-method: " + mtd);
-
+        
         reqBuilder.url(urlBuilder.build());
 
         try (Response resp = httpClient.newCall(reqBuilder.build()).execute()) {
@@ -180,7 +168,7 @@ public class RestExecutor {
                 "Please ensure that nodes have [ignite-rest-http] module in classpath " +
                 "(was copied from libs/optional to libs folder).");
 
-            throw new ConnectException("Failed connect to node and execute REST command [url=" + urlBuilder + "]");
+            throw new ConnectException("Failed connect to node and execute REST command [url=" + urlBuilder + ", parameters=" + params + "]");
         }
     }
 
@@ -188,21 +176,20 @@ public class RestExecutor {
      * @param demo Is demo node request.
      * @param path Path segment.
      * @param params Params.
-     * @param mtd Method.
      * @param headers Headers.
      * @param body Body.
      */
     public RestResult execute(boolean demo, String path, Map<String, Object> params,
-        String mtd, Map<String, Object> headers, String body) {
+        Map<String, Object> headers, String body) {
         if (log.isDebugEnabled())
-            log.debug("Start execute REST command [method=" + mtd + ", uri=/" + (path == null ? "" : path) +
+            log.debug("Start execute REST command [uri=/" + (path == null ? "" : path) +
                 ", parameters=" + params + "]");
 
         try {
-            return sendRequest(demo, path, params, mtd, headers, body);
+            return sendRequest(demo, path, params, headers, body);
         }
         catch (Exception e) {
-            U.error(log, "Failed to execute REST command [method=" + mtd + ", uri=/" + (path == null ? "" : path) +
+            U.error(log, "Failed to execute REST command [uri=/" + (path == null ? "" : path) +
                 ", parameters=" + params + "]", e);
 
             return RestResult.fail(404, e.getMessage());
@@ -219,6 +206,6 @@ public class RestExecutor {
         params.put("attr", true);
         params.put("mtr", full);
 
-        return sendRequest(demo, "ignite", params, "GET", null, null);
+        return sendRequest(demo, "ignite", params, null, null);
     }
 }


[33/50] [abbrv] ignite git commit: IGNITE-5278: BLAS implemented.

Posted by yz...@apache.org.
IGNITE-5278: BLAS implemented.


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

Branch: refs/heads/ignite-5658
Commit: de259fffb7fa5c0f8f6f7eeb84b86f296fe3bde9
Parents: 1318472
Author: Yury Babak <yb...@gridgain.com>
Authored: Tue Jul 25 20:19:27 2017 +0300
Committer: Igor Sapego <is...@gridgain.com>
Committed: Tue Jul 25 20:19:27 2017 +0300

----------------------------------------------------------------------
 LICENSE                                         |   7 +
 .../ml/math/matrix/ExampleMatrixStorage.java    |   6 +-
 modules/ml/README.txt                           |   6 +
 modules/ml/licenses/bsd3.txt                    |  51 ++
 modules/ml/pom.xml                              |  22 +
 .../java/org/apache/ignite/ml/math/Blas.java    | 484 +++++++++++++++++++
 .../java/org/apache/ignite/ml/math/Matrix.java  |  31 ++
 .../apache/ignite/ml/math/MatrixStorage.java    |   2 +-
 .../apache/ignite/ml/math/OrderedMatrix.java    |  24 +
 .../java/org/apache/ignite/ml/math/Vector.java  |   8 +
 .../decompositions/CholeskyDecomposition.java   |  11 +-
 .../IgniteIntDoubleToDoubleBiFunction.java      |  27 ++
 .../functions/IgniteIntIntToIntBiFunction.java  |  27 ++
 .../ml/math/functions/IgniteTriFunction.java    |  35 ++
 .../ml/math/impls/matrix/AbstractMatrix.java    |  94 +++-
 .../impls/matrix/DenseLocalOnHeapMatrix.java    |  61 ++-
 .../impls/matrix/SparseLocalOnHeapMatrix.java   |  27 ++
 .../storage/matrix/ArrayMatrixStorage.java      |  78 ++-
 .../matrix/DenseOffHeapMatrixStorage.java       |   2 +-
 .../storage/matrix/MatrixDelegateStorage.java   |   2 +-
 .../matrix/SparseDistributedMatrixStorage.java  |   4 +-
 .../matrix/SparseLocalOnHeapMatrixStorage.java  |  18 +
 .../vector/SparseLocalOnHeapVectorStorage.java  |   6 +
 .../impls/vector/AbstractReadOnlyVector.java    |   6 +
 .../ml/math/impls/vector/AbstractVector.java    |   8 +
 .../ml/math/impls/vector/DelegatingVector.java  |   6 +
 .../ml/math/impls/vector/SparseLocalVector.java |  39 ++
 .../apache/ignite/ml/math/util/MatrixUtil.java  |  48 ++
 .../KMeansDistributedClustererTest.java         |  15 +-
 .../org/apache/ignite/ml/math/BlasTest.java     | 357 ++++++++++++++
 .../ignite/ml/math/MathImplMainTestSuite.java   |   3 +-
 .../impls/matrix/MatrixViewConstructorTest.java |   2 +-
 .../storage/matrix/MatrixArrayStorageTest.java  |   6 +-
 33 files changed, 1475 insertions(+), 48 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/LICENSE
----------------------------------------------------------------------
diff --git a/LICENSE b/LICENSE
index c971434..6e77825 100644
--- a/LICENSE
+++ b/LICENSE
@@ -220,6 +220,13 @@ This product bundles SnapTree, which is available under a
 https://github.com/nbronson/snaptree/blob/master/LICENSE.
 
 ==============================================================================
+For netlib-java:
+==============================================================================
+This product bundles netlib-java, which is available under a
+"3-clause BSD" license.  For details, see
+https://github.com/fommil/netlib-java/blob/master/LICENSE.txt.
+
+==============================================================================
 For JSR 166 classes in "org.jsr166" package
 ==============================================================================
 This product bundles JSR-166 classes which are donated to public domain.

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java
----------------------------------------------------------------------
diff --git a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java
index 5dedfbf..1ccb2e2 100644
--- a/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java
+++ b/examples/src/main/ml/org/apache/ignite/examples/ml/math/matrix/ExampleMatrixStorage.java
@@ -23,7 +23,9 @@ import java.io.ObjectOutput;
 import java.util.Arrays;
 
 import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.StorageConstants;
 import org.apache.ignite.ml.math.impls.storage.matrix.ArrayMatrixStorage;
+import org.apache.ignite.ml.math.util.MatrixUtil;
 
 /**
  * Example matrix storage implementation, modeled after {@link ArrayMatrixStorage}.
@@ -117,8 +119,8 @@ class ExampleMatrixStorage implements MatrixStorage {
     }
 
     /** {@inheritDoc} */
-    @Override public double[][] data() {
-        return data;
+    @Override public double[] data() {
+        return MatrixUtil.flatten(data, StorageConstants.ROW_STORAGE_MODE);
     }
 
     /** {@inheritDoc */

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/README.txt
----------------------------------------------------------------------
diff --git a/modules/ml/README.txt b/modules/ml/README.txt
index e0cc093..e85b7a0 100644
--- a/modules/ml/README.txt
+++ b/modules/ml/README.txt
@@ -12,4 +12,10 @@ Based on ideas from Apache Mahout.
 Run from project root:
 mvn clean package -Pml -DskipTests -pl modules/ml -am
 
+Apache binary releases cannot include LGPL dependencies. If you would like to activate native BLAS optimizations
+into your build, you should download the source release
+from Ignite website and do the build with the following maven command:
+
+mvn clean package -Pml,lgpl -DskipTests -pl modules/ml -am
+
 Find generated jars in target folder.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/licenses/bsd3.txt
----------------------------------------------------------------------
diff --git a/modules/ml/licenses/bsd3.txt b/modules/ml/licenses/bsd3.txt
new file mode 100644
index 0000000..d6b30c1
--- /dev/null
+++ b/modules/ml/licenses/bsd3.txt
@@ -0,0 +1,51 @@
+This product binaries redistribute netlib-java which is available under the following license:
+
+Copyright (c) 2013 Samuel Halliday
+Copyright (c) 1992-2011 The University of Tennessee and The University
+                        of Tennessee Research Foundation.  All rights
+                        reserved.
+Copyright (c) 2000-2011 The University of California Berkeley. All
+                        rights reserved.
+Copyright (c) 2006-2011 The University of Colorado Denver.  All rights
+                        reserved.
+
+$COPYRIGHT$
+
+Additional copyrights may follow
+
+$HEADER$
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+- Redistributions of source code must retain the above copyright
+  notice, this list of conditions and the following disclaimer.
+
+- Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions and the following disclaimer listed
+  in this license in the documentation and/or other materials
+  provided with the distribution.
+
+- Neither the name of the copyright holders nor the names of its
+  contributors may be used to endorse or promote products derived from
+  this software without specific prior written permission.
+
+The copyright holders provide no reassurances that the source code
+provided does not infringe any patent, copyright, or any other
+intellectual property rights of third parties.  The copyright holders
+disclaim any liability to any recipient for claims brought against
+recipient by any third party for infringement of that parties
+intellectual property rights.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/pom.xml
----------------------------------------------------------------------
diff --git a/modules/ml/pom.xml b/modules/ml/pom.xml
index d619719..478d8c4 100644
--- a/modules/ml/pom.xml
+++ b/modules/ml/pom.xml
@@ -36,6 +36,7 @@
 
     <properties>
         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+        <netlibjava.version>1.1.2</netlibjava.version>
     </properties>
 
     <dependencies>
@@ -88,6 +89,13 @@
         </dependency>
 
         <dependency>
+            <groupId>com.github.fommil.netlib</groupId>
+            <artifactId>core</artifactId>
+            <version>${netlibjava.version}</version>
+            <type>pom</type>
+        </dependency>
+
+        <dependency>
             <groupId>org.apache.commons</groupId>
             <artifactId>commons-rng-core</artifactId>
             <version>1.0</version>
@@ -101,6 +109,20 @@
 
     </dependencies>
 
+    <profiles>
+        <profile>
+            <id>lgpl</id>
+
+            <dependencies>
+                <dependency>
+                    <groupId>com.github.fommil.netlib</groupId>
+                    <artifactId>all</artifactId>
+                    <version>${netlibjava.version}</version>
+                </dependency>
+            </dependencies>
+        </profile>
+    </profiles>
+
     <build>
         <plugins>
             <plugin>

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/Blas.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Blas.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Blas.java
new file mode 100644
index 0000000..57f994e
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Blas.java
@@ -0,0 +1,484 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math;
+
+import com.github.fommil.netlib.BLAS;
+import com.github.fommil.netlib.F2jBLAS;
+import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
+import it.unimi.dsi.fastutil.ints.IntIterator;
+import it.unimi.dsi.fastutil.ints.IntSet;
+import java.util.Set;
+import org.apache.ignite.ml.math.exceptions.CardinalityException;
+import org.apache.ignite.ml.math.exceptions.MathIllegalArgumentException;
+import org.apache.ignite.ml.math.exceptions.NonSquareMatrixException;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.matrix.SparseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+import org.apache.ignite.ml.math.impls.vector.SparseLocalVector;
+
+/**
+ * Useful subset of BLAS operations.
+ * This class is based on 'BLAS' class from Apache Spark MLlib.
+ */
+public class Blas {
+    /** F2J implementation of BLAS. */
+    transient static private BLAS f2jBlas = new F2jBLAS();
+
+    /** Native implementation of BLAS. F2J implementation will be used as fallback if no native implementation is found
+     */
+    transient static private BLAS nativeBlas = BLAS.getInstance();
+
+    /**
+     * Performs y += a * x
+     *
+     * @param a Scalar a.
+     * @param x Vector x.
+     * @param y Vector y.
+     */
+    public static void axpy(Double a, Vector x, Vector y) {
+        if (x.size() != y.size())
+            throw new CardinalityException(x.size(), y.size());
+
+        if (x.isArrayBased() && y.isArrayBased())
+            axpy(a, x.getStorage().data(), y.getStorage().data());
+        else if (x instanceof SparseLocalVector && y.isArrayBased())
+            axpy(a, (SparseLocalVector)x, y.getStorage().data());
+        else
+            throw new MathIllegalArgumentException("Operation 'axpy' doesn't support this combination of parameters [x="
+                + x.getClass().getName() + ", y="+y.getClass().getName()+"].");
+    }
+
+    /** */
+    private static void axpy(Double a, double[] x, double[] y) {
+        f2jBlas.daxpy(x.length, a, x, 1, y, 1);
+    }
+
+    /** */
+    private static void axpy(Double a, SparseLocalVector x, double[] y) {
+        int xSize = x.size();
+
+        if (a == 1.0) {
+            int k = 0;
+
+            while (k < xSize) {
+                y[k] += x.getX(k);
+                k++;
+            }
+        } else {
+            int k = 0;
+
+            while (k < xSize) {
+                y[k] += a * x.getX(k);
+                k++;
+            }
+        }
+    }
+
+    /**
+     * Returns dot product of vectors x and y.
+     *
+     * @param x Vector x.
+     * @param y Vector y.
+     * @return Dot product of x and y.
+     **/
+    public static Double dot(Vector x, Vector y) {
+        return x.dot(y);
+    }
+
+    /**
+     * Copies Vector x into Vector y. (y = x)
+     *
+     * @param x Vector x.
+     * @param y Vector y.
+     */
+    public void copy(Vector x, Vector y) {
+        int n = y.size();
+
+        if (x.size() != n)
+            throw new CardinalityException(x.size(), n);
+
+        if (y.isArrayBased()) {
+            double[] yData = y.getStorage().data();
+
+            if (x.isArrayBased())
+                System.arraycopy(x.getStorage().data(), 0, y.getStorage().data(), 0, n);
+            else {
+                if (y instanceof SparseLocalVector) {
+                    for (int i = 0; i < n; i++)
+                        yData[i] = x.getX(i);
+                }
+            }
+        } else
+            throw new IllegalArgumentException("Vector y must be array based in copy.");
+    }
+
+
+    /**
+     * Performs in-place multiplication of vector x by a real scalar a. (x = a * x)
+     *
+     * @param a Scalar a.
+     * @param x Vector x.
+     **/
+    public static void scal(Double a, Vector x) {
+        if (x.isArrayBased())
+            f2jBlas.dscal(x.size(), a, x.getStorage().data(), 1);
+        else if (x instanceof SparseLocalVector) {
+            Set<Integer> indexes = ((SparseLocalVector)x).indexes();
+
+            for (Integer i : indexes)
+                x.compute(i, (ind, v) -> v * a);
+        } else
+            throw new IllegalArgumentException();
+    }
+
+    /**
+     * Adds alpha * v * v.t to a matrix in-place. This is the same as BLAS's ?SPR.
+     *
+     * @param u the upper triangular part of the matrix in a [[DenseVector]](column major)
+     */
+    public static void spr(Double alpha, DenseLocalOnHeapVector v, DenseLocalOnHeapVector u) {
+        nativeBlas.dspr("U", v.size(), alpha, v.getStorage().data(), 1, u.getStorage().data());
+    }
+
+    /** */
+    public static void spr(Double alpha, SparseLocalVector v, DenseLocalOnHeapVector u) {
+        int prevNonDfltInd = 0;
+        int startInd = 0;
+        double av;
+        double[] uData = u.getStorage().data();
+
+        for (Integer nonDefaultInd : v.indexes()) {
+            startInd += (nonDefaultInd - prevNonDfltInd) * (nonDefaultInd + prevNonDfltInd + 1) / 2;
+            av = alpha * v.get(nonDefaultInd);
+
+            for (Integer i : v.indexes())
+                if (i <= nonDefaultInd)
+                    uData[startInd + i] += av * v.getX(i);
+
+            prevNonDfltInd = nonDefaultInd;
+        }
+    }
+
+    /**
+     * A := alpha * x * x^T + A
+     * @param alpha a real scalar that will be multiplied to x * x^T^.
+     * @param x the vector x that contains the n elements.
+     * @param a the symmetric matrix A. Size of n x n.
+     */
+    void syr(Double alpha, Vector x, DenseLocalOnHeapMatrix a) {
+        int mA = a.rowSize();
+        int nA = a.columnSize();
+
+        if (mA != nA)
+            throw new NonSquareMatrixException(mA, nA);
+
+        if (mA != x.size())
+            throw new CardinalityException(x.size(), mA);
+
+        // TODO: IGNITE-5535, Process DenseLocalOffHeapVector
+        if (x instanceof DenseLocalOnHeapVector)
+            syr(alpha, x, a);
+        else if (x instanceof SparseLocalVector)
+            syr(alpha, x, a);
+        else
+            throw new IllegalArgumentException("Operation 'syr' does not support vector [class="
+                + x.getClass().getName() + "].");
+    }
+
+    /** */
+    static void syr(Double alpha, DenseLocalOnHeapVector x, DenseLocalOnHeapMatrix a) {
+        int nA = a.rowSize();
+        int mA = a.columnSize();
+
+        nativeBlas.dsyr("U", x.size(), alpha, x.getStorage().data(), 1, a.getStorage().data(), nA);
+
+        // Fill lower triangular part of A
+        int i = 0;
+        while (i < mA) {
+            int j = i + 1;
+
+            while (j < nA) {
+                a.setX(i, j, a.getX(j, i));
+                j++;
+            }
+            i++;
+        }
+    }
+
+    /** */
+    public static void syr(Double alpha, SparseLocalVector x, DenseLocalOnHeapMatrix a) {
+        int mA = a.columnSize();
+
+        for (Integer i : x.indexes()) {
+            double mult = alpha * x.getX(i);
+            for (Integer j : x.indexes())
+                a.getStorage().data()[mA * i + j] += mult * x.getX(j);
+        }
+    }
+
+    /**
+     * For the moment we have no flags indicating if matrix is transposed or not. Therefore all dgemm parameters for
+     * transposition are equal to 'N'.
+     */
+    public static void gemm(Double alpha, Matrix a, DenseLocalOnHeapMatrix b, Double beta, DenseLocalOnHeapMatrix c) {
+        if (alpha == 0.0 && beta == 1.0)
+            return;
+        else if (alpha == 0.0)
+            scal(c, beta);
+        else {
+            if (a instanceof SparseLocalOnHeapMatrix)
+                gemm(alpha, (SparseLocalOnHeapMatrix)a, b, beta, c);
+            else if (a instanceof DenseLocalOnHeapMatrix) {
+                double[] fA = a.getStorage().data();
+                double[] fB = b.getStorage().data();
+                double[] fC = c.getStorage().data();
+
+                nativeBlas.dgemm("N", "N", a.rowSize(), b.columnSize(), a.columnSize(), alpha, fA,
+                    a.rowSize(), fB, b.rowSize(), beta, fC, c.rowSize());
+            } else
+                throw new IllegalArgumentException("Operation 'gemm' doesn't support for matrix [class="
+                    + a.getClass().getName() + "].");
+        }
+    }
+
+    /**
+     * C := alpha * A * B + beta * C
+     * For `SparseMatrix` A.
+     */
+    private static void gemm(Double alpha, SparseLocalOnHeapMatrix a, DenseLocalOnHeapMatrix b, Double beta,
+        DenseLocalOnHeapMatrix c) {
+        int mA = a.rowSize();
+        int nB = b.columnSize();
+        int kA = a.columnSize();
+        int kB = b.rowSize();
+
+        if (kA != kB)
+            throw new CardinalityException(kA, kB);
+
+        if (mA != c.rowSize())
+            throw new CardinalityException(mA, c.rowSize());
+
+        if (nB != c.columnSize())
+            throw new CardinalityException(nB, c.columnSize());
+
+        if (beta != 1.0)
+            scal(c, beta);
+
+        Int2ObjectArrayMap<IntSet> im = a.indexesMap();
+        IntIterator rowsIter = im.keySet().iterator();
+        int row;
+        // We use here this form of iteration instead of 'for' because of nextInt.
+        while (rowsIter.hasNext()) {
+            row = rowsIter.nextInt();
+
+            for (int colInd = 0; colInd < nB; colInd++) {
+                double sum = 0.0;
+
+                IntIterator kIter = im.get(row).iterator();
+                int k;
+
+                while (kIter.hasNext()) {
+                    k = kIter.nextInt();
+                    sum += a.get(row, k) * b.get(k, colInd) * alpha;
+                }
+
+                c.setX(row, colInd, c.getX(row, colInd) + sum);
+            }
+        }
+    }
+
+    /**
+     * y := alpha * A * x + beta * y.
+     *
+     * @param alpha Alpha.
+     * @param a Matrix a.
+     * @param x Vector x.
+     * @param beta Beta.
+     * @param y Vector y.
+     */
+    public static void gemv(double alpha, Matrix a, Vector x, double beta, DenseLocalOnHeapVector y) {
+        checkCardinality(a, x);
+        checkCardinality(a, y);
+
+        if (alpha == 0.0 && beta == 1.0)
+            return;
+
+        if (alpha == 0.0) {
+            scal(y, beta);
+            return;
+        }
+
+        if (a instanceof SparseLocalOnHeapMatrix && x instanceof DenseLocalOnHeapVector)
+            gemv(alpha, (SparseLocalOnHeapMatrix)a, (DenseLocalOnHeapVector)x, beta, y);
+        else if (a instanceof SparseLocalOnHeapMatrix && x instanceof SparseLocalVector)
+            gemv(alpha, (SparseLocalOnHeapMatrix)a, (SparseLocalVector)x, beta, y);
+        else if (a instanceof DenseLocalOnHeapMatrix && x instanceof DenseLocalOnHeapVector)
+            gemv(alpha, (DenseLocalOnHeapMatrix)a, (DenseLocalOnHeapVector)x, beta, y);
+        else if (a instanceof DenseLocalOnHeapMatrix && x instanceof SparseLocalVector)
+            gemv(alpha, (DenseLocalOnHeapMatrix)a, (SparseLocalVector)x, beta, y);
+        else
+            throw new IllegalArgumentException("Operation gemv doesn't support running thist input [matrix=" +
+                a.getClass().getSimpleName() + ", vector=" + x.getClass().getSimpleName()+"].");
+    }
+
+    /**
+     * y := alpha * A * x + beta * y.
+     *
+     * @param alpha Alpha.
+     * @param a Matrix a.
+     * @param x Vector x.
+     * @param beta Beta.
+     * @param y Vector y.
+     */
+    private static void gemv(double alpha, SparseLocalOnHeapMatrix a, DenseLocalOnHeapVector x, double beta,
+        DenseLocalOnHeapVector y) {
+
+        if (beta != 1.0)
+            scal(y, beta);
+
+        IntIterator rowIter = a.indexesMap().keySet().iterator();
+        while (rowIter.hasNext()) {
+            int row = rowIter.nextInt();
+
+            double sum = 0.0;
+            IntIterator colIter = a.indexesMap().get(row).iterator();
+            while (colIter.hasNext()) {
+                int col = colIter.nextInt();
+                sum += alpha * a.getX(row, col) * x.getX(col);
+            }
+
+            y.setX(row, y.getX(row) + sum);
+        }
+    }
+
+    /**
+     * y := alpha * A * x + beta * y.
+     *
+     * @param alpha Alpha.
+     * @param a Matrix a.
+     * @param x Vector x.
+     * @param beta Beta.
+     * @param y Vector y.
+     */
+    private static void gemv(double alpha, DenseLocalOnHeapMatrix a, DenseLocalOnHeapVector x, double beta,
+        DenseLocalOnHeapVector y) {
+        nativeBlas.dgemv("N", a.rowSize(), a.columnSize(), alpha, a.getStorage().data(), a.rowSize(), x.getStorage().data(), 1, beta,
+            y.getStorage().data(), 1);
+    }
+
+    /**
+     * y := alpha * A * x + beta * y.
+     *
+     * @param alpha Alpha.
+     * @param a Matrix a.
+     * @param x Vector x.
+     * @param beta Beta.
+     * @param y Vector y.
+     */
+    private static void gemv(double alpha, SparseLocalOnHeapMatrix a, SparseLocalVector x, double beta,
+        DenseLocalOnHeapVector y) {
+
+
+        if (beta != 1.0)
+            scal(y, beta);
+
+        IntIterator rowIter = a.indexesMap().keySet().iterator();
+        while (rowIter.hasNext()) {
+            int row = rowIter.nextInt();
+
+            double sum = 0.0;
+            IntIterator colIter = a.indexesMap().get(row).iterator();
+            while (colIter.hasNext()) {
+                int col = colIter.nextInt();
+
+                sum += alpha * a.getX(row, col) * x.getX(col);
+            }
+
+            y.set(row, y.get(row) + sum);
+        }
+    }
+
+    /**
+     * y := alpha * A * x + beta * y.
+     *
+     * @param alpha Alpha.
+     * @param a Matrix a.
+     * @param x Vector x.
+     * @param beta Beta.
+     * @param y Vector y.
+     */
+    private static void gemv(double alpha, DenseLocalOnHeapMatrix a, SparseLocalVector x, double beta,
+        DenseLocalOnHeapVector y) {
+        int rowCntrForA = 0;
+        int mA = a.rowSize();
+
+        double[] aData = a.getStorage().data();
+
+        IntSet indexes = x.indexes();
+
+        double[] yValues = y.getStorage().data();
+
+        while (rowCntrForA < mA) {
+            double sum = 0.0;
+
+            IntIterator iter = indexes.iterator();
+            while (iter.hasNext()) {
+                int xIdx = iter.nextInt();
+                sum += x.getX(xIdx) * aData[xIdx * mA + rowCntrForA];
+            }
+
+            yValues[rowCntrForA] = sum * alpha + beta * yValues[rowCntrForA];
+            rowCntrForA++;
+        }
+    }
+
+    /**
+     * M := alpha * M.
+     * @param m Matrix M.
+     * @param alpha Aplha.
+     */
+    private static void scal(Matrix m, double alpha) {
+        if (alpha != 1.0)
+            for (int i = 0; i < m.rowSize(); i++)
+                for (int j = 0; j < m.columnSize(); j++)
+                    m.setX(i, j, m.getX(i, j) * alpha);
+
+    }
+
+    /**
+     * v := alpha * v.
+     * @param v Vector v.
+     * @param alpha Aplha.
+     */
+    private static void scal(Vector v, double alpha) {
+        if (alpha != 1.0)
+            for (int i = 0; i < v.size(); i++)
+                v.compute(i, (ind, val) -> val * alpha);
+    }
+
+    /**
+     * Checks if Matrix A can be multiplied by vector v, if not CardinalityException is thrown.
+     *
+     * @param a Matrix A.
+     * @param v Vector v.
+     */
+    public static void checkCardinality(Matrix a, Vector v) throws CardinalityException {
+        if (a.columnSize() != v.size())
+            throw new CardinalityException(a.columnSize(), v.size());
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/Matrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Matrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Matrix.java
index 2cf4e63..66de1a1 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/Matrix.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Matrix.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.ml.math;
 
 import java.io.Externalizable;
+import java.util.Spliterator;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.ml.math.exceptions.CardinalityException;
 import org.apache.ignite.ml.math.exceptions.IndexException;
@@ -25,6 +26,7 @@ import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
 import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.functions.IgniteTriFunction;
 import org.apache.ignite.ml.math.functions.IntIntToDoubleFunction;
 
 /**
@@ -187,6 +189,27 @@ public interface Matrix extends MetaAttributes, Externalizable, StorageOpsMetric
     public Matrix map(Matrix mtx, IgniteBiFunction<Double, Double, Double> fun);
 
     /**
+     * Gets number of non-zero elements in this matrix.
+     *
+     * @return Number of non-zero elements in this matrix.
+     */
+    public int nonZeroElements();
+
+    /**
+     * Gets spliterator for all values in this matrix.
+     *
+     * @return Spliterator for all values.
+     */
+    public Spliterator<Double> allSpliterator();
+
+    /**
+     * Gets spliterator for all non-zero values in this matrix.
+     *
+     * @return Spliterator for all non-zero values.
+     */
+    public Spliterator<Double> nonZeroSpliterator();
+
+    /**
      * Assigns values from given vector to the specified column in this matrix.
      *
      * @param col Column index.
@@ -515,4 +538,12 @@ public interface Matrix extends MetaAttributes, Externalizable, StorageOpsMetric
     public default void destroy() {
         // No-op.
     }
+
+    /**
+     * Replace matrix entry with value oldVal at (row, col) with result of computing f(row, col, oldVal).
+     * @param row Row.
+     * @param col Column.
+     * @param f Function used for replacing.
+     */
+    public void compute(int row, int col, IgniteTriFunction<Integer, Integer, Double, Double> f);
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixStorage.java
index ccfebe5..3b905bc 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/MatrixStorage.java
@@ -52,7 +52,7 @@ public interface MatrixStorage extends Externalizable, StorageOpsMetrics, Destro
      *
      * @see StorageOpsMetrics#isArrayBased()
      */
-    default public double[][] data() {
+    default public double[] data() {
         return null;
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/OrderedMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/OrderedMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/OrderedMatrix.java
new file mode 100644
index 0000000..2c3acc8
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/OrderedMatrix.java
@@ -0,0 +1,24 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math;
+
+/** Interface for matrix with particular order for storing entities. */
+public interface OrderedMatrix {
+    /** Get access mode. */
+    public int accessMode();
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/Vector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/Vector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/Vector.java
index e1c5df0..5fd39af 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/Vector.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/Vector.java
@@ -26,6 +26,7 @@ import org.apache.ignite.ml.math.exceptions.IndexException;
 import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.functions.IgniteIntDoubleToDoubleBiFunction;
 
 /**
  * A vector interface.
@@ -496,4 +497,11 @@ public interface Vector extends MetaAttributes, Externalizable, StorageOpsMetric
      * @return Vector GUID.
      */
     public IgniteUuid guid();
+
+    /**
+     * Replace vector entry with value oldVal at i with result of computing f(i, oldVal).
+     * @param i Position.
+     * @param f Function used for replacing.
+     **/
+    public void compute(int i, IgniteIntDoubleToDoubleBiFunction f);
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java
index 84028fe..73fbe2c 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/decompositions/CholeskyDecomposition.java
@@ -23,6 +23,7 @@ import org.apache.ignite.ml.math.Vector;
 import org.apache.ignite.ml.math.exceptions.CardinalityException;
 import org.apache.ignite.ml.math.exceptions.NonPositiveDefiniteMatrixException;
 import org.apache.ignite.ml.math.exceptions.NonSymmetricMatrixException;
+import org.apache.ignite.ml.math.util.MatrixUtil;
 
 import static org.apache.ignite.ml.math.util.MatrixUtil.like;
 import static org.apache.ignite.ml.math.util.MatrixUtil.likeVector;
@@ -252,7 +253,7 @@ public class CholeskyDecomposition implements Destroyable {
             throw new CardinalityException(b.rowSize(), m);
 
         final int nColB = b.columnSize();
-        final double[][] x = b.getStorage().data();
+        final double[][] x = MatrixUtil.unflatten(b.getStorage().data(), b.columnSize());
 
         // Solve LY = b
         for (int j = 0; j < m; j++) {
@@ -295,15 +296,13 @@ public class CholeskyDecomposition implements Destroyable {
     /** */
     private double[][] toDoubleArr(Matrix mtx) {
         if (mtx.isArrayBased())
-            return mtx.getStorage().data();
+            return MatrixUtil.unflatten(mtx.getStorage().data(), mtx.columnSize());
 
-        double[][] res = new double[mtx.rowSize()][];
+        double[][] res = new double[mtx.rowSize()][mtx.columnSize()];
 
-        for (int row = 0; row < mtx.rowSize(); row++) {
-            res[row] = new double[mtx.columnSize()];
+        for (int row = 0; row < mtx.rowSize(); row++)
             for (int col = 0; col < mtx.columnSize(); col++)
                 res[row][col] = mtx.get(row, col);
-        }
 
         return res;
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteIntDoubleToDoubleBiFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteIntDoubleToDoubleBiFunction.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteIntDoubleToDoubleBiFunction.java
new file mode 100644
index 0000000..c9a91ae
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteIntDoubleToDoubleBiFunction.java
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math.functions;
+
+import java.io.Serializable;
+
+/** BiFunction (int, double) -> double. */
+@FunctionalInterface
+public interface IgniteIntDoubleToDoubleBiFunction extends Serializable {
+    /** */
+    public double apply(int x, double d);
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteIntIntToIntBiFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteIntIntToIntBiFunction.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteIntIntToIntBiFunction.java
new file mode 100644
index 0000000..bfd472c
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteIntIntToIntBiFunction.java
@@ -0,0 +1,27 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math.functions;
+
+import java.io.Serializable;
+
+/** BiFunction (int, int) -> int. */
+@FunctionalInterface
+public interface IgniteIntIntToIntBiFunction extends Serializable {
+    /** */
+    public int apply(int x, int y);
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteTriFunction.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteTriFunction.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteTriFunction.java
new file mode 100644
index 0000000..3284a00
--- /dev/null
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/functions/IgniteTriFunction.java
@@ -0,0 +1,35 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math.functions;
+
+import java.io.Serializable;
+import java.util.Objects;
+import java.util.function.Function;
+
+/** Serializable TriFunction (A, B, C) -> R. */
+@FunctionalInterface
+public interface IgniteTriFunction<A,B,C,R> extends Serializable {
+    /** */
+    R apply(A a, B b, C c);
+
+    /** */
+    default <V> IgniteTriFunction<A, B, C, V> andThen(Function<? super R, ? extends V> after) {
+        Objects.requireNonNull(after);
+        return (A a, B b, C c) -> after.apply(apply(a, b, c));
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
index 647ebc6..e1efd0c 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/AbstractMatrix.java
@@ -24,6 +24,8 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Random;
+import java.util.Spliterator;
+import java.util.function.Consumer;
 import org.apache.ignite.lang.IgniteUuid;
 import org.apache.ignite.ml.math.Matrix;
 import org.apache.ignite.ml.math.MatrixStorage;
@@ -36,6 +38,7 @@ import org.apache.ignite.ml.math.functions.Functions;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
 import org.apache.ignite.ml.math.functions.IgniteFunction;
+import org.apache.ignite.ml.math.functions.IgniteTriFunction;
 import org.apache.ignite.ml.math.functions.IntIntToDoubleFunction;
 import org.apache.ignite.ml.math.impls.vector.MatrixVectorView;
 
@@ -326,8 +329,7 @@ public abstract class AbstractMatrix implements Matrix {
     /** {@inheritDoc} */
     @Override public Matrix assign(double val) {
         if (sto.isArrayBased())
-            for (double[] column : sto.data())
-                Arrays.fill(column, val);
+                Arrays.fill(sto.data(), val);
         else {
             int rows = rowSize();
             int cols = columnSize();
@@ -421,6 +423,85 @@ public abstract class AbstractMatrix implements Matrix {
     }
 
     /** {@inheritDoc} */
+    @Override public Spliterator<Double> allSpliterator() {
+        return new Spliterator<Double>() {
+            /** {@inheritDoc} */
+            @Override public boolean tryAdvance(Consumer<? super Double> act) {
+                int rLen = rowSize();
+                int cLen = columnSize();
+
+                for (int i = 0; i < rLen; i++)
+                    for (int j = 0; j < cLen; j++)
+                        act.accept(storageGet(i, j));
+
+                return true;
+            }
+
+            /** {@inheritDoc} */
+            @Override public Spliterator<Double> trySplit() {
+                return null; // No Splitting.
+            }
+
+            /** {@inheritDoc} */
+            @Override public long estimateSize() {
+                return rowSize() * columnSize();
+            }
+
+            /** {@inheritDoc} */
+            @Override public int characteristics() {
+                return ORDERED | SIZED;
+            }
+        };
+    }
+
+    /** {@inheritDoc} */
+    @Override public int nonZeroElements() {
+        int cnt = 0;
+
+        for (int i = 0; i < rowSize(); i++)
+            for (int j = 0; j < rowSize(); j++)
+                if (get(i, j) != 0.0)
+                    cnt++;
+
+        return cnt;
+    }
+
+    /** {@inheritDoc} */
+    @Override public Spliterator<Double> nonZeroSpliterator() {
+        return new Spliterator<Double>() {
+            /** {@inheritDoc} */
+            @Override public boolean tryAdvance(Consumer<? super Double> act) {
+                int rLen = rowSize();
+                int cLen = columnSize();
+
+                for (int i = 0; i < rLen; i++)
+                    for (int j = 0; j < cLen; j++) {
+                        double val = storageGet(i, j);
+
+                        if (val != 0.0)
+                            act.accept(val);
+                    }
+                return true;
+            }
+
+            /** {@inheritDoc} */
+            @Override public Spliterator<Double> trySplit() {
+                return null; // No Splitting.
+            }
+
+            /** {@inheritDoc} */
+            @Override public long estimateSize() {
+                return nonZeroElements();
+            }
+
+            /** {@inheritDoc} */
+            @Override public int characteristics() {
+                return ORDERED | SIZED;
+            }
+        };
+    }
+
+    /** {@inheritDoc} */
     @Override public Matrix assignColumn(int col, Vector vec) {
         checkColumnIndex(col);
 
@@ -442,7 +523,7 @@ public abstract class AbstractMatrix implements Matrix {
             throw new CardinalityException(cols, vec.size());
 
         if (sto.isArrayBased() && vec.getStorage().isArrayBased())
-            System.arraycopy(vec.getStorage().data(), 0, sto.data()[row], 0, cols);
+            System.arraycopy(vec.getStorage().data(), 0, sto.data(), cols * row, cols);
         else
             for (int y = 0; y < cols; y++)
                 storageSet(row, y, vec.getX(y));
@@ -623,7 +704,7 @@ public abstract class AbstractMatrix implements Matrix {
             throw new CardinalityException(cols, data.length);
 
         if (sto.isArrayBased())
-            System.arraycopy(data, 0, sto.data()[row], 0, cols);
+            System.arraycopy(data, 0, sto.data(), row * cols, cols);
         else
             for (int y = 0; y < cols; y++)
                 setX(row, y, data[y]);
@@ -880,4 +961,9 @@ public abstract class AbstractMatrix implements Matrix {
 
         return (sto != null ? sto.equals(that.getStorage()) : that.getStorage() == null);
     }
+
+    /** {@inheritDoc} */
+    @Override public void compute(int row, int col, IgniteTriFunction<Integer, Integer, Double, Double> f) {
+        setX(row, col, f.apply(row, col, getX(row, col)));
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrix.java
index f95e0cc..393fff6 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrix.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/DenseLocalOnHeapMatrix.java
@@ -18,6 +18,8 @@
 package org.apache.ignite.ml.math.impls.matrix;
 
 import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.OrderedMatrix;
+import org.apache.ignite.ml.math.StorageConstants;
 import org.apache.ignite.ml.math.Vector;
 import org.apache.ignite.ml.math.impls.storage.matrix.ArrayMatrixStorage;
 import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
@@ -30,7 +32,7 @@ import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
  * local, non-distributed execution is satisfactory and on-heap JVM storage is enough
  * to keep the entire data set.
  */
-public class DenseLocalOnHeapMatrix extends AbstractMatrix {
+public class DenseLocalOnHeapMatrix extends AbstractMatrix implements OrderedMatrix {
     /**
      *
      */
@@ -43,44 +45,89 @@ public class DenseLocalOnHeapMatrix extends AbstractMatrix {
      * @param cols Amount of columns in matrix.
      */
     public DenseLocalOnHeapMatrix(int rows, int cols) {
+        this(rows, cols, StorageConstants.ROW_STORAGE_MODE);
+    }
+
+    /**
+     * @param rows Amount of rows in matrix.
+     * @param cols Amount of columns in matrix.
+     * @param acsMode Storage order (row or column-based).
+     */
+    public DenseLocalOnHeapMatrix(int rows, int cols, int acsMode) {
         assert rows > 0;
         assert cols > 0;
 
-        setStorage(new ArrayMatrixStorage(rows, cols));
+        setStorage(new ArrayMatrixStorage(rows, cols, acsMode));
+    }
+
+    /**
+     * @param mtx Backing data array.
+     * @param acsMode Access mode.
+     */
+    public DenseLocalOnHeapMatrix(double[][] mtx, int acsMode) {
+        assert mtx != null;
+
+        setStorage(new ArrayMatrixStorage(mtx, acsMode));
     }
 
     /**
      * @param mtx Backing data array.
      */
     public DenseLocalOnHeapMatrix(double[][] mtx) {
+        this(mtx, StorageConstants.ROW_STORAGE_MODE);
+    }
+
+    /**
+     * @param mtx Backing data array.
+     * @param acsMode Access mode.
+     */
+    public DenseLocalOnHeapMatrix(double[] mtx, int rows, int acsMode) {
         assert mtx != null;
 
-        setStorage(new ArrayMatrixStorage(mtx));
+        setStorage(new ArrayMatrixStorage(mtx, rows, acsMode));
     }
 
     /**
-     * @param orig Original matrix.
+     * Build new matrix from flat raw array.
      */
+    public DenseLocalOnHeapMatrix(double[] mtx, int rows) {
+        this(mtx, StorageConstants.ROW_STORAGE_MODE, rows);
+    }
+
+    /** */
     private DenseLocalOnHeapMatrix(DenseLocalOnHeapMatrix orig) {
+        this(orig, orig.accessMode());
+    }
+
+    /**
+     * @param orig Original matrix.
+     * @param acsMode Access mode.
+     */
+    private DenseLocalOnHeapMatrix(DenseLocalOnHeapMatrix orig, int acsMode) {
         assert orig != null;
 
-        setStorage(new ArrayMatrixStorage(orig.rowSize(), orig.columnSize()));
+        setStorage(new ArrayMatrixStorage(orig.rowSize(), orig.columnSize(), acsMode));
 
         assign(orig);
     }
 
     /** {@inheritDoc} */
     @Override public Matrix copy() {
-        return new DenseLocalOnHeapMatrix(this);
+        return new DenseLocalOnHeapMatrix(this, accessMode());
     }
 
     /** {@inheritDoc} */
     @Override public Matrix like(int rows, int cols) {
-        return new DenseLocalOnHeapMatrix(rows, cols);
+        return new DenseLocalOnHeapMatrix(rows, cols, getStorage() != null ? accessMode() : StorageConstants.ROW_STORAGE_MODE);
     }
 
     /** {@inheritDoc} */
     @Override public Vector likeVector(int crd) {
         return new DenseLocalOnHeapVector(crd);
     }
+
+    /** */
+    @Override public int accessMode() {
+        return ((ArrayMatrixStorage)getStorage()).accessMode();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrix.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrix.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrix.java
index d711295..d0a5937 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrix.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/matrix/SparseLocalOnHeapMatrix.java
@@ -17,10 +17,14 @@
 
 package org.apache.ignite.ml.math.impls.matrix;
 
+import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
+import it.unimi.dsi.fastutil.ints.IntIterator;
+import it.unimi.dsi.fastutil.ints.IntSet;
 import org.apache.ignite.ml.math.Matrix;
 import org.apache.ignite.ml.math.MatrixStorage;
 import org.apache.ignite.ml.math.StorageConstants;
 import org.apache.ignite.ml.math.Vector;
+import org.apache.ignite.ml.math.functions.IgniteTriFunction;
 import org.apache.ignite.ml.math.impls.storage.matrix.SparseLocalOnHeapMatrixStorage;
 import org.apache.ignite.ml.math.impls.vector.SparseLocalVector;
 
@@ -62,6 +66,24 @@ public class SparseLocalOnHeapMatrix extends AbstractMatrix implements StorageCo
     }
 
     /** {@inheritDoc} */
+    @Override public int nonZeroElements() {
+        int res = 0;
+        IntIterator rowIter = indexesMap().keySet().iterator();
+
+        while (rowIter.hasNext()) {
+            int row = rowIter.nextInt();
+            res += indexesMap().get(row).size();
+        }
+
+        return res;
+    }
+
+    /** */
+    public Int2ObjectArrayMap<IntSet> indexesMap() {
+        return ((SparseLocalOnHeapMatrixStorage)getStorage()).indexesMap();
+    }
+
+    /** {@inheritDoc} */
     @Override public Matrix copy() {
         Matrix cp = like(rowSize(), columnSize());
 
@@ -69,4 +91,9 @@ public class SparseLocalOnHeapMatrix extends AbstractMatrix implements StorageCo
 
         return cp;
     }
+
+    /** {@inheritDoc} */
+    @Override public void compute(int row, int col, IgniteTriFunction<Integer, Integer, Double, Double> f) {
+        ((SparseLocalOnHeapMatrixStorage)getStorage()).compute(row, col, f);
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/ArrayMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/ArrayMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/ArrayMatrixStorage.java
index 397bf93..1f337fd 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/ArrayMatrixStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/ArrayMatrixStorage.java
@@ -22,17 +22,24 @@ import java.io.ObjectInput;
 import java.io.ObjectOutput;
 import java.util.Arrays;
 import org.apache.ignite.ml.math.MatrixStorage;
+import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.functions.IgniteIntIntToIntBiFunction;
+import org.apache.ignite.ml.math.util.MatrixUtil;
 
 /**
  * Array based {@link MatrixStorage} implementation.
  */
 public class ArrayMatrixStorage implements MatrixStorage {
     /** Backing data array. */
-    private double[][] data;
+    private double[] data;
     /** Amount of rows in the matrix. */
     private int rows;
     /** Amount of columns in the matrix. */
     private int cols;
+    /** Mode specifying if this matrix is row-major or column-major. */
+    private int acsMode;
+    /** Index mapper */
+    private IgniteIntIntToIntBiFunction idxMapper;
 
     /**
      *
@@ -46,32 +53,62 @@ public class ArrayMatrixStorage implements MatrixStorage {
      * @param cols Amount of columns in the matrix.
      */
     public ArrayMatrixStorage(int rows, int cols) {
+        this(rows, cols, StorageConstants.ROW_STORAGE_MODE);
+    }
+
+    /** */
+    public ArrayMatrixStorage(int rows, int cols, int acsMode) {
         assert rows > 0;
         assert cols > 0;
 
-        this.data = new double[rows][cols];
+        this.data = new double[rows * cols];
         this.rows = rows;
         this.cols = cols;
+        idxMapper = indexMapper(acsMode);
+        this.acsMode = acsMode;
+    }
+
+    /**
+     * @param data Backing data array.
+     */
+    public ArrayMatrixStorage(double[][] data, int acsMode) {
+        this(MatrixUtil.flatten(data, acsMode), data.length, acsMode);
     }
 
     /**
      * @param data Backing data array.
      */
     public ArrayMatrixStorage(double[][] data) {
+        this(MatrixUtil.flatten(data, StorageConstants.ROW_STORAGE_MODE), data.length);
+    }
+
+    /**
+     * @param data Backing data array.
+     */
+    public ArrayMatrixStorage(double[] data, int rows, int acsMode) {
         assert data != null;
-        assert data[0] != null;
+        assert data.length % rows == 0;
 
         this.data = data;
-        this.rows = data.length;
-        this.cols = data[0].length;
+        this.rows = rows;
+        this.cols = data.length / rows;
+        idxMapper = indexMapper(acsMode);
+        this.acsMode = acsMode;
 
         assert rows > 0;
         assert cols > 0;
     }
 
+    /**
+     * @param data Backing data array.
+     */
+    public ArrayMatrixStorage(double[] data, int rows) {
+        this(data, rows, StorageConstants.ROW_STORAGE_MODE);
+    }
+
     /** {@inheritDoc} */
     @Override public double get(int x, int y) {
-        return data[x][y];
+        return data[idxMapper.apply(x, y)];
     }
 
     /** {@inheritDoc} */
@@ -96,7 +133,7 @@ public class ArrayMatrixStorage implements MatrixStorage {
 
     /** {@inheritDoc} */
     @Override public void set(int x, int y, double v) {
-        data[x][y] = v;
+        data[idxMapper.apply(x, y)] = v;
     }
 
     /** {@inheritDoc} */
@@ -115,14 +152,25 @@ public class ArrayMatrixStorage implements MatrixStorage {
     }
 
     /** {@inheritDoc} */
-    @Override public double[][] data() {
+    @Override public double[] data() {
         return data;
     }
 
+    /**
+     * Get the index mapper for given access mode.
+     *
+     * @param acsMode Access mode.
+     */
+    private IgniteIntIntToIntBiFunction indexMapper(int acsMode) {
+        return acsMode == StorageConstants.ROW_STORAGE_MODE ? (r, c) -> r * cols + c :
+            (r, c) -> c * rows + r;
+    }
+
     /** {@inheritDoc} */
     @Override public void writeExternal(ObjectOutput out) throws IOException {
         out.writeInt(rows);
         out.writeInt(cols);
+        out.writeInt(acsMode);
 
         out.writeObject(data);
     }
@@ -131,8 +179,15 @@ public class ArrayMatrixStorage implements MatrixStorage {
     @Override public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
         rows = in.readInt();
         cols = in.readInt();
+        acsMode = in.readInt();
+        idxMapper = indexMapper(acsMode);
+
+        data = (double[])in.readObject();
+    }
 
-        data = (double[][])in.readObject();
+    /** Get the access mode of this storage. */
+    public int accessMode() {
+        return acsMode;
     }
 
     /** {@inheritDoc} */
@@ -141,7 +196,8 @@ public class ArrayMatrixStorage implements MatrixStorage {
 
         res += res * 37 + rows;
         res += res * 37 + cols;
-        res += res * 37 + Arrays.deepHashCode(data);
+        res += res * 37 + acsMode;
+        res += res * 37 + Arrays.hashCode(data);
 
         return res;
     }
@@ -156,6 +212,6 @@ public class ArrayMatrixStorage implements MatrixStorage {
 
         ArrayMatrixStorage that = (ArrayMatrixStorage)o;
 
-        return Arrays.deepEquals(data, that.data);
+        return acsMode == that.acsMode && Arrays.equals(data, that.data);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
index 7405a4e..f58da65 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/DenseOffHeapMatrixStorage.java
@@ -122,7 +122,7 @@ public class DenseOffHeapMatrixStorage implements MatrixStorage {
     }
 
     /** {@inheritDoc} */
-    @Override public double[][] data() {
+    @Override public double[] data() {
         return null;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixDelegateStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixDelegateStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixDelegateStorage.java
index 1f77d0f..f185479 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixDelegateStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixDelegateStorage.java
@@ -150,7 +150,7 @@ public class MatrixDelegateStorage implements MatrixStorage {
     }
 
     /** {@inheritDoc} */
-    @Override public double[][] data() {
+    @Override public double[] data() {
         return sto.data();
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorage.java
index 1513502..fc7d969 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseDistributedMatrixStorage.java
@@ -116,9 +116,7 @@ public class SparseDistributedMatrixStorage extends CacheUtils implements Matrix
         // Random cache name.
         cfg.setName(ML_CACHE_NAME);
 
-        IgniteCache<IgniteBiTuple<Integer, IgniteUuid>, Map<Integer, Double>> cache = Ignition.localIgnite().getOrCreateCache(cfg);
-
-        return cache;
+        return Ignition.localIgnite().getOrCreateCache(cfg);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java
index b33cb26..daf1d4b 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/matrix/SparseLocalOnHeapMatrixStorage.java
@@ -19,6 +19,8 @@ package org.apache.ignite.ml.math.impls.storage.matrix;
 
 import it.unimi.dsi.fastutil.ints.Int2DoubleOpenHashMap;
 import it.unimi.dsi.fastutil.ints.Int2DoubleRBTreeMap;
+import it.unimi.dsi.fastutil.ints.Int2ObjectArrayMap;
+import it.unimi.dsi.fastutil.ints.IntSet;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -26,6 +28,7 @@ import java.util.HashMap;
 import java.util.Map;
 import org.apache.ignite.ml.math.MatrixStorage;
 import org.apache.ignite.ml.math.StorageConstants;
+import org.apache.ignite.ml.math.functions.IgniteTriFunction;
 
 /**
  * Storage for sparse, local, on-heap matrix.
@@ -225,4 +228,19 @@ public class SparseLocalOnHeapMatrixStorage implements MatrixStorage, StorageCon
         return rows == that.rows && cols == that.cols && acsMode == that.acsMode && stoMode == that.stoMode
             && (sto != null ? sto.equals(that.sto) : that.sto == null);
     }
+
+    /** */
+    public void compute(int row, int col, IgniteTriFunction<Integer, Integer, Double, Double> f) {
+        sto.get(row).compute(col, (c, val) -> f.apply(row, c, val));
+    }
+
+    /** */
+    public Int2ObjectArrayMap<IntSet> indexesMap() {
+        Int2ObjectArrayMap<IntSet> res = new Int2ObjectArrayMap<>();
+
+        for (Integer row : sto.keySet())
+            res.put(row.intValue(), (IntSet)sto.get(row).keySet());
+
+        return res;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
index deef010..3323a07 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/storage/vector/SparseLocalOnHeapVectorStorage.java
@@ -19,6 +19,7 @@ package org.apache.ignite.ml.math.impls.storage.vector;
 
 import it.unimi.dsi.fastutil.ints.Int2DoubleOpenHashMap;
 import it.unimi.dsi.fastutil.ints.Int2DoubleRBTreeMap;
+import it.unimi.dsi.fastutil.ints.IntSet;
 import java.io.IOException;
 import java.io.ObjectInput;
 import java.io.ObjectOutput;
@@ -178,4 +179,9 @@ public class SparseLocalOnHeapVectorStorage implements VectorStorage, StorageCon
 
         return res;
     }
+
+    /** */
+    public IntSet indexes() {
+        return (IntSet)sto.keySet();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractReadOnlyVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractReadOnlyVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractReadOnlyVector.java
index e48542b..1de334f 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractReadOnlyVector.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractReadOnlyVector.java
@@ -22,6 +22,7 @@ import org.apache.ignite.ml.math.Vector;
 import org.apache.ignite.ml.math.VectorStorage;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.functions.IgniteIntDoubleToDoubleBiFunction;
 import org.apache.ignite.ml.math.impls.matrix.FunctionMatrix;
 
 /**
@@ -122,4 +123,9 @@ public abstract class AbstractReadOnlyVector extends AbstractVector {
 
         return new FunctionVector(size(), (idx) -> Math.log1p(get(idx)) / denominator);
     }
+
+    /** {@inheritDoc} */
+    @Override public void compute(int idx, IgniteIntDoubleToDoubleBiFunction f) {
+        throw new UnsupportedOperationException();
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractVector.java
index 83ac837..131a610 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractVector.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/AbstractVector.java
@@ -38,6 +38,7 @@ import org.apache.ignite.ml.math.exceptions.UnsupportedOperationException;
 import org.apache.ignite.ml.math.functions.Functions;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.functions.IgniteIntDoubleToDoubleBiFunction;
 import org.apache.ignite.ml.math.impls.matrix.MatrixView;
 import org.jetbrains.annotations.NotNull;
 
@@ -904,4 +905,11 @@ public abstract class AbstractVector implements Vector {
 
         return (sto != null ? sto.equals(that.sto) : that.sto == null);
     }
+
+    /** {@inheritDoc} */
+    @Override public void compute(int idx, IgniteIntDoubleToDoubleBiFunction f) {
+        storageSet(idx, f.apply(idx, storageGet(idx)));
+        lenSq = 0.0;
+        maxElm = minElm = null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DelegatingVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DelegatingVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DelegatingVector.java
index 48fbd06..1df9acc 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DelegatingVector.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/DelegatingVector.java
@@ -30,6 +30,7 @@ import org.apache.ignite.ml.math.Vector;
 import org.apache.ignite.ml.math.VectorStorage;
 import org.apache.ignite.ml.math.functions.IgniteBiFunction;
 import org.apache.ignite.ml.math.functions.IgniteDoubleFunction;
+import org.apache.ignite.ml.math.functions.IgniteIntDoubleToDoubleBiFunction;
 
 /**
  * Convenient class that can be used to add decorations to an existing vector. Subclasses
@@ -367,6 +368,11 @@ public class DelegatingVector implements Vector {
     }
 
     /** {@inheritDoc} */
+    @Override public void compute(int i, IgniteIntDoubleToDoubleBiFunction f) {
+        dlg.compute(i, f);
+    }
+
+    /** {@inheritDoc} */
     @Override public void destroy() {
         dlg.destroy();
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java
index 9e345bb..bc1e59d 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/impls/vector/SparseLocalVector.java
@@ -17,7 +17,11 @@
 
 package org.apache.ignite.ml.math.impls.vector;
 
+import it.unimi.dsi.fastutil.ints.IntSet;
 import java.util.Map;
+import java.util.Set;
+import java.util.Spliterator;
+import java.util.function.Consumer;
 import org.apache.ignite.ml.math.Matrix;
 import org.apache.ignite.ml.math.StorageConstants;
 import org.apache.ignite.ml.math.Vector;
@@ -77,4 +81,39 @@ public class SparseLocalVector extends AbstractVector implements StorageConstant
         else
             return super.times(x);
     }
+
+    /** Indexes of non-default elements. */
+    public IntSet indexes() {
+        return storage().indexes();
+    }
+
+    /** {@inheritDoc} */
+    @Override public Spliterator<Double> nonZeroSpliterator() {
+        return new Spliterator<Double>() {
+            /** {@inheritDoc} */
+            @Override public boolean tryAdvance(Consumer<? super Double> act) {
+                Set<Integer> indexes = storage().indexes();
+
+                for (Integer index : indexes)
+                    act.accept(storageGet(index));
+
+                return true;
+            }
+
+            /** {@inheritDoc} */
+            @Override public Spliterator<Double> trySplit() {
+                return null; // No Splitting.
+            }
+
+            /** {@inheritDoc} */
+            @Override public long estimateSize() {
+                return storage().indexes().size();
+            }
+
+            /** {@inheritDoc} */
+            @Override public int characteristics() {
+                return ORDERED | SIZED;
+            }
+        };
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java b/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java
index 752929d..c727e44 100644
--- a/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java
+++ b/modules/ml/src/main/java/org/apache/ignite/ml/math/util/MatrixUtil.java
@@ -20,12 +20,14 @@ package org.apache.ignite.ml.math.util;
 import java.util.List;
 import org.apache.ignite.internal.util.GridArgumentCheck;
 import org.apache.ignite.ml.math.Matrix;
+import org.apache.ignite.ml.math.StorageConstants;
 import org.apache.ignite.ml.math.Vector;
 import org.apache.ignite.ml.math.impls.matrix.CacheMatrix;
 import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
 import org.apache.ignite.ml.math.impls.matrix.MatrixView;
 import org.apache.ignite.ml.math.impls.matrix.PivotedMatrixView;
 import org.apache.ignite.ml.math.impls.matrix.RandomMatrix;
+import org.apache.ignite.ml.math.impls.matrix.SparseLocalOnHeapMatrix;
 import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
 
 /**
@@ -116,6 +118,18 @@ public class MatrixUtil {
     }
 
     /** */
+    public static DenseLocalOnHeapMatrix asDense(SparseLocalOnHeapMatrix m, int acsMode) {
+        DenseLocalOnHeapMatrix res = new DenseLocalOnHeapMatrix(m.rowSize(), m.columnSize(), acsMode);
+
+        for (Integer row : m.indexesMap().keySet()) {
+            for (Integer col : m.indexesMap().get(row))
+                res.set(row, col, m.get(row, col));
+        }
+
+        return res;
+    }
+
+    /** */
     private static boolean isCopyLikeSupport(Matrix matrix) {
         return matrix instanceof RandomMatrix || matrix instanceof MatrixView || matrix instanceof CacheMatrix ||
             matrix instanceof PivotedMatrixView;
@@ -152,4 +166,38 @@ public class MatrixUtil {
 
         return res;
     }
+
+    /** */
+    public static double[][] unflatten(double[] fArr, int colsCnt) {
+        int rowsCnt = fArr.length / colsCnt;
+
+        double[][] res = new double[rowsCnt][colsCnt];
+
+        for (int i = 0; i < rowsCnt; i++)
+            for (int j = 0; j < colsCnt; j++)
+                res[i][j] = fArr[i * colsCnt + j];
+
+        return res;
+    }
+
+    /** */
+    public static double[] flatten(double[][] arr, int acsMode) {
+        assert arr != null;
+        assert arr[0] != null;
+
+        int size = arr.length * arr[0].length;
+        int rows = acsMode == StorageConstants.ROW_STORAGE_MODE ? arr.length : arr[0].length;
+        int cols = size / rows;
+
+        double[] res = new double[size];
+
+        int iLim = acsMode == StorageConstants.ROW_STORAGE_MODE ? rows : cols;
+        int jLim = acsMode == StorageConstants.ROW_STORAGE_MODE ? cols : rows;
+
+        for (int i = 0; i < iLim; i++)
+            for (int j = 0; j < jLim; j++)
+                res[i * jLim + j] = arr[i][j];
+
+        return res;
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/test/java/org/apache/ignite/ml/clustering/KMeansDistributedClustererTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/clustering/KMeansDistributedClustererTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/clustering/KMeansDistributedClustererTest.java
index cdc2651..a59b7f9 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/clustering/KMeansDistributedClustererTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/clustering/KMeansDistributedClustererTest.java
@@ -130,8 +130,8 @@ public class KMeansDistributedClustererTest extends GridCommonAbstractTest {
         Vector[] mc = new Vector[centersCnt];
         Arrays.fill(mc, VectorUtils.zeroes(2));
 
-        int centIndex = 0;
-        int totalCount = 0;
+        int centIdx = 0;
+        int totalCnt = 0;
 
         List<Vector> massCenters = new ArrayList<>();
 
@@ -140,12 +140,12 @@ public class KMeansDistributedClustererTest extends GridCommonAbstractTest {
                 DenseLocalOnHeapVector pnt = (DenseLocalOnHeapVector)new DenseLocalOnHeapVector(2).assign(centers.get(count));
                 // pertrubate point on random value.
                 pnt.map(val -> val + rnd.nextDouble() * squareSideLen / 100);
-                mc[centIndex] = mc[centIndex].plus(pnt);
-                points.assignRow(permutation.get(totalCount), pnt);
-                totalCount++;
+                mc[centIdx] = mc[centIdx].plus(pnt);
+                points.assignRow(permutation.get(totalCnt), pnt);
+                totalCnt++;
             }
-            massCenters.add(mc[centIndex].times(1 / (double)count));
-            centIndex++;
+            massCenters.add(mc[centIdx].times(1 / (double)count));
+            centIdx++;
         }
 
         EuclideanDistance dist = new EuclideanDistance();
@@ -169,6 +169,7 @@ public class KMeansDistributedClustererTest extends GridCommonAbstractTest {
         /** */
         List<Vector> orderedNodes;
 
+        /** */
         public OrderedNodesComparator(Vector[] orderedNodes, DistanceMeasure measure) {
             this.orderedNodes = Arrays.asList(orderedNodes);
             this.measure = measure;


[07/50] [abbrv] ignite git commit: IGNITE-5776: Add option to turn on filter reachable addresses in TcpCommunicationSpi. This closes #2317.

Posted by yz...@apache.org.
IGNITE-5776: Add option to turn on filter reachable addresses in TcpCommunicationSpi. This closes #2317.


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

Branch: refs/heads/ignite-5658
Commit: bd7a08e31d03b2c51b225cf388dc1197348a1593
Parents: e285f9d
Author: Evgenii Zhuravlev <ez...@gridgain.com>
Authored: Thu Jul 20 13:32:18 2017 +0300
Committer: Andrey V. Mashenkov <an...@gmail.com>
Committed: Thu Jul 20 13:32:18 2017 +0300

----------------------------------------------------------------------
 .../communication/tcp/TcpCommunicationSpi.java  | 77 ++++++++++++++------
 1 file changed, 56 insertions(+), 21 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/bd7a08e3/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
index 35d3032..5b952e8 100755
--- a/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
+++ b/modules/core/src/main/java/org/apache/ignite/spi/communication/tcp/TcpCommunicationSpi.java
@@ -311,6 +311,9 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter implements Communicati
     /** Default value for {@code TCP_NODELAY} socket option (value is <tt>true</tt>). */
     public static final boolean DFLT_TCP_NODELAY = true;
 
+    /** Default value for {@code FILTER_REACHABLE_ADDRESSES} socket option (value is <tt>false</tt>). */
+    public static final boolean DFLT_FILTER_REACHABLE_ADDRESSES = false;
+
     /** Default received messages threshold for sending ack. */
     public static final int DFLT_ACK_SND_THRESHOLD = 32;
 
@@ -1016,6 +1019,9 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter implements Communicati
     /** {@code TCP_NODELAY} option value for created sockets. */
     private boolean tcpNoDelay = DFLT_TCP_NODELAY;
 
+    /** {@code FILTER_REACHABLE_ADDRESSES} option value for created sockets. */
+    private boolean filterReachableAddresses = DFLT_FILTER_REACHABLE_ADDRESSES;
+
     /** Number of received messages after which acknowledgment is sent. */
     private int ackSndThreshold = DFLT_ACK_SND_THRESHOLD;
 
@@ -1626,6 +1632,33 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter implements Communicati
     }
 
     /**
+     * Gets value for {@code FILTER_REACHABLE_ADDRESSES} socket option.
+     *
+     * @return {@code True} if needed to filter reachable addresses.
+     */
+    public boolean isFilterReachableAddresses() {
+        return filterReachableAddresses;
+    }
+
+    /**
+     * Setting this option to {@code true} enables filter for reachable
+     * addresses on creating tcp client.
+     * <p>
+     * Usually its advised to set this value to {@code false}.
+     * <p>
+     * If not provided, default value is {@link #DFLT_FILTER_REACHABLE_ADDRESSES}.
+     *
+     * @param filterReachableAddresses {@code True} to filter reachable addresses.
+     * @return {@code this} for chaining.
+     */
+    @IgniteSpiConfiguration(optional = true)
+    public TcpCommunicationSpi setFilterReachableAddresses(boolean filterReachableAddresses) {
+        this.filterReachableAddresses = filterReachableAddresses;
+
+        return this;
+    }
+
+    /**
      * Sets receive buffer size for sockets created or accepted by this SPI.
      * <p>
      * If not provided, default is {@link #DFLT_SOCK_BUF_SIZE}.
@@ -2952,35 +2985,37 @@ public class TcpCommunicationSpi extends IgniteSpiAdapter implements Communicati
         if (isExtAddrsExist)
             addrs.addAll(extAddrs);
 
-        Set<InetAddress> allInetAddrs = U.newHashSet(addrs.size());
+        if (filterReachableAddresses) {
+            Set<InetAddress> allInetAddrs = U.newHashSet(addrs.size());
 
-        for (InetSocketAddress addr : addrs) {
-            // Skip unresolved as addr.getAddress() can return null.
-            if(!addr.isUnresolved())
-                allInetAddrs.add(addr.getAddress());
-        }
+            for (InetSocketAddress addr : addrs) {
+                // Skip unresolved as addr.getAddress() can return null.
+                if (!addr.isUnresolved())
+                    allInetAddrs.add(addr.getAddress());
+            }
 
-        List<InetAddress> reachableInetAddrs = U.filterReachable(allInetAddrs);
+            List<InetAddress> reachableInetAddrs = U.filterReachable(allInetAddrs);
 
-        if (reachableInetAddrs.size() < allInetAddrs.size()) {
-            LinkedHashSet<InetSocketAddress> addrs0 = U.newLinkedHashSet(addrs.size());
+            if (reachableInetAddrs.size() < allInetAddrs.size()) {
+                LinkedHashSet<InetSocketAddress> addrs0 = U.newLinkedHashSet(addrs.size());
 
-            List<InetSocketAddress> unreachableInetAddr = new ArrayList<>(allInetAddrs.size() - reachableInetAddrs.size());
+                List<InetSocketAddress> unreachableInetAddr = new ArrayList<>(allInetAddrs.size() - reachableInetAddrs.size());
 
-            for (InetSocketAddress addr : addrs) {
-                if (reachableInetAddrs.contains(addr.getAddress()))
-                    addrs0.add(addr);
-                else
-                    unreachableInetAddr.add(addr);
-            }
+                for (InetSocketAddress addr : addrs) {
+                    if (reachableInetAddrs.contains(addr.getAddress()))
+                        addrs0.add(addr);
+                    else
+                        unreachableInetAddr.add(addr);
+                }
 
-            addrs0.addAll(unreachableInetAddr);
+                addrs0.addAll(unreachableInetAddr);
 
-            addrs = addrs0;
-        }
+                addrs = addrs0;
+            }
 
-        if (log.isDebugEnabled())
-            log.debug("Addresses to connect for node [rmtNode=" + node.id() + ", addrs=" + addrs.toString() + ']');
+            if (log.isDebugEnabled())
+                log.debug("Addresses to connect for node [rmtNode=" + node.id() + ", addrs=" + addrs.toString() + ']');
+        }
 
         boolean conn = false;
         GridCommunicationClient client = null;


[47/50] [abbrv] ignite git commit: ignite-5858 Fixed affinity initialization on new coordinator (broken in aeb9336b3b161ddfff73f17e41cd453409b84a16).

Posted by yz...@apache.org.
ignite-5858 Fixed affinity initialization on new coordinator (broken in aeb9336b3b161ddfff73f17e41cd453409b84a16).


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

Branch: refs/heads/ignite-5658
Commit: b698bbfcaa2056b9792404aef38e427ff323bd57
Parents: 89bba2f
Author: sboikov <sb...@gridgain.com>
Authored: Fri Jul 28 10:25:16 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Fri Jul 28 10:25:16 2017 +0300

----------------------------------------------------------------------
 .../processors/cache/CacheAffinitySharedManager.java   |  2 +-
 .../cache/GridCachePartitionExchangeManager.java       | 13 ++++++++++++-
 .../dht/preloader/GridDhtPartitionsExchangeFuture.java | 10 +++++++++-
 3 files changed, 22 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/b698bbfc/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
index 5a7f634..51834c5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
@@ -1461,7 +1461,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
      * @throws IgniteCheckedException If failed.
      * @return Future completed when caches initialization is done.
      */
-    private IgniteInternalFuture<?> initCoordinatorCaches(final GridDhtPartitionsExchangeFuture fut)
+    public IgniteInternalFuture<?> initCoordinatorCaches(final GridDhtPartitionsExchangeFuture fut)
         throws IgniteCheckedException {
         final List<IgniteInternalFuture<AffinityTopologyVersion>> futs = new ArrayList<>();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/b698bbfc/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
index 6a7258f..f6fa833 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
@@ -1745,6 +1745,9 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
         /** Busy flag used as performance optimization to stop current preloading. */
         private volatile boolean busy;
 
+        /** */
+        private boolean crd;
+
         /**
          * Constructor.
          */
@@ -1940,7 +1943,15 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
 
                             lastInitializedFut = exchFut;
 
-                            exchFut.init();
+                            boolean newCrd = false;
+
+                            if (!crd) {
+                                List<ClusterNode> srvNodes = exchFut.discoCache().serverNodes();
+
+                                crd = newCrd = !srvNodes.isEmpty() && srvNodes.get(0).isLocal();
+                            }
+
+                            exchFut.init(newCrd);
 
                             int dumpCnt = 0;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/b698bbfc/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
index 71e41b0..52a74ab 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
@@ -414,9 +414,10 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     /**
      * Starts activity.
      *
+     * @param newCrd {@code True} if node become coordinator on this exchange.
      * @throws IgniteInterruptedCheckedException If interrupted.
      */
-    public void init() throws IgniteInterruptedCheckedException {
+    public void init(boolean newCrd) throws IgniteInterruptedCheckedException {
         if (isDone())
             return;
 
@@ -489,6 +490,13 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
                         initCachesOnLocalJoin();
                 }
 
+                if (newCrd) {
+                    IgniteInternalFuture<?> fut = cctx.affinity().initCoordinatorCaches(this);
+
+                    if (fut != null)
+                        fut.get();
+                }
+
                 exchange = CU.clientNode(discoEvt.eventNode()) ?
                     onClientNodeEvent(crdNode) :
                     onServerNodeEvent(crdNode);


[22/50] [abbrv] ignite git commit: IGNITE-5123 Reorder ignite plugin provider on Ignite start callback call

Posted by yz...@apache.org.
IGNITE-5123 Reorder ignite plugin provider on Ignite start callback call


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

Branch: refs/heads/ignite-5658
Commit: 24e4d5d31cc494c8c55000aafefd119cc9d879a4
Parents: aeb9336
Author: Evgeniy Ignatiev <ev...@epam.com>
Authored: Mon Jul 24 15:45:10 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Mon Jul 24 15:45:10 2017 +0300

----------------------------------------------------------------------
 .../main/java/org/apache/ignite/internal/IgniteKernal.java   | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/24e4d5d3/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
index 00c1d73..5186409 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgniteKernal.java
@@ -1015,10 +1015,6 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
             // Notify IO manager the second so further components can send and receive messages.
             ctx.io().onKernalStart(active);
 
-            // Start plugins.
-            for (PluginProvider provider : ctx.plugins().allProviders())
-                provider.onIgniteStart();
-
             boolean recon = false;
 
             // Callbacks.
@@ -1049,6 +1045,10 @@ public class IgniteKernal implements IgniteEx, IgniteMXBean, Externalizable {
                 }
             }
 
+            // Start plugins.
+            for (PluginProvider provider : ctx.plugins().allProviders())
+                provider.onIgniteStart();
+
             if (recon)
                 reconnectState.waitFirstReconnect();
 


[30/50] [abbrv] ignite git commit: IGNITE-5770 Refactor PlatformProcessor to PlatformTarget mechanism

Posted by yz...@apache.org.
IGNITE-5770 Refactor PlatformProcessor to PlatformTarget mechanism

This closes #2336


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

Branch: refs/heads/ignite-5658
Commit: bdc9e4b91403595c496a5fa4aca70228665feaaa
Parents: bd7d407
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Tue Jul 25 15:15:43 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Tue Jul 25 15:15:43 2017 +0300

----------------------------------------------------------------------
 .../platform/PlatformAbstractTarget.java        |   6 +-
 .../processors/platform/PlatformIgnition.java   |   5 +-
 .../platform/PlatformNoopProcessor.java         | 132 -----
 .../processors/platform/PlatformProcessor.java  | 216 --------
 .../platform/PlatformProcessorImpl.java         | 554 +++++++++++--------
 .../platform/cluster/PlatformClusterGroup.java  |  29 +
 .../datastructures/PlatformAtomicReference.java |  13 +-
 .../platforms/cpp/core/include/ignite/ignite.h  |   6 +-
 .../include/ignite/impl/compute/compute_impl.h  |   5 +-
 .../cpp/core/include/ignite/impl/ignite_impl.h  | 112 ++--
 .../ignite/impl/interop/interop_target.h        |  16 +-
 modules/platforms/cpp/core/src/ignition.cpp     |  23 +-
 .../cpp/core/src/impl/ignite_environment.cpp    |  37 +-
 .../platforms/cpp/core/src/impl/ignite_impl.cpp |  25 +-
 .../core/src/impl/interop/interop_target.cpp    |  18 +-
 .../cpp/jni/include/ignite/jni/exports.h        |  31 +-
 .../platforms/cpp/jni/include/ignite/jni/java.h |  70 +--
 modules/platforms/cpp/jni/project/vs/module.def |  30 +-
 modules/platforms/cpp/jni/src/exports.cpp       | 116 +---
 modules/platforms/cpp/jni/src/java.cpp          | 518 +----------------
 .../dotnet/Apache.Ignite.Core/Ignition.cs       |  12 +-
 .../Apache.Ignite.Core/Impl/Cache/CacheImpl.cs  |   2 +-
 .../Impl/Cluster/ClusterGroupImpl.cs            |  78 ++-
 .../Impl/Compute/ComputeImpl.cs                 |   6 +-
 .../Impl/Datastream/DataStreamerImpl.cs         |   3 +-
 .../Impl/Datastream/StreamReceiverHolder.cs     |   2 +-
 .../dotnet/Apache.Ignite.Core/Impl/Ignite.cs    | 279 +++++-----
 .../Apache.Ignite.Core/Impl/Log/JavaLogger.cs   |  23 +-
 .../Apache.Ignite.Core/Impl/PlatformTarget.cs   |  18 +-
 .../Impl/Plugin/PluginContext.cs                |   7 +-
 .../Impl/Unmanaged/IgniteJniNativeMethods.cs    |  91 +--
 .../Impl/Unmanaged/UnmanagedUtils.cs            | 308 +----------
 32 files changed, 768 insertions(+), 2023 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformAbstractTarget.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformAbstractTarget.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformAbstractTarget.java
index 5e785e2..4a584f9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformAbstractTarget.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformAbstractTarget.java
@@ -130,7 +130,7 @@ public abstract class PlatformAbstractTarget implements PlatformTarget {
      * @return Dummy value which is never returned.
      * @throws IgniteCheckedException Exception to be thrown.
      */
-    private <T> T throwUnsupported(int type) throws IgniteCheckedException {
+    public static <T> T throwUnsupported(int type) throws IgniteCheckedException {
         throw new IgniteCheckedException("Unsupported operation type: " + type);
     }
 
@@ -142,8 +142,8 @@ public abstract class PlatformAbstractTarget implements PlatformTarget {
      * @param writer Writer.
      * @throws IgniteCheckedException In case of error.
      */
-    protected PlatformListenable readAndListenFuture(BinaryRawReader reader, IgniteInternalFuture fut,
-                                                     PlatformFutureUtils.Writer writer)
+    private PlatformListenable readAndListenFuture(BinaryRawReader reader, IgniteInternalFuture fut,
+                                                   PlatformFutureUtils.Writer writer)
             throws IgniteCheckedException {
         long futId = reader.readLong();
         int futTyp = reader.readInt();

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformIgnition.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformIgnition.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformIgnition.java
index 422e16e..754c69e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformIgnition.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformIgnition.java
@@ -49,9 +49,8 @@ public class PlatformIgnition {
      * @param factoryId Factory ID.
      * @param envPtr Environment pointer.
      * @param dataPtr Optional pointer to additional data required for startup.
-     * @return Ignite instance.
      */
-    public static synchronized PlatformProcessor start(@Nullable String springCfgPath,
+    public static synchronized void start(@Nullable String springCfgPath,
         @Nullable String igniteInstanceName, int factoryId, long envPtr, long dataPtr) {
         if (envPtr <= 0)
             throw new IgniteException("Environment pointer must be positive.");
@@ -78,8 +77,6 @@ public class PlatformIgnition {
             PlatformProcessor old = instances.put(igniteInstanceName, proc);
 
             assert old == null;
-
-            return proc;
         }
         finally {
             Thread.currentThread().setContextClassLoader(oldClsLdr);

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformNoopProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformNoopProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformNoopProcessor.java
index cd170ed..f26826e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformNoopProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformNoopProcessor.java
@@ -23,7 +23,6 @@ import org.apache.ignite.IgniteException;
 import org.apache.ignite.internal.GridKernalContext;
 import org.apache.ignite.internal.processors.GridProcessorAdapter;
 import org.apache.ignite.internal.processors.platform.cache.store.PlatformCacheStore;
-import org.jetbrains.annotations.Nullable;
 
 /**
  * No-op processor.
@@ -61,139 +60,8 @@ public class PlatformNoopProcessor extends GridProcessorAdapter implements Platf
     }
 
     /** {@inheritDoc} */
-    @Override public PlatformTargetProxy cache(@Nullable String name) throws IgniteCheckedException {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy createCache(@Nullable String name) throws IgniteCheckedException {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy getOrCreateCache(@Nullable String name) throws IgniteCheckedException {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy createCacheFromConfig(long memPtr) throws IgniteCheckedException {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy getOrCreateCacheFromConfig(long memPtr) throws IgniteCheckedException {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void destroyCache(@Nullable String name) throws IgniteCheckedException {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy affinity(@Nullable String name) throws IgniteCheckedException {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy dataStreamer(@Nullable String cacheName, boolean keepBinary)
-        throws IgniteCheckedException {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy transactions() {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy projection() throws IgniteCheckedException {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy compute(PlatformTargetProxy grp) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy message(PlatformTargetProxy grp) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy events(PlatformTargetProxy grp) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy services(PlatformTargetProxy grp) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy extensions() {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy extension(int id) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
     @Override public void registerStore(PlatformCacheStore store, boolean convertBinary)
         throws IgniteCheckedException {
         // No-op.
     }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy atomicLong(String name, long initVal, boolean create) throws IgniteException {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void getIgniteConfiguration(long memPtr) {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public void getCacheNames(long memPtr) {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy atomicSequence(String name, long initVal, boolean create) throws IgniteException {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy atomicReference(String name, long memPtr, boolean create) throws IgniteException {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy createNearCache(@Nullable String cacheName, long memPtr) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy getOrCreateNearCache(@Nullable String cacheName, long memPtr) {
-        return null;
-    }
-
-    /** {@inheritDoc} */
-    @Override public boolean loggerIsLevelEnabled(int level) {
-        return false;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void loggerLog(int level, String message, String category, String errorInfo) {
-        // No-op.
-    }
-
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy binaryProcessor() {
-        return null;
-    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessor.java
index 54f33a7..9c17d78 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessor.java
@@ -62,139 +62,6 @@ public interface PlatformProcessor extends GridProcessor {
     public void awaitStart() throws IgniteCheckedException;
 
     /**
-     * Get cache.
-     *
-     * @param name Cache name.
-     * @return Cache.
-     * @throws IgniteCheckedException If failed.
-     */
-    public PlatformTargetProxy cache(@Nullable String name) throws IgniteCheckedException;
-
-    /**
-     * Create cache.
-     *
-     * @param name Cache name.
-     * @return Cache.
-     * @throws IgniteCheckedException If failed.
-     */
-    public PlatformTargetProxy createCache(@Nullable String name) throws IgniteCheckedException;
-
-    /**
-     * Get or create cache.
-     *
-     * @param name Cache name.
-     * @return Cache.
-     * @throws IgniteCheckedException If failed.
-     */
-    public PlatformTargetProxy getOrCreateCache(@Nullable String name) throws IgniteCheckedException;
-
-    /**
-     * Create cache.
-     *
-     * @param memPtr Stream with cache config.
-     * @return Cache.
-     * @throws IgniteCheckedException If failed.
-     */
-    public PlatformTargetProxy createCacheFromConfig(long memPtr) throws IgniteCheckedException;
-
-    /**
-     * Get or create cache.
-     *
-     * @param memPtr Stream with cache config.
-     * @return Cache.
-     * @throws IgniteCheckedException If failed.
-     */
-    public PlatformTargetProxy getOrCreateCacheFromConfig(long memPtr) throws IgniteCheckedException;
-
-    /**
-     * Destroy dynamically created cache.
-     *
-     * @param name Cache name.
-     * @throws IgniteCheckedException If failed.
-     */
-    public void destroyCache(@Nullable String name) throws IgniteCheckedException;
-
-    /**
-     * Get affinity.
-     *
-     * @param name Cache name.
-     * @return Affinity.
-     * @throws IgniteCheckedException If failed.
-     */
-    public PlatformTargetProxy affinity(@Nullable String name) throws IgniteCheckedException;
-
-    /**
-     * Get data streamer.
-     *
-     * @param cacheName Cache name.
-     * @param keepBinary Binary flag.
-     * @return Data streamer.
-     * @throws IgniteCheckedException If failed.
-     */
-    public PlatformTargetProxy dataStreamer(@Nullable String cacheName, boolean keepBinary) throws IgniteCheckedException;
-
-    /**
-     * Get transactions.
-     *
-     * @return Transactions.
-     */
-    public PlatformTargetProxy transactions();
-
-    /**
-     * Get projection.
-     *
-     * @return Projection.
-     * @throws IgniteCheckedException If failed.
-     */
-    public PlatformTargetProxy projection() throws IgniteCheckedException;
-
-    /**
-     * Create interop compute.
-     *
-     * @param grp Cluster group.
-     * @return Compute instance.
-     */
-    public PlatformTargetProxy compute(PlatformTargetProxy grp);
-
-    /**
-     * Create interop messaging.
-     *
-     * @param grp Cluster group.
-     * @return Messaging instance.
-     */
-    public PlatformTargetProxy message(PlatformTargetProxy grp);
-
-    /**
-     * Create interop events.
-     *
-     * @param grp Cluster group.
-     * @return Events instance.
-     */
-    public PlatformTargetProxy events(PlatformTargetProxy grp);
-
-    /**
-     * Create interop services.
-     *
-     * @param grp Cluster group.
-     * @return Services instance.
-     */
-    public PlatformTargetProxy services(PlatformTargetProxy grp);
-
-    /**
-     * Get platform extensions. Override this method to provide any additional targets and operations you need.
-     *
-     * @return Platform extensions.
-     */
-    public PlatformTargetProxy extensions();
-
-    /**
-     * Gets platform extension by id.
-     *
-     * @return Platform extension target.
-     */
-    public PlatformTargetProxy extension(int id);
-
-    /**
      * Register cache store.
      *
      * @param store Store.
@@ -202,87 +69,4 @@ public interface PlatformProcessor extends GridProcessor {
      * @throws IgniteCheckedException If failed.
      */
     public void registerStore(PlatformCacheStore store, boolean convertBinary) throws IgniteCheckedException;
-
-    /**
-     * Get or create AtomicLong.
-     * @param name Name.
-     * @param initVal Initial value.
-     * @param create Create flag.
-     * @return Platform atomic long.
-     */
-    public PlatformTargetProxy atomicLong(String name, long initVal, boolean create);
-
-    /**
-     * Get or create AtomicSequence.
-     * @param name Name.
-     * @param initVal Initial value.
-     * @param create Create flag.
-     * @return Platform atomic long.
-     */
-    public PlatformTargetProxy atomicSequence(String name, long initVal, boolean create);
-
-    /**
-     * Get or create AtomicReference.
-     * @param name Name.
-     * @param memPtr Pointer to a stream with initial value. 0 for null initial value.
-     * @param create Create flag.
-     * @return Platform atomic long.
-     */
-    public PlatformTargetProxy atomicReference(String name, long memPtr, boolean create);
-
-    /**
-     * Gets the configuration of the current Ignite instance.
-     *
-     * @param memPtr Stream to write data to.
-     */
-    public void getIgniteConfiguration(long memPtr);
-
-    /**
-     * Gets the cache names.
-     *
-     * @param memPtr Stream to write data to.
-     */
-    public void getCacheNames(long memPtr);
-
-    /**
-     * Starts a near cache on local node if cache was previously started.
-     *
-     * @param cacheName Cache name.
-     * @param memPtr Pointer to a stream with near cache config. 0 for default config.
-     * @return Cache.
-     */
-    public PlatformTargetProxy createNearCache(@Nullable String cacheName, long memPtr);
-
-    /**
-     * Gets existing near cache with the given name or creates a new one.
-     *
-     * @param cacheName Cache name.
-     * @param memPtr Pointer to a stream with near cache config. 0 for default config.
-     * @return Cache.
-     */
-    public PlatformTargetProxy getOrCreateNearCache(@Nullable String cacheName, long memPtr);
-
-    /**
-     * Gets a value indicating whether Ignite logger has specified level enabled.
-     *
-     * @param level Log level.
-     */
-    public boolean loggerIsLevelEnabled(int level);
-
-    /**
-     * Logs to the Ignite logger.
-     *
-     * @param level Log level.
-     * @param message Message.
-     * @param category Category.
-     * @param errorInfo Error info.
-     */
-    public void loggerLog(int level, String message, String category, String errorInfo);
-
-    /**
-     * Gets the binary processor.
-     *
-     * @return Binary processor.
-     */
-    public PlatformTargetProxy binaryProcessor();
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessorImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessorImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessorImpl.java
index 1da3112..612f154 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessorImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformProcessorImpl.java
@@ -41,17 +41,13 @@ import org.apache.ignite.internal.processors.platform.cache.PlatformCacheExtensi
 import org.apache.ignite.internal.processors.platform.cache.affinity.PlatformAffinity;
 import org.apache.ignite.internal.processors.platform.cache.store.PlatformCacheStore;
 import org.apache.ignite.internal.processors.platform.cluster.PlatformClusterGroup;
-import org.apache.ignite.internal.processors.platform.compute.PlatformCompute;
 import org.apache.ignite.internal.processors.platform.datastreamer.PlatformDataStreamer;
 import org.apache.ignite.internal.processors.platform.datastructures.PlatformAtomicLong;
 import org.apache.ignite.internal.processors.platform.datastructures.PlatformAtomicReference;
 import org.apache.ignite.internal.processors.platform.datastructures.PlatformAtomicSequence;
 import org.apache.ignite.internal.processors.platform.dotnet.PlatformDotNetCacheStore;
-import org.apache.ignite.internal.processors.platform.events.PlatformEvents;
 import org.apache.ignite.internal.processors.platform.memory.PlatformMemory;
 import org.apache.ignite.internal.processors.platform.memory.PlatformOutputStream;
-import org.apache.ignite.internal.processors.platform.messaging.PlatformMessaging;
-import org.apache.ignite.internal.processors.platform.services.PlatformServices;
 import org.apache.ignite.internal.processors.platform.transactions.PlatformTransactions;
 import org.apache.ignite.internal.processors.platform.utils.PlatformConfigurationUtils;
 import org.apache.ignite.internal.processors.platform.utils.PlatformUtils;
@@ -74,7 +70,73 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
  * GridGain platform processor.
  */
 @SuppressWarnings({"ConditionalExpressionWithIdenticalBranches", "unchecked"})
-public class PlatformProcessorImpl extends GridProcessorAdapter implements PlatformProcessor {
+public class PlatformProcessorImpl extends GridProcessorAdapter implements PlatformProcessor, PlatformTarget {
+    /** */
+    private static final int OP_GET_CACHE = 1;
+
+    /** */
+    private static final int OP_CREATE_CACHE = 2;
+
+    /** */
+    private static final int OP_GET_OR_CREATE_CACHE = 3;
+
+    /** */
+    private static final int OP_CREATE_CACHE_FROM_CONFIG = 4;
+
+    /** */
+    private static final int OP_GET_OR_CREATE_CACHE_FROM_CONFIG = 5;
+
+    /** */
+    private static final int OP_DESTROY_CACHE = 6;
+
+    /** */
+    private static final int OP_GET_AFFINITY = 7;
+
+    /** */
+    private static final int OP_GET_DATA_STREAMER = 8;
+
+    /** */
+    private static final int OP_GET_TRANSACTIONS = 9;
+
+    /** */
+    private static final int OP_GET_CLUSTER_GROUP = 10;
+
+    /** */
+    private static final int OP_GET_EXTENSION = 11;
+
+    /** */
+    private static final int OP_GET_ATOMIC_LONG = 12;
+
+    /** */
+    private static final int OP_GET_ATOMIC_REFERENCE = 13;
+
+    /** */
+    private static final int OP_GET_ATOMIC_SEQUENCE = 14;
+
+    /** */
+    private static final int OP_GET_IGNITE_CONFIGURATION = 15;
+
+    /** */
+    private static final int OP_GET_CACHE_NAMES = 16;
+
+    /** */
+    private static final int OP_CREATE_NEAR_CACHE = 17;
+
+    /** */
+    private static final int OP_GET_OR_CREATE_NEAR_CACHE = 18;
+
+    /** */
+    private static final int OP_LOGGER_IS_LEVEL_ENABLED = 19;
+
+    /** */
+    private static final int OP_LOGGER_LOG = 20;
+
+    /** */
+    private static final int OP_GET_BINARY_PROCESSOR = 21;
+
+    /** */
+    private static final int OP_RELEASE_START = 22;
+
     /** Start latch. */
     private final CountDownLatch startLatch = new CountDownLatch(1);
 
@@ -157,7 +219,7 @@ public class PlatformProcessorImpl extends GridProcessorAdapter implements Platf
 
             out.synchronize();
 
-            platformCtx.gateway().onStart(this, mem.pointer());
+            platformCtx.gateway().onStart(new PlatformTargetProxyImpl(this, platformCtx), mem.pointer());
         }
 
         // At this moment all necessary native libraries must be loaded, so we can process with store creation.
@@ -218,321 +280,360 @@ public class PlatformProcessorImpl extends GridProcessorAdapter implements Platf
     }
 
     /** {@inheritDoc} */
-    @Override public PlatformTargetProxy cache(@Nullable String name) throws IgniteCheckedException {
-        IgniteCacheProxy cache = (IgniteCacheProxy)ctx.grid().cache(name);
+    @Override public void registerStore(PlatformCacheStore store, boolean convertBinary)
+        throws IgniteCheckedException {
+        storeLock.readLock().lock();
 
-        if (cache == null)
-            throw new IllegalArgumentException("Cache doesn't exist: " + name);
+        try {
+            if (stopped)
+                throw new IgniteCheckedException("Failed to initialize interop store because node is stopping: " +
+                    store);
 
-        return createPlatformCache(cache);
+            if (started)
+                registerStore0(store, convertBinary);
+            else
+                pendingStores.add(new StoreInfo(store, convertBinary));
+        }
+        finally {
+            storeLock.readLock().unlock();
+        }
     }
 
     /** {@inheritDoc} */
-    @Override public PlatformTargetProxy createCache(@Nullable String name) throws IgniteCheckedException {
-        IgniteCacheProxy cache = (IgniteCacheProxy)ctx.grid().createCache(name);
-
-        assert cache != null;
+    @Override public void onDisconnected(IgniteFuture<?> reconnectFut) throws IgniteCheckedException {
+        platformCtx.gateway().onClientDisconnected();
 
-        return createPlatformCache(cache);
+        // 1) onReconnected is called on all grid components.
+        // 2) After all of grid components have completed their reconnection, reconnectFut is completed.
+        reconnectFut.listen(new CI1<IgniteFuture<?>>() {
+            @Override public void apply(IgniteFuture<?> future) {
+                platformCtx.gateway().onClientReconnected(clusterRestarted);
+            }
+        });
     }
 
     /** {@inheritDoc} */
-    @Override public PlatformTargetProxy getOrCreateCache(@Nullable String name) throws IgniteCheckedException {
-        IgniteCacheProxy cache = (IgniteCacheProxy)ctx.grid().getOrCreateCache(name);
+    @Override public IgniteInternalFuture<?> onReconnected(boolean clusterRestarted) throws IgniteCheckedException {
+        // Save the flag value for callback of reconnectFut.
+        this.clusterRestarted = clusterRestarted;
+
+        return null;
+    }
 
+    /**
+     * Creates new platform cache.
+     */
+    private PlatformTarget createPlatformCache(IgniteCacheProxy cache) {
         assert cache != null;
 
-        return createPlatformCache(cache);
+        return new PlatformCache(platformCtx, cache, false, cacheExts);
     }
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy createCacheFromConfig(long memPtr) throws IgniteCheckedException {
-        BinaryRawReaderEx reader = platformCtx.reader(platformCtx.memory().get(memPtr));
-        CacheConfiguration cfg = PlatformConfigurationUtils.readCacheConfiguration(reader);
+    /**
+     * Checks whether logger level is enabled.
+     *
+     * @param level Level.
+     * @return Result.
+     */
+    private boolean loggerIsLevelEnabled(int level) {
+        IgniteLogger log = ctx.grid().log();
 
-        IgniteCacheProxy cache = reader.readBoolean()
-            ? (IgniteCacheProxy)ctx.grid().createCache(cfg, PlatformConfigurationUtils.readNearConfiguration(reader))
-            : (IgniteCacheProxy)ctx.grid().createCache(cfg);
+        switch (level) {
+            case PlatformLogger.LVL_TRACE:
+                return log.isTraceEnabled();
+            case PlatformLogger.LVL_DEBUG:
+                return log.isDebugEnabled();
+            case PlatformLogger.LVL_INFO:
+                return log.isInfoEnabled();
+            case PlatformLogger.LVL_WARN:
+                return true;
+            case PlatformLogger.LVL_ERROR:
+                return true;
+            default:
+                assert false;
+        }
 
-        return createPlatformCache(cache);
+        return false;
     }
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy getOrCreateCacheFromConfig(long memPtr) throws IgniteCheckedException {
-        BinaryRawReaderEx reader = platformCtx.reader(platformCtx.memory().get(memPtr));
-        CacheConfiguration cfg = PlatformConfigurationUtils.readCacheConfiguration(reader);
+    /**
+     * Logs to the Ignite logger.
+     *
+     * @param level Level.
+     * @param message Message.
+     * @param category Category.
+     * @param errorInfo Exception.
+     */
+    private void loggerLog(int level, String message, String category, String errorInfo) {
+        IgniteLogger log = ctx.grid().log();
 
-        IgniteCacheProxy cache = reader.readBoolean()
-            ? (IgniteCacheProxy)ctx.grid().getOrCreateCache(cfg,
-                    PlatformConfigurationUtils.readNearConfiguration(reader))
-            : (IgniteCacheProxy)ctx.grid().getOrCreateCache(cfg);
+        if (category != null)
+            log = log.getLogger(category);
 
-        return createPlatformCache(cache);
-    }
+        Throwable err = errorInfo == null ? null : new IgniteException("Platform error:" + errorInfo);
 
-    /** {@inheritDoc} */
-    @Override public void destroyCache(@Nullable String name) throws IgniteCheckedException {
-        ctx.grid().destroyCache(name);
+        switch (level) {
+            case PlatformLogger.LVL_TRACE:
+                log.trace(message);
+                break;
+            case PlatformLogger.LVL_DEBUG:
+                log.debug(message);
+                break;
+            case PlatformLogger.LVL_INFO:
+                log.info(message);
+                break;
+            case PlatformLogger.LVL_WARN:
+                log.warning(message, err);
+                break;
+            case PlatformLogger.LVL_ERROR:
+                log.error(message, err);
+                break;
+            default:
+                assert false;
+        }
     }
 
     /** {@inheritDoc} */
-    @Override public PlatformTargetProxy affinity(@Nullable String name) throws IgniteCheckedException {
-        return proxy(new PlatformAffinity(platformCtx, ctx, name));
+    @Override public long processInLongOutLong(int type, long val) throws IgniteCheckedException {
+        switch (type) {
+            case OP_LOGGER_IS_LEVEL_ENABLED: {
+                return loggerIsLevelEnabled((int) val) ? PlatformAbstractTarget.TRUE : PlatformAbstractTarget.FALSE;
+            }
+
+            case OP_RELEASE_START: {
+                releaseStart();
+
+                return 0;
+            }
+        }
+
+        return PlatformAbstractTarget.throwUnsupported(type);
     }
 
     /** {@inheritDoc} */
-    @Override public PlatformTargetProxy dataStreamer(@Nullable String cacheName, boolean keepBinary)
-        throws IgniteCheckedException {
-        IgniteDataStreamer ldr = ctx.dataStream().dataStreamer(cacheName);
+    @Override public long processInStreamOutLong(int type, BinaryRawReaderEx reader) throws IgniteCheckedException {
+        switch (type) {
+            case OP_DESTROY_CACHE: {
+                ctx.grid().destroyCache(reader.readString());
+
+                return 0;
+            }
 
-        ldr.keepBinary(true);
+            case OP_LOGGER_LOG: {
+                loggerLog(reader.readInt(), reader.readString(), reader.readString(), reader.readString());
 
-        return proxy(new PlatformDataStreamer(platformCtx, cacheName, (DataStreamerImpl)ldr, keepBinary));
+                return 0;
+            }
+        }
+
+        return PlatformAbstractTarget.throwUnsupported(type);
     }
 
     /** {@inheritDoc} */
-    @Override public PlatformTargetProxy transactions() {
-        return proxy(new PlatformTransactions(platformCtx));
+    @Override public long processInStreamOutLong(int type, BinaryRawReaderEx reader, PlatformMemory mem) throws IgniteCheckedException {
+        return processInStreamOutLong(type, reader);
     }
 
     /** {@inheritDoc} */
-    @Override public PlatformTargetProxy projection() throws IgniteCheckedException {
-        return proxy(new PlatformClusterGroup(platformCtx, ctx.grid().cluster()));
+    @Override public void processInStreamOutStream(int type, BinaryRawReaderEx reader, BinaryRawWriterEx writer) throws IgniteCheckedException {
+        PlatformAbstractTarget.throwUnsupported(type);
     }
 
     /** {@inheritDoc} */
-    @Override public PlatformTargetProxy compute(PlatformTargetProxy grp) {
-        PlatformClusterGroup grp0 = (PlatformClusterGroup)grp.unwrap();
+    @Override public PlatformTarget processInStreamOutObject(int type, BinaryRawReaderEx reader) throws IgniteCheckedException {
+        switch (type) {
+            case OP_GET_CACHE: {
+                String name = reader.readString();
 
-        return proxy(new PlatformCompute(platformCtx, grp0.projection(), PlatformUtils.ATTR_PLATFORM));
-    }
+                IgniteCacheProxy cache = (IgniteCacheProxy)ctx.grid().cache(name);
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy message(PlatformTargetProxy grp) {
-        PlatformClusterGroup grp0 = (PlatformClusterGroup)grp.unwrap();
+                if (cache == null)
+                    throw new IllegalArgumentException("Cache doesn't exist: " + name);
 
-        return proxy(new PlatformMessaging(platformCtx, grp0.projection().ignite().message(grp0.projection())));
-    }
+                return createPlatformCache(cache);
+            }
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy events(PlatformTargetProxy grp) {
-        PlatformClusterGroup grp0 = (PlatformClusterGroup)grp.unwrap();
+            case OP_CREATE_CACHE: {
+                String name = reader.readString();
 
-        return proxy(new PlatformEvents(platformCtx, grp0.projection().ignite().events(grp0.projection())));
-    }
+                IgniteCacheProxy cache = (IgniteCacheProxy)ctx.grid().createCache(name);
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy services(PlatformTargetProxy grp) {
-        PlatformClusterGroup grp0 = (PlatformClusterGroup)grp.unwrap();
+                return createPlatformCache(cache);
+            }
 
-        return proxy(new PlatformServices(platformCtx, grp0.projection().ignite().services(grp0.projection()), false));
-    }
+            case OP_GET_OR_CREATE_CACHE: {
+                String name = reader.readString();
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy extensions() {
-        return null;
-    }
+                IgniteCacheProxy cache = (IgniteCacheProxy)ctx.grid().getOrCreateCache(name);
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy extension(int id) {
-        if (extensions != null && id < extensions.length) {
-            PlatformPluginExtension ext = extensions[id];
+                return createPlatformCache(cache);
+            }
 
-            if (ext != null)
-                return proxy(ext.createTarget());
-        }
+            case OP_CREATE_CACHE_FROM_CONFIG: {
+                CacheConfiguration cfg = PlatformConfigurationUtils.readCacheConfiguration(reader);
 
-        throw new IgniteException("Platform extension is not registered [id=" + id + ']');
-    }
+                IgniteCacheProxy cache = reader.readBoolean()
+                        ? (IgniteCacheProxy)ctx.grid().createCache(cfg, PlatformConfigurationUtils.readNearConfiguration(reader))
+                        : (IgniteCacheProxy)ctx.grid().createCache(cfg);
 
-    /** {@inheritDoc} */
-    @Override public void registerStore(PlatformCacheStore store, boolean convertBinary)
-        throws IgniteCheckedException {
-        storeLock.readLock().lock();
+                return createPlatformCache(cache);
+            }
 
-        try {
-            if (stopped)
-                throw new IgniteCheckedException("Failed to initialize interop store because node is stopping: " +
-                    store);
+            case OP_GET_OR_CREATE_CACHE_FROM_CONFIG: {
+                CacheConfiguration cfg = PlatformConfigurationUtils.readCacheConfiguration(reader);
 
-            if (started)
-                registerStore0(store, convertBinary);
-            else
-                pendingStores.add(new StoreInfo(store, convertBinary));
-        }
-        finally {
-            storeLock.readLock().unlock();
-        }
-    }
+                IgniteCacheProxy cache = reader.readBoolean()
+                        ? (IgniteCacheProxy)ctx.grid().getOrCreateCache(cfg,
+                        PlatformConfigurationUtils.readNearConfiguration(reader))
+                        : (IgniteCacheProxy)ctx.grid().getOrCreateCache(cfg);
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy atomicLong(String name, long initVal, boolean create) throws IgniteException {
-        GridCacheAtomicLongImpl atomicLong = (GridCacheAtomicLongImpl)ignite().atomicLong(name, initVal, create);
+                return createPlatformCache(cache);
+            }
 
-        if (atomicLong == null)
-            return null;
+            case OP_GET_AFFINITY: {
+                return new PlatformAffinity(platformCtx, ctx, reader.readString());
+            }
 
-        return proxy(new PlatformAtomicLong(platformCtx, atomicLong));
-    }
+            case OP_GET_DATA_STREAMER: {
+                String cacheName = reader.readString();
+                boolean keepBinary = reader.readBoolean();
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy atomicSequence(String name, long initVal, boolean create)
-        throws IgniteException {
-        IgniteAtomicSequence atomicSeq = ignite().atomicSequence(name, initVal, create);
+                IgniteDataStreamer ldr = ctx.dataStream().dataStreamer(cacheName);
 
-        if (atomicSeq == null)
-            return null;
+                ldr.keepBinary(true);
 
-        return proxy(new PlatformAtomicSequence(platformCtx, atomicSeq));
-    }
+                return new PlatformDataStreamer(platformCtx, cacheName, (DataStreamerImpl)ldr, keepBinary);
+            }
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy atomicReference(String name, long memPtr, boolean create)
-        throws IgniteException {
-        PlatformAtomicReference ref = PlatformAtomicReference.createInstance(platformCtx, name, memPtr, create);
+            case OP_GET_EXTENSION: {
+                int id = reader.readInt();
 
-        return ref != null ? proxy(ref) : null;
-    }
+                if (extensions != null && id < extensions.length) {
+                    PlatformPluginExtension ext = extensions[id];
 
-    /** {@inheritDoc} */
-    @Override public void onDisconnected(IgniteFuture<?> reconnectFut) throws IgniteCheckedException {
-        platformCtx.gateway().onClientDisconnected();
+                    if (ext != null) {
+                        return ext.createTarget();
+                    }
+                }
 
-        // 1) onReconnected is called on all grid components.
-        // 2) After all of grid components have completed their reconnection, reconnectFut is completed.
-        reconnectFut.listen(new CI1<IgniteFuture<?>>() {
-            @Override public void apply(IgniteFuture<?> future) {
-                platformCtx.gateway().onClientReconnected(clusterRestarted);
+                throw new IgniteException("Platform extension is not registered [id=" + id + ']');
             }
-        });
-    }
 
-    /** {@inheritDoc} */
-    @Override public IgniteInternalFuture<?> onReconnected(boolean clusterRestarted) throws IgniteCheckedException {
-        // Save the flag value for callback of reconnectFut.
-        this.clusterRestarted = clusterRestarted;
+            case OP_GET_ATOMIC_LONG: {
+                String name = reader.readString();
+                long initVal = reader.readLong();
+                boolean create = reader.readBoolean();
 
-        return null;
-    }
+                GridCacheAtomicLongImpl atomicLong = (GridCacheAtomicLongImpl)ignite().atomicLong(name, initVal, create);
 
-    /** {@inheritDoc} */
-    @Override public void getIgniteConfiguration(long memPtr) {
-        PlatformOutputStream stream = platformCtx.memory().get(memPtr).output();
-        BinaryRawWriterEx writer = platformCtx.writer(stream);
+                if (atomicLong == null)
+                    return null;
 
-        PlatformConfigurationUtils.writeIgniteConfiguration(writer, ignite().configuration());
+                return new PlatformAtomicLong(platformCtx, atomicLong);
+            }
 
-        stream.synchronize();
-    }
+            case OP_GET_ATOMIC_REFERENCE: {
+                String name = reader.readString();
+                Object initVal = reader.readObjectDetached();
+                boolean create = reader.readBoolean();
 
-    /** {@inheritDoc} */
-    @Override public void getCacheNames(long memPtr) {
-        PlatformOutputStream stream = platformCtx.memory().get(memPtr).output();
-        BinaryRawWriterEx writer = platformCtx.writer(stream);
+                return PlatformAtomicReference.createInstance(platformCtx, name, initVal, create);
+            }
 
-        Collection<String> names = ignite().cacheNames();
+            case OP_GET_ATOMIC_SEQUENCE: {
+                String name = reader.readString();
+                long initVal = reader.readLong();
+                boolean create = reader.readBoolean();
 
-        writer.writeInt(names.size());
+                IgniteAtomicSequence atomicSeq = ignite().atomicSequence(name, initVal, create);
 
-        for (String name : names)
-            writer.writeString(name);
+                if (atomicSeq == null)
+                    return null;
 
-        stream.synchronize();
-    }
+                return new PlatformAtomicSequence(platformCtx, atomicSeq);
+            }
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy createNearCache(@Nullable String cacheName, long memPtr) {
-        NearCacheConfiguration cfg = getNearCacheConfiguration(memPtr);
+            case OP_CREATE_NEAR_CACHE: {
+                String cacheName = reader.readString();
 
-        IgniteCacheProxy cache = (IgniteCacheProxy)ctx.grid().createNearCache(cacheName, cfg);
+                NearCacheConfiguration cfg = PlatformConfigurationUtils.readNearConfiguration(reader);
 
-        return createPlatformCache(cache);
-    }
+                IgniteCacheProxy cache = (IgniteCacheProxy)ctx.grid().createNearCache(cacheName, cfg);
 
-    /** {@inheritDoc} */
-    @Override public PlatformTargetProxy getOrCreateNearCache(@Nullable String cacheName, long memPtr) {
-        NearCacheConfiguration cfg = getNearCacheConfiguration(memPtr);
+                return createPlatformCache(cache);
+            }
+
+            case OP_GET_OR_CREATE_NEAR_CACHE: {
+                String cacheName = reader.readString();
 
-        IgniteCacheProxy cache = (IgniteCacheProxy)ctx.grid().getOrCreateNearCache(cacheName, cfg);
+                NearCacheConfiguration cfg = PlatformConfigurationUtils.readNearConfiguration(reader);
 
-        return createPlatformCache(cache);
+                IgniteCacheProxy cache = (IgniteCacheProxy)ctx.grid().getOrCreateNearCache(cacheName, cfg);
+
+                return createPlatformCache(cache);
+            }
+        }
+
+        return PlatformAbstractTarget.throwUnsupported(type);
     }
 
-    /**
-     * Creates new platform cache.
-     */
-    private PlatformTargetProxy createPlatformCache(IgniteCacheProxy cache) {
-        return proxy(new PlatformCache(platformCtx, cache, false, cacheExts));
+    /** {@inheritDoc} */
+    @Override public PlatformTarget processInObjectStreamOutObjectStream(int type, @Nullable PlatformTarget arg,
+                                                                         BinaryRawReaderEx reader,
+                                                                         BinaryRawWriterEx writer)
+            throws IgniteCheckedException {
+        return PlatformAbstractTarget.throwUnsupported(type);
     }
 
     /** {@inheritDoc} */
-    @Override public boolean loggerIsLevelEnabled(int level) {
-        IgniteLogger log = ctx.grid().log();
+    @Override public void processOutStream(int type, BinaryRawWriterEx writer) throws IgniteCheckedException {
+        switch (type) {
+            case OP_GET_IGNITE_CONFIGURATION: {
+                PlatformConfigurationUtils.writeIgniteConfiguration(writer, ignite().configuration());
 
-        switch (level) {
-            case PlatformLogger.LVL_TRACE:
-                return log.isTraceEnabled();
-            case PlatformLogger.LVL_DEBUG:
-                return log.isDebugEnabled();
-            case PlatformLogger.LVL_INFO:
-                return log.isInfoEnabled();
-            case PlatformLogger.LVL_WARN:
-                return true;
-            case PlatformLogger.LVL_ERROR:
-                return true;
-            default:
-                assert false;
+                return;
+            }
+
+            case OP_GET_CACHE_NAMES: {
+                Collection<String> names = ignite().cacheNames();
+
+                writer.writeInt(names.size());
+
+                for (String name : names)
+                    writer.writeString(name);
+
+                return;
+            }
         }
 
-        return false;
+        PlatformAbstractTarget.throwUnsupported(type);
     }
 
     /** {@inheritDoc} */
-    @Override public void loggerLog(int level, String message, String category, String errorInfo) {
-        IgniteLogger log = ctx.grid().log();
+    @Override public PlatformTarget processOutObject(int type) throws IgniteCheckedException {
+        switch (type) {
+            case OP_GET_TRANSACTIONS:
+                return new PlatformTransactions(platformCtx);
 
-        if (category != null)
-            log = log.getLogger(category);
+            case OP_GET_CLUSTER_GROUP:
+                return new PlatformClusterGroup(platformCtx, ctx.grid().cluster());
 
-        Throwable err = errorInfo == null ? null : new IgniteException("Platform error:" + errorInfo);
-
-        switch (level) {
-            case PlatformLogger.LVL_TRACE:
-                log.trace(message);
-                break;
-            case PlatformLogger.LVL_DEBUG:
-                log.debug(message);
-                break;
-            case PlatformLogger.LVL_INFO:
-                log.info(message);
-                break;
-            case PlatformLogger.LVL_WARN:
-                log.warning(message, err);
-                break;
-            case PlatformLogger.LVL_ERROR:
-                log.error(message, err);
-                break;
-            default:
-                assert false;
+            case OP_GET_BINARY_PROCESSOR: {
+                return new PlatformBinaryProcessor(platformCtx);
+            }
         }
+
+        return PlatformAbstractTarget.throwUnsupported(type);
     }
 
     /** {@inheritDoc} */
-    @Override public PlatformTargetProxy binaryProcessor() {
-        return proxy(new PlatformBinaryProcessor(platformCtx));
+    @Override public PlatformAsyncResult processInStreamAsync(int type, BinaryRawReaderEx reader) throws IgniteCheckedException {
+        return PlatformAbstractTarget.throwUnsupported(type);
     }
 
-    /**
-     * Gets the near cache config.
-     *
-     * @param memPtr Memory pointer.
-     * @return Near config.
-     */
-    private NearCacheConfiguration getNearCacheConfiguration(long memPtr) {
-        assert memPtr != 0;
-
-        BinaryRawReaderEx reader = platformCtx.reader(platformCtx.memory().get(memPtr));
-        return PlatformConfigurationUtils.readNearConfiguration(reader);
+    /** {@inheritDoc} */
+    @Override public Exception convertException(Exception e) {
+        return e;
     }
 
     /**
@@ -635,13 +736,6 @@ public class PlatformProcessorImpl extends GridProcessorAdapter implements Platf
     }
 
     /**
-     * Wraps target in a proxy.
-     */
-    private PlatformTargetProxy proxy(PlatformTarget target) {
-        return new PlatformTargetProxyImpl(target, platformCtx);
-    }
-
-    /**
      * Store and manager pair.
      */
     private static class StoreInfo {

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/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 f6e3d2e..7c1c03e 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
@@ -36,6 +36,10 @@ import org.apache.ignite.internal.processors.platform.PlatformAbstractTarget;
 import org.apache.ignite.internal.processors.platform.PlatformContext;
 import org.apache.ignite.internal.processors.platform.PlatformTarget;
 import org.apache.ignite.internal.processors.platform.cache.PlatformCache;
+import org.apache.ignite.internal.processors.platform.compute.PlatformCompute;
+import org.apache.ignite.internal.processors.platform.events.PlatformEvents;
+import org.apache.ignite.internal.processors.platform.messaging.PlatformMessaging;
+import org.apache.ignite.internal.processors.platform.services.PlatformServices;
 import org.apache.ignite.internal.processors.platform.utils.PlatformUtils;
 import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
 import org.jetbrains.annotations.Nullable;
@@ -126,6 +130,19 @@ public class PlatformClusterGroup extends PlatformAbstractTarget {
     /** */
     private static final int OP_PERSISTENT_STORE_METRICS = 30;
 
+    /** */
+    private static final int OP_GET_COMPUTE = 31;
+
+    /** */
+    private static final int OP_GET_MESSAGING = 32;
+
+    /** */
+    private static final int OP_GET_EVENTS = 33;
+
+    /** */
+    private static final int OP_GET_SERVICES = 34;
+
+
     /** Projection. */
     private final ClusterGroupEx prj;
 
@@ -381,6 +398,18 @@ public class PlatformClusterGroup extends PlatformAbstractTarget {
 
             case OP_FOR_SERVERS:
                 return new PlatformClusterGroup(platformCtx, (ClusterGroupEx)prj.forServers());
+
+            case OP_GET_COMPUTE:
+                return new PlatformCompute(platformCtx, prj, PlatformUtils.ATTR_PLATFORM);
+
+            case OP_GET_MESSAGING:
+                return new PlatformMessaging(platformCtx, platformCtx.kernalContext().grid().message(prj));
+
+            case OP_GET_EVENTS:
+                return new PlatformEvents(platformCtx, platformCtx.kernalContext().grid().events(prj));
+
+            case OP_GET_SERVICES:
+                return new PlatformServices(platformCtx, platformCtx.kernalContext().grid().services(prj),false);
         }
 
         return super.processOutObject(type);

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/datastructures/PlatformAtomicReference.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/datastructures/PlatformAtomicReference.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/datastructures/PlatformAtomicReference.java
index a644259..93c0040 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/datastructures/PlatformAtomicReference.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/datastructures/PlatformAtomicReference.java
@@ -23,7 +23,6 @@ import org.apache.ignite.internal.binary.BinaryRawWriterEx;
 import org.apache.ignite.internal.processors.datastructures.GridCacheAtomicReferenceImpl;
 import org.apache.ignite.internal.processors.platform.PlatformAbstractTarget;
 import org.apache.ignite.internal.processors.platform.PlatformContext;
-import org.apache.ignite.internal.processors.platform.memory.PlatformMemory;
 
 /**
  * Platform atomic reference wrapper.
@@ -53,23 +52,15 @@ public class PlatformAtomicReference extends PlatformAbstractTarget {
      *
      * @param ctx Context.
      * @param name Name.
-     * @param memPtr Pointer to a stream with initial value. 0 for default value.
+     * @param initVal Initial value.
      * @param create Create flag.
      * @return Instance of a PlatformAtomicReference, or null when Ignite reference with specific name is null.
      */
-    public static PlatformAtomicReference createInstance(PlatformContext ctx, String name, long memPtr,
+    public static PlatformAtomicReference createInstance(PlatformContext ctx, String name, Object initVal,
         boolean create) {
         assert ctx != null;
         assert name != null;
 
-        Object initVal = null;
-
-        if (memPtr != 0) {
-            try (PlatformMemory mem = ctx.memory().get(memPtr)) {
-                initVal = ctx.reader(mem).readObjectDetached();
-            }
-        }
-
         GridCacheAtomicReferenceImpl atomicRef =
             (GridCacheAtomicReferenceImpl)ctx.kernalContext().grid().atomicReference(name, initVal, create);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/cpp/core/include/ignite/ignite.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/include/ignite/ignite.h b/modules/platforms/cpp/core/include/ignite/ignite.h
index b3b06f0..07134a1 100644
--- a/modules/platforms/cpp/core/include/ignite/ignite.h
+++ b/modules/platforms/cpp/core/include/ignite/ignite.h
@@ -102,7 +102,7 @@ namespace ignite
         template<typename K, typename V>
         cache::Cache<K, V> GetCache(const char* name, IgniteError& err)
         {
-            impl::cache::CacheImpl* cacheImpl = impl.Get()->GetCache<K, V>(name, err);
+            impl::cache::CacheImpl* cacheImpl = impl.Get()->GetCache(name, err);
 
             return cache::Cache<K, V>(cacheImpl);
         }
@@ -139,7 +139,7 @@ namespace ignite
         template<typename K, typename V>
         cache::Cache<K, V> GetOrCreateCache(const char* name, IgniteError& err)
         {
-            impl::cache::CacheImpl* cacheImpl = impl.Get()->GetOrCreateCache<K, V>(name, err);
+            impl::cache::CacheImpl* cacheImpl = impl.Get()->GetOrCreateCache(name, err);
 
             return cache::Cache<K, V>(cacheImpl);
         }
@@ -176,7 +176,7 @@ namespace ignite
         template<typename K, typename V>
         cache::Cache<K, V> CreateCache(const char* name, IgniteError& err)
         {
-            impl::cache::CacheImpl* cacheImpl = impl.Get()->CreateCache<K, V>(name, err);
+            impl::cache::CacheImpl* cacheImpl = impl.Get()->CreateCache(name, err);
 
             return cache::Cache<K, V>(cacheImpl);
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/cpp/core/include/ignite/impl/compute/compute_impl.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/include/ignite/impl/compute/compute_impl.h b/modules/platforms/cpp/core/include/ignite/impl/compute/compute_impl.h
index 4ba1c1c..2b04dcb 100644
--- a/modules/platforms/cpp/core/include/ignite/impl/compute/compute_impl.h
+++ b/modules/platforms/cpp/core/include/ignite/impl/compute/compute_impl.h
@@ -208,7 +208,10 @@ namespace ignite
 
                     out.Synchronize();
 
-                    jobject target = InStreamOutObject(operation, *mem.Get());
+                    IgniteError err;
+                    jobject target = InStreamOutObject(operation, *mem.Get(), err);
+                    IgniteError::ThrowIfNeeded(err);
+
                     std::auto_ptr<common::Cancelable> cancelable(new CancelableImpl(GetEnvironmentPointer(), target));
 
                     return cancelable;

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/cpp/core/include/ignite/impl/ignite_impl.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/include/ignite/impl/ignite_impl.h b/modules/platforms/cpp/core/include/ignite/impl/ignite_impl.h
index baddec4..d1763c4 100644
--- a/modules/platforms/cpp/core/include/ignite/impl/ignite_impl.h
+++ b/modules/platforms/cpp/core/include/ignite/impl/ignite_impl.h
@@ -28,14 +28,34 @@
 #include <ignite/impl/cluster/cluster_group_impl.h>
 #include <ignite/impl/compute/compute_impl.h>
 
+using namespace ignite::impl::interop;
+using namespace ignite::common::concurrent;
+using namespace ignite::impl::binary;
+using namespace ignite::binary;
+
 namespace ignite 
 {
     namespace impl 
     {
+        /*
+        * PlatformProcessor op codes.
+        */
+        struct ProcessorOp
+        {
+            enum Type
+            {
+                GET_CACHE = 1,
+                CREATE_CACHE = 2,
+                GET_OR_CREATE_CACHE = 3,
+                GET_TRANSACTIONS = 9,
+                GET_CLUSTER_GROUP = 10,
+            };
+        };
+
         /**
          * Ignite implementation.
          */
-        class IGNITE_FRIEND_EXPORT IgniteImpl
+        class IGNITE_FRIEND_EXPORT IgniteImpl : private interop::InteropTarget
         {
             typedef common::concurrent::SharedPointer<IgniteEnvironment> SP_IgniteEnvironment;
             typedef common::concurrent::SharedPointer<transactions::TransactionsImpl> SP_TransactionsImpl;
@@ -48,14 +68,9 @@ namespace ignite
              * @param env Environment.
              * @param javaRef Reference to java object.
              */
-            IgniteImpl(SP_IgniteEnvironment env, jobject javaRef);
+            IgniteImpl(SP_IgniteEnvironment env);
             
             /**
-             * Destructor.
-             */
-            ~IgniteImpl();
-
-            /**
              * Get name of the Ignite.
              *
              * @return Name.
@@ -82,23 +97,9 @@ namespace ignite
              * @param name Cache name.
              * @param err Error.
              */
-            template<typename K, typename V> 
             cache::CacheImpl* GetCache(const char* name, IgniteError& err)
             {
-                ignite::jni::java::JniErrorInfo jniErr;
-
-                jobject cacheJavaRef = env.Get()->Context()->ProcessorCache(javaRef, name, &jniErr);
-
-                if (!cacheJavaRef)
-                {
-                    IgniteError::SetError(jniErr.code, jniErr.errCls, jniErr.errMsg, err);
-
-                    return NULL;
-                }
-
-                char* name0 = common::CopyChars(name);
-
-                return new cache::CacheImpl(name0, env, cacheJavaRef);
+                return GetOrCreateCache(name, err, ProcessorOp::GET_CACHE);
             }
 
             /**
@@ -107,23 +108,9 @@ namespace ignite
              * @param name Cache name.
              * @param err Error.
              */
-            template<typename K, typename V>
             cache::CacheImpl* GetOrCreateCache(const char* name, IgniteError& err)
             {
-                ignite::jni::java::JniErrorInfo jniErr;
-
-                jobject cacheJavaRef = env.Get()->Context()->ProcessorGetOrCreateCache(javaRef, name, &jniErr);
-
-                if (!cacheJavaRef)
-                {
-                    IgniteError::SetError(jniErr.code, jniErr.errCls, jniErr.errMsg, err);
-
-                    return NULL;
-                }
-
-                char* name0 = common::CopyChars(name);
-
-                return new cache::CacheImpl(name0, env, cacheJavaRef);
+                return GetOrCreateCache(name, err, ProcessorOp::GET_OR_CREATE_CACHE);
             }
 
             /**
@@ -132,23 +119,9 @@ namespace ignite
              * @param name Cache name.
              * @param err Error.
              */
-            template<typename K, typename V>
             cache::CacheImpl* CreateCache(const char* name, IgniteError& err)
             {
-                ignite::jni::java::JniErrorInfo jniErr;
-
-                jobject cacheJavaRef = env.Get()->Context()->ProcessorCreateCache(javaRef, name, &jniErr);
-
-                if (!cacheJavaRef)
-                {
-                    IgniteError::SetError(jniErr.code, jniErr.errCls, jniErr.errMsg, err);
-
-                    return NULL;
-                }
-
-                char* name0 = common::CopyChars(name);
-
-                return new cache::CacheImpl(name0, env, cacheJavaRef);
+                return GetOrCreateCache(name, err, ProcessorOp::CREATE_CACHE);
             }
 
             /**
@@ -227,9 +200,6 @@ namespace ignite
             /** Environment. */
             SP_IgniteEnvironment env;
 
-            /** Native Java counterpart. */
-            jobject javaRef;
-
             /** Transactions implementaion. */
             SP_TransactionsImpl txImpl;
 
@@ -237,6 +207,38 @@ namespace ignite
             cluster::SP_ClusterGroupImpl prjImpl;
 
             IGNITE_NO_COPY_ASSIGNMENT(IgniteImpl)
+
+            /**
+            * Get or create cache.
+            *
+            * @param name Cache name.
+            * @param err Error.
+            * @param op Operation code.
+            */
+            cache::CacheImpl* GetOrCreateCache(const char* name, IgniteError& err, int32_t op)
+            {
+                SharedPointer<InteropMemory> mem = env.Get()->AllocateMemory();
+                InteropMemory* mem0 = mem.Get();
+                InteropOutputStream out(mem0);
+                BinaryWriterImpl writer(&out, env.Get()->GetTypeManager());
+                BinaryRawWriter rawWriter(&writer);
+
+                rawWriter.WriteString(name);
+
+                out.Synchronize();
+
+                jobject cacheJavaRef = InStreamOutObject(op, *mem0, err);
+
+                if (!cacheJavaRef)
+                {
+                    return NULL;
+                }
+
+                char* name0 = common::CopyChars(name);
+
+                return new cache::CacheImpl(name0, env, cacheJavaRef);
+            }
+
         };
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/cpp/core/include/ignite/impl/interop/interop_target.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/include/ignite/impl/interop/interop_target.h b/modules/platforms/cpp/core/include/ignite/impl/interop/interop_target.h
index 0384dcc..29a3a2d 100644
--- a/modules/platforms/cpp/core/include/ignite/impl/interop/interop_target.h
+++ b/modules/platforms/cpp/core/include/ignite/impl/interop/interop_target.h
@@ -60,6 +60,16 @@ namespace ignite
                 InteropTarget(ignite::common::concurrent::SharedPointer<IgniteEnvironment> env, jobject javaRef);
 
                 /**
+                * Constructor used to create new instance.
+                *
+                * @param env Environment.
+                * @param javaRef Reference to java object.
+                * @param javaRef Whether javaRef release in destructor should be skipped.
+                */
+                InteropTarget(ignite::common::concurrent::SharedPointer<IgniteEnvironment> env, jobject javaRef, 
+                    bool skipJavaRefRelease);
+
+                /**
                  * Destructor.
                  */
                 virtual ~InteropTarget();
@@ -139,9 +149,10 @@ namespace ignite
                  *
                  * @param opType Type of operation.
                  * @param outInMem Input and output memory.
+                 * @param err Error.
                  * @return Java object references.
                  */
-                jobject InStreamOutObject(int32_t opType, InteropMemory& outInMem);
+                jobject InStreamOutObject(int32_t opType, InteropMemory& outInMem, IgniteError& err);
 
                 /**
                 * Internal out-in operation.
@@ -190,6 +201,9 @@ namespace ignite
                 /** Handle to Java object. */
                 jobject javaRef;
 
+                /** javaRef release flag. */
+                bool skipJavaRefRelease;
+
                 IGNITE_NO_COPY_ASSIGNMENT(InteropTarget)
 
                 /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/cpp/core/src/ignition.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/src/ignition.cpp b/modules/platforms/cpp/core/src/ignition.cpp
index e12a208..bc25b07 100644
--- a/modules/platforms/cpp/core/src/ignition.cpp
+++ b/modules/platforms/cpp/core/src/ignition.cpp
@@ -301,13 +301,13 @@ namespace ignite
         stream.WriteBool(false);
         stream.Synchronize();
 
-        jobject javaRef = ctx.Get()->IgnitionStart(&springCfgPath0[0], namep, 2, mem.PointerLong(), &jniErr);
+        ctx.Get()->IgnitionStart(&springCfgPath0[0], namep, 2, mem.PointerLong(), &jniErr);
 
         // Releasing control over environment as it is controlled by Java at this point.
         // Even if the call has failed environment are going to be released by the Java.
         envTarget.release();
 
-        if (!javaRef)
+        if (!env.Get()->GetProcessor())
         {
             IgniteError::SetError(jniErr.code, jniErr.errCls, jniErr.errMsg, err);
 
@@ -323,7 +323,7 @@ namespace ignite
 
         env.Get()->ProcessorReleaseStart();
 
-        IgniteImpl* impl = new IgniteImpl(env, javaRef);
+        IgniteImpl* impl = new IgniteImpl(env);
 
         return Ignite(impl);
     }
@@ -383,22 +383,9 @@ namespace ignite
                         SharedPointer<IgniteEnvironment>* env =
                             static_cast<SharedPointer<IgniteEnvironment>*>(hnds->target);
 
-                        // 4. Get fresh node reference.
-                        jobject ref = ctx.Get()->IgnitionInstance(name0, &jniErr);
+                        IgniteImpl* impl = new IgniteImpl(*env);
 
-                        if (err.GetCode() == IgniteError::IGNITE_SUCCESS) {
-                            if (ref)
-                            {
-                                IgniteImpl* impl = new IgniteImpl(*env, ref);
-
-                                res = Ignite(impl);
-                            }
-                            else
-                                // Error: concurrent node stop.
-                                err = IgniteError(IgniteError::IGNITE_ERR_GENERIC,
-                                    "Failed to get Ignite instance because it was stopped concurrently.");
-
-                        }
+                        res = Ignite(impl);
                     }
                     else
                         // Error: no node with the given name.

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/cpp/core/src/impl/ignite_environment.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/src/impl/ignite_environment.cpp b/modules/platforms/cpp/core/src/impl/ignite_environment.cpp
index 4e78f09..e5ce004 100644
--- a/modules/platforms/cpp/core/src/impl/ignite_environment.cpp
+++ b/modules/platforms/cpp/core/src/impl/ignite_environment.cpp
@@ -61,7 +61,30 @@ namespace ignite
                 ON_START = 49,
                 ON_STOP = 50,
                 COMPUTE_TASK_LOCAL_JOB_RESULT = 60,
-                COMPUTE_JOB_EXECUTE_LOCAL = 61
+                COMPUTE_JOB_EXECUTE_LOCAL = 61,
+            };
+        };
+
+        /*
+        * PlatformProcessor op codes.
+        */
+        struct ProcessorOp
+        {
+            enum Type
+            {
+                GET_BINARY_PROCESSOR = 21,
+                RELEASE_START = 22
+            };
+        };
+
+        /*
+         * PlatformClusterGroup op codes.
+         */
+        struct ClusterGroupOp
+        {
+            enum Type
+            {
+                GET_COMPUTE = 31
             };
         };
 
@@ -298,7 +321,10 @@ namespace ignite
         {
             latch.CountDown();
 
-            jobject binaryProc = Context()->ProcessorBinaryProcessor(proc.Get());
+            JniErrorInfo jniErr;
+
+            jobject binaryProc = Context()->TargetOutObject(proc.Get(), ProcessorOp::GET_BINARY_PROCESSOR, &jniErr);
+
             metaUpdater = new BinaryTypeUpdaterImpl(*this, binaryProc);
 
             metaMgr->SetUpdater(metaUpdater);
@@ -375,7 +401,7 @@ namespace ignite
         {
             JniErrorInfo jniErr;
 
-            jobject res = ctx.Get()->ProcessorCompute(proc.Get(), proj, &jniErr);
+            jobject res = ctx.Get()->TargetOutObject(proj, ClusterGroupOp::GET_COMPUTE, &jniErr);
 
             IgniteError err;
 
@@ -557,7 +583,10 @@ namespace ignite
         void IgniteEnvironment::ProcessorReleaseStart()
         {
             if (proc.Get())
-                ctx.Get()->ProcessorReleaseStart(proc.Get());
+            {
+                JniErrorInfo jniErr;
+                ctx.Get()->TargetInLongOutLong(proc.Get(), ProcessorOp::RELEASE_START, 0, &jniErr);
+            }
         }
 
         HandleRegistry& IgniteEnvironment::GetHandleRegistry()

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/cpp/core/src/impl/ignite_impl.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/src/impl/ignite_impl.cpp b/modules/platforms/cpp/core/src/impl/ignite_impl.cpp
index 16e954c..f7ff185 100644
--- a/modules/platforms/cpp/core/src/impl/ignite_impl.cpp
+++ b/modules/platforms/cpp/core/src/impl/ignite_impl.cpp
@@ -24,9 +24,9 @@ namespace ignite
 {    
     namespace impl
     {
-        IgniteImpl::IgniteImpl(SharedPointer<IgniteEnvironment> env, jobject javaRef) :
-            env(env),
-            javaRef(javaRef)
+        IgniteImpl::IgniteImpl(SharedPointer<IgniteEnvironment> env) :
+            InteropTarget(env, static_cast<jobject>(env.Get()->GetProcessor()), true),
+            env(env)
         {
             IgniteError err;
 
@@ -39,11 +39,6 @@ namespace ignite
             IgniteError::ThrowIfNeeded(err);
         }
 
-        IgniteImpl::~IgniteImpl()
-        {
-            JniContext::Release(javaRef);
-        }
-
         const char* IgniteImpl::GetName() const
         {
             return env.Get()->InstanceName();
@@ -75,14 +70,10 @@ namespace ignite
         {
             SP_TransactionsImpl res;
 
-            JniErrorInfo jniErr;
-
-            jobject txJavaRef = env.Get()->Context()->ProcessorTransactions(javaRef, &jniErr);
+            jobject txJavaRef = InOpObject(ProcessorOp::GET_TRANSACTIONS, err);
 
             if (txJavaRef)
                 res = SP_TransactionsImpl(new transactions::TransactionsImpl(env, txJavaRef));
-            else
-                IgniteError::SetError(jniErr.code, jniErr.errCls, jniErr.errMsg, err);
 
             return res;
         }
@@ -93,12 +84,10 @@ namespace ignite
 
             JniErrorInfo jniErr;
 
-            jobject txJavaRef = env.Get()->Context()->ProcessorProjection(javaRef, &jniErr);
+            jobject clusterGroupJavaRef = InOpObject(ProcessorOp::GET_CLUSTER_GROUP, err);
 
-            if (txJavaRef)
-                res = cluster::SP_ClusterGroupImpl(new cluster::ClusterGroupImpl(env, txJavaRef));
-            else
-                IgniteError::SetError(jniErr.code, jniErr.errCls, jniErr.errMsg, err);
+            if (clusterGroupJavaRef)
+                res = cluster::SP_ClusterGroupImpl(new cluster::ClusterGroupImpl(env, clusterGroupJavaRef));
 
             return res;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/cpp/core/src/impl/interop/interop_target.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/src/impl/interop/interop_target.cpp b/modules/platforms/cpp/core/src/impl/interop/interop_target.cpp
index 7eed6f3..70db2c9 100644
--- a/modules/platforms/cpp/core/src/impl/interop/interop_target.cpp
+++ b/modules/platforms/cpp/core/src/impl/interop/interop_target.cpp
@@ -32,14 +32,24 @@ namespace ignite
         namespace interop
         {
             InteropTarget::InteropTarget(SharedPointer<IgniteEnvironment> env, jobject javaRef) :
-                env(env), javaRef(javaRef)
+                env(env), javaRef(javaRef), skipJavaRefRelease(false)
+            {
+                // No-op.
+            }
+
+            InteropTarget::InteropTarget(SharedPointer<IgniteEnvironment> env, jobject javaRef, 
+                bool skipJavaRefRelease) :
+                env(env), javaRef(javaRef), skipJavaRefRelease(skipJavaRefRelease)
             {
                 // No-op.
             }
 
             InteropTarget::~InteropTarget()
             {
-                JniContext::Release(javaRef);
+                if (!skipJavaRefRelease) 
+                {
+                    JniContext::Release(javaRef);
+                }
             }
 
             int64_t InteropTarget::WriteTo(InteropMemory* mem, InputOperation& inOp, IgniteError& err)
@@ -216,7 +226,7 @@ namespace ignite
                 return OperationResult::AI_ERROR;
             }
 
-            jobject InteropTarget::InStreamOutObject(int32_t opType, InteropMemory& outInMem)
+            jobject InteropTarget::InStreamOutObject(int32_t opType, InteropMemory& outInMem, IgniteError& err)
             {
                 JniErrorInfo jniErr;
 
@@ -226,9 +236,7 @@ namespace ignite
                 {
                     jobject res = env.Get()->Context()->TargetInStreamOutObject(javaRef, opType, outInPtr, &jniErr);
 
-                    IgniteError err;
                     IgniteError::SetError(jniErr.code, jniErr.errCls, jniErr.errMsg, err);
-                    IgniteError::ThrowIfNeeded(err);
 
                     return res;
                 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/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 6fe91c7..ea0c32a 100644
--- a/modules/platforms/cpp/jni/include/ignite/jni/exports.h
+++ b/modules/platforms/cpp/jni/include/ignite/jni/exports.h
@@ -25,40 +25,11 @@ namespace gcj = ignite::jni::java;
 extern "C" {
     int IGNITE_CALL IgniteReallocate(long long memPtr, int cap);
 
-    void* IGNITE_CALL IgniteIgnitionStart(gcj::JniContext* ctx, char* cfgPath, char* name, int factoryId, long long dataPtr);
-    void* IGNITE_CALL IgniteIgnitionInstance(gcj::JniContext* ctx, char* name);
+    void IGNITE_CALL IgniteIgnitionStart(gcj::JniContext* ctx, char* cfgPath, char* name, int factoryId, long long dataPtr);
     long long IGNITE_CALL IgniteIgnitionEnvironmentPointer(gcj::JniContext* ctx, char* name);
     bool IGNITE_CALL IgniteIgnitionStop(gcj::JniContext* ctx, char* name, bool cancel);
     void IGNITE_CALL IgniteIgnitionStopAll(gcj::JniContext* ctx, bool cancel);
 
-    void IGNITE_CALL IgniteProcessorReleaseStart(gcj::JniContext* ctx, void* obj);
-    void* IGNITE_CALL IgniteProcessorProjection(gcj::JniContext* ctx, void* obj);
-    void* IGNITE_CALL IgniteProcessorCache(gcj::JniContext* ctx, void* obj, char* name);
-    void* IGNITE_CALL IgniteProcessorCreateCache(gcj::JniContext* ctx, void* obj, char* name);
-    void* IGNITE_CALL IgniteProcessorGetOrCreateCache(gcj::JniContext* ctx, void* obj, char* name);
-    void* IGNITE_CALL IgniteProcessorCreateCacheFromConfig(gcj::JniContext* ctx, void* obj, long long memPtr);
-    void* IGNITE_CALL IgniteProcessorGetOrCreateCacheFromConfig(gcj::JniContext* ctx, void* obj, long long memPtr);
-    void* IGNITE_CALL IgniteProcessorCreateNearCache(gcj::JniContext* ctx, void* obj, char* name, long long memPtr);
-    void* IGNITE_CALL IgniteProcessorGetOrCreateNearCache(gcj::JniContext* ctx, void* obj, char* name, long long memPtr);
-    void IGNITE_CALL IgniteProcessorDestroyCache(gcj::JniContext* ctx, void* obj, char* name);
-    void* IGNITE_CALL IgniteProcessorAffinity(gcj::JniContext* ctx, void* obj, char* name);
-    void* IGNITE_CALL IgniteProcessorDataStreamer(gcj::JniContext* ctx, void* obj, char* name, bool keepPortable);
-    void* IGNITE_CALL IgniteProcessorTransactions(gcj::JniContext* ctx, void* obj);
-    void* IGNITE_CALL IgniteProcessorCompute(gcj::JniContext* ctx, void* obj, void* prj);
-    void* IGNITE_CALL IgniteProcessorMessage(gcj::JniContext* ctx, void* obj, void* prj);
-    void* IGNITE_CALL IgniteProcessorEvents(gcj::JniContext* ctx, void* obj, void* prj);
-    void* IGNITE_CALL IgniteProcessorServices(gcj::JniContext* ctx, void* obj, void* prj);
-    void* IGNITE_CALL IgniteProcessorExtensions(gcj::JniContext* ctx, void* obj);
-    void* IGNITE_CALL IgniteProcessorExtension(gcj::JniContext* ctx, void* obj, int id);
-    void* IGNITE_CALL IgniteProcessorAtomicLong(gcj::JniContext* ctx, void* obj, char* name, long long initVal, bool create);
-    void* IGNITE_CALL IgniteProcessorAtomicSequence(gcj::JniContext* ctx, void* obj, char* name, long long initVal, bool create);
-    void* IGNITE_CALL IgniteProcessorAtomicReference(gcj::JniContext* ctx, void* obj, char* name, long long memPtr, bool create);
-    void IGNITE_CALL IgniteProcessorGetIgniteConfiguration(gcj::JniContext* ctx, void* obj, long long memPtr);
-    void IGNITE_CALL IgniteProcessorGetCacheNames(gcj::JniContext* ctx, void* obj, long long memPtr);
-    bool IGNITE_CALL IgniteProcessorLoggerIsLevelEnabled(gcj::JniContext* ctx, void* obj, int level);
-    void IGNITE_CALL IgniteProcessorLoggerLog(gcj::JniContext* ctx, void* obj, int level, char* message, char* category, char* errorInfo);
-    void* IGNITE_CALL IgniteProcessorBinaryProcessor(gcj::JniContext* ctx, void* obj);
-
     long long IGNITE_CALL IgniteTargetInLongOutLong(gcj::JniContext* ctx, void* obj, int opType, long long memPtr);
     long long IGNITE_CALL IgniteTargetInStreamOutLong(gcj::JniContext* ctx, void* obj, int opType, long long memPtr);
     void IGNITE_CALL IgniteTargetInStreamOutStream(gcj::JniContext* ctx, void* obj, int opType, long long inMemPtr, long long outMemPtr);

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/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 f6d7207..c170a5b 100644
--- a/modules/platforms/cpp/jni/include/ignite/jni/java.h
+++ b/modules/platforms/cpp/jni/include/ignite/jni/java.h
@@ -175,32 +175,6 @@ namespace ignite
 
                 jclass c_PlatformProcessor;
                 jmethodID m_PlatformProcessor_releaseStart;
-                jmethodID m_PlatformProcessor_cache;
-                jmethodID m_PlatformProcessor_createCache;
-                jmethodID m_PlatformProcessor_getOrCreateCache;
-                jmethodID m_PlatformProcessor_createCacheFromConfig;
-                jmethodID m_PlatformProcessor_getOrCreateCacheFromConfig;
-                jmethodID m_PlatformProcessor_createNearCache;
-                jmethodID m_PlatformProcessor_getOrCreateNearCache;
-                jmethodID m_PlatformProcessor_destroyCache;
-                jmethodID m_PlatformProcessor_affinity;
-                jmethodID m_PlatformProcessor_dataStreamer;
-                jmethodID m_PlatformProcessor_transactions;
-                jmethodID m_PlatformProcessor_projection;
-                jmethodID m_PlatformProcessor_compute;
-                jmethodID m_PlatformProcessor_message;
-                jmethodID m_PlatformProcessor_events;
-                jmethodID m_PlatformProcessor_services;
-                jmethodID m_PlatformProcessor_extensions;
-                jmethodID m_PlatformProcessor_extension;
-                jmethodID m_PlatformProcessor_atomicLong;
-                jmethodID m_PlatformProcessor_getIgniteConfiguration;
-                jmethodID m_PlatformProcessor_getCacheNames;
-                jmethodID m_PlatformProcessor_atomicSequence;
-                jmethodID m_PlatformProcessor_atomicReference;
-                jmethodID m_PlatformProcessor_loggerIsLevelEnabled;
-                jmethodID m_PlatformProcessor_loggerLog;
-                jmethodID m_PlatformProcessor_binaryProcessor;
 
                 jclass c_PlatformTarget;
                 jmethodID m_PlatformTarget_inLongOutLong;
@@ -334,10 +308,8 @@ namespace ignite
                 static void SetConsoleHandler(ConsoleWriteHandler consoleHandler);
                 static int RemoveConsoleHandler(ConsoleWriteHandler consoleHandler);
 
-                jobject IgnitionStart(char* cfgPath, char* name, int factoryId, long long dataPtr);
-                jobject IgnitionStart(char* cfgPath, char* name, int factoryId, long long dataPtr, JniErrorInfo* errInfo);
-                jobject IgnitionInstance(char* name);
-                jobject IgnitionInstance(char* name, JniErrorInfo* errInfo);
+                void IgnitionStart(char* cfgPath, char* name, int factoryId, long long dataPtr);
+                void IgnitionStart(char* cfgPath, char* name, int factoryId, long long dataPtr, JniErrorInfo* errInfo);
                 long long IgnitionEnvironmentPointer(char* name);
                 long long IgnitionEnvironmentPointer(char* name, JniErrorInfo* errInfo);
                 bool IgnitionStop(char* name, bool cancel);
@@ -345,41 +317,6 @@ namespace ignite
                 void IgnitionStopAll(bool cancel);
                 void IgnitionStopAll(bool cancel, JniErrorInfo* errInfo);
                 
-                void ProcessorReleaseStart(jobject obj);
-                jobject ProcessorProjection(jobject obj, JniErrorInfo* errInfo = NULL);
-                jobject ProcessorCache(jobject obj, const char* name);
-                jobject ProcessorCache(jobject obj, const char* name, JniErrorInfo* errInfo);
-                jobject ProcessorCreateCache(jobject obj, const char* name);
-                jobject ProcessorCreateCache(jobject obj, const char* name, JniErrorInfo* errInfo);
-                jobject ProcessorGetOrCreateCache(jobject obj, const char* name);
-                jobject ProcessorGetOrCreateCache(jobject obj, const char* name, JniErrorInfo* errInfo);
-                jobject ProcessorCreateCacheFromConfig(jobject obj, long long memPtr);
-                jobject ProcessorCreateCacheFromConfig(jobject obj, long long memPtr, JniErrorInfo* errInfo);
-                jobject ProcessorGetOrCreateCacheFromConfig(jobject obj, long long memPtr);
-                jobject ProcessorGetOrCreateCacheFromConfig(jobject obj, long long memPtr, JniErrorInfo* errInfo);
-                jobject ProcessorCreateNearCache(jobject obj, const char* name, long long memPtr);
-                jobject ProcessorGetOrCreateNearCache(jobject obj, const char* name, long long memPtr);
-                void ProcessorDestroyCache(jobject obj, const char* name);
-                void ProcessorDestroyCache(jobject obj, const char* name, JniErrorInfo* errInfo);
-                jobject ProcessorAffinity(jobject obj, const char* name);
-                jobject ProcessorDataStreamer(jobject obj, const char* name, bool keepPortable);
-                jobject ProcessorTransactions(jobject obj, JniErrorInfo* errInfo = NULL);
-                jobject ProcessorCompute(jobject obj, jobject prj);
-                jobject ProcessorCompute(jobject obj, jobject prj, JniErrorInfo* errInfo);
-                jobject ProcessorMessage(jobject obj, jobject prj);
-                jobject ProcessorEvents(jobject obj, jobject prj);
-                jobject ProcessorServices(jobject obj, jobject prj);
-                jobject ProcessorExtensions(jobject obj);
-                jobject ProcessorExtension(jobject obj, int id);
-                jobject ProcessorAtomicLong(jobject obj, char* name, long long initVal, bool create);
-                jobject ProcessorAtomicSequence(jobject obj, char* name, long long initVal, bool create);
-                jobject ProcessorAtomicReference(jobject obj, char* name, long long memPtr, bool create);
-				void ProcessorGetIgniteConfiguration(jobject obj, long long memPtr);
-				void ProcessorGetCacheNames(jobject obj, long long memPtr);
-				bool ProcessorLoggerIsLevelEnabled(jobject obj, int level);
-				void ProcessorLoggerLog(jobject obj, int level, char* message, char* category, char* errorInfo);
-                jobject ProcessorBinaryProcessor(jobject obj);
-
                 long long TargetInLongOutLong(jobject obj, int type, long long memPtr, JniErrorInfo* errInfo = NULL);
                 long long TargetInStreamOutLong(jobject obj, int type, long long memPtr, JniErrorInfo* errInfo = NULL);
                 void TargetInStreamOutStream(jobject obj, int opType, long long inMemPtr, long long outMemPtr, JniErrorInfo* errInfo = NULL);
@@ -406,9 +343,6 @@ namespace ignite
                 void ExceptionCheck(JNIEnv* env);
                 void ExceptionCheck(JNIEnv* env, JniErrorInfo* errInfo);
                 jobject LocalToGlobal(JNIEnv* env, jobject obj);
-                jobject ProcessorCache0(jobject proc, const char* name, jmethodID mthd, JniErrorInfo* errInfo);
-                jobject ProcessorCacheFromConfig0(jobject proc, long long memPtr, jmethodID mthd, JniErrorInfo* errInfo);
-                jobject ProcessorGetOrCreateNearCache0(jobject obj, const char* name, long long memPtr, jmethodID methodID);
             };
 
             JNIEXPORT jlong JNICALL JniCacheStoreCreate(JNIEnv *env, jclass cls, jlong envPtr, jlong memPtr);

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/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 82cc41e..53e7e42 100644
--- a/modules/platforms/cpp/jni/project/vs/module.def
+++ b/modules/platforms/cpp/jni/project/vs/module.def
@@ -2,19 +2,9 @@ LIBRARY ignite.jni.dll
 EXPORTS
 IgniteReallocate @1 
 IgniteIgnitionStart @2 
-IgniteIgnitionInstance @3 
 IgniteIgnitionEnvironmentPointer @4 
 IgniteIgnitionStop @5 
 IgniteIgnitionStopAll @6 
-IgniteProcessorReleaseStart @8 
-IgniteProcessorProjection @9 
-IgniteProcessorCache @10 
-IgniteProcessorCreateCache @11 
-IgniteProcessorGetOrCreateCache @12 
-IgniteProcessorAffinity @13 
-IgniteProcessorDataStreamer @14 
-IgniteProcessorTransactions @15 
-IgniteProcessorServices @16
 IgniteTargetInStreamOutObject @17 
 IgniteTargetInStreamOutLong @18 
 IgniteTargetOutStream @19 
@@ -22,9 +12,6 @@ IgniteTargetInStreamOutStream @20
 IgniteTargetInObjectStreamOutObjectStream @21
 IgniteTargetInLongOutLong @24
 IgniteTargetInStreamAsync @25
-IgniteProcessorCompute @64 
-IgniteProcessorMessage @65 
-IgniteProcessorEvents @66 
 IgniteAcquire @80
 IgniteRelease @81
 IgniteThrowToJava @82 
@@ -33,20 +20,5 @@ IgniteCreateContext @84
 IgniteDeleteContext @85 
 IgniteDestroyJvm @86 
 IgniteTargetOutObject @91 
-IgniteProcessorExtension @96
-IgniteProcessorExtensions @97
-IgniteProcessorAtomicLong @98
-IgniteProcessorCreateCacheFromConfig @114
-IgniteProcessorGetOrCreateCacheFromConfig @115
-IgniteProcessorGetIgniteConfiguration @116
-IgniteProcessorDestroyCache @117
-IgniteProcessorAtomicSequence @118
-IgniteProcessorAtomicReference @128
-IgniteProcessorCreateNearCache @131
-IgniteProcessorGetOrCreateNearCache @132
-IgniteProcessorGetCacheNames @133
 IgniteSetConsoleHandler @135
-IgniteRemoveConsoleHandler @136
-IgniteProcessorLoggerIsLevelEnabled @137
-IgniteProcessorLoggerLog @138
-IgniteProcessorBinaryProcessor @139
\ No newline at end of file
+IgniteRemoveConsoleHandler @136
\ No newline at end of file


[10/50] [abbrv] ignite git commit: IGNITE-3950 Deadlock when exchange starts with pending explicit lock

Posted by yz...@apache.org.
IGNITE-3950 Deadlock when exchange starts with pending explicit lock


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

Branch: refs/heads/ignite-5658
Commit: 48f29943efa9cbfc1e2c4068f7e16373dec2b0b9
Parents: db43b0c
Author: Vitaliy Biryukov <Bi...@gmail.com>
Authored: Fri Jul 21 15:29:23 2017 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Fri Jul 21 15:29:23 2017 +0300

----------------------------------------------------------------------
 .../cache/distributed/dht/IgniteCacheMultiTxLockSelfTest.java      | 2 --
 1 file changed, 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/48f29943/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCacheMultiTxLockSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCacheMultiTxLockSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCacheMultiTxLockSelfTest.java
index 6fd5dd3..11b0eea 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCacheMultiTxLockSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/dht/IgniteCacheMultiTxLockSelfTest.java
@@ -117,8 +117,6 @@ public class IgniteCacheMultiTxLockSelfTest extends GridCommonAbstractTest {
      * @throws Exception If failed.
      */
     public void testExplicitLockManyKeysWithClient() throws Exception {
-        fail("https://issues.apache.org/jira/browse/IGNITE-3950");
-
         checkExplicitLock(4, true);
     }
 


[25/50] [abbrv] ignite git commit: IGNITE-5697 Web Console: Upgrade dependencies.

Posted by yz...@apache.org.
IGNITE-5697 Web Console: Upgrade dependencies.


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

Branch: refs/heads/ignite-5658
Commit: f277530ab6a9a6f03fd66f95a7a4d91a3506dcf5
Parents: 39fa8fa
Author: Andrey Novikov <an...@gridgain.com>
Authored: Tue Jul 25 15:24:13 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Tue Jul 25 15:24:13 2017 +0700

----------------------------------------------------------------------
 modules/web-console/backend/.eslintrc           | 39 ++++++------
 modules/web-console/backend/package.json        | 27 ++++----
 modules/web-console/frontend/.eslintrc          | 40 +++++-------
 modules/web-console/frontend/app/app.js         | 37 ++++++-----
 .../components/activities-user-dialog/index.js  | 28 ++++-----
 .../page-configure-advanced/controller.js       |  9 +--
 .../components/page-configure-basic/service.js  |  8 +--
 .../app/components/page-configure/controller.js | 12 +---
 .../page-configure/controller.spec.js           | 48 --------------
 .../page-configure/services/PageConfigure.js    | 18 +++---
 .../components/web-console-header/component.js  | 12 ++--
 .../app/components/web-console-header/index.js  |  4 +-
 .../frontend/app/modules/ace.module.js          |  6 +-
 .../app/modules/branding/branding.module.js     | 16 +++--
 .../generator/ConfigurationGenerator.js         |  2 +-
 .../generator/PlatformGenerator.js              |  4 +-
 .../frontend/app/modules/demo/Demo.module.js    | 10 +--
 .../app/modules/dialog/dialog.controller.js     |  4 --
 .../app/modules/form/field/label.directive.js   |  4 +-
 .../app/modules/form/field/tooltip.directive.js |  4 +-
 .../frontend/app/modules/sql/sql.controller.js  |  2 +-
 .../frontend/app/modules/sql/sql.module.js      | 66 ++++++++++----------
 .../frontend/app/modules/states/admin.state.js  |  6 +-
 .../app/modules/states/configuration.state.js   | 35 ++++++-----
 .../summary/summary-zipper.service.js           |  2 +-
 .../frontend/app/modules/states/errors.state.js |  4 +-
 .../frontend/app/modules/states/logout.state.js | 12 ++--
 .../app/modules/states/password.state.js        |  4 +-
 .../app/modules/states/profile.state.js         |  9 ++-
 .../frontend/app/modules/states/signin.state.js | 32 +++++-----
 .../app/modules/user/AclRoute.provider.js       |  6 +-
 .../frontend/app/modules/user/user.module.js    | 30 ++++++++-
 .../app/services/CopyToClipboard.service.js     |  4 +-
 .../app/services/LegacyTable.service.js         |  2 +-
 modules/web-console/frontend/app/vendor.js      |  8 ++-
 modules/web-console/frontend/package.json       | 57 ++++++++---------
 modules/web-console/frontend/views/index.pug    | 14 +----
 37 files changed, 292 insertions(+), 333 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/backend/.eslintrc
----------------------------------------------------------------------
diff --git a/modules/web-console/backend/.eslintrc b/modules/web-console/backend/.eslintrc
index 7eb04b7..1915518 100644
--- a/modules/web-console/backend/.eslintrc
+++ b/modules/web-console/backend/.eslintrc
@@ -3,19 +3,21 @@ env:
     node: true
     mocha: true
 
-ecmaFeatures:
-    arrowFunctions: true
-    blockBindings: true
-    classes: true
-    defaultParams: true
-    destructuring: true
-    module: true
-    objectLiteralComputedProperties: true
-    objectLiteralShorthandMethods: true
-    objectLiteralShorthandProperties: true
-    spread: true
-    templateStrings: true
-    experimentalObjectRestSpread: true
+parserOptions:
+    sourceType: module
+    ecmaFeatures:
+        arrowFunctions: true
+        blockBindings: true
+        classes: true
+        defaultParams: true
+        destructuring: true
+        module: true
+        objectLiteralComputedProperties: true
+        objectLiteralShorthandMethods: true
+        objectLiteralShorthandProperties: true
+        spread: true
+        templateStrings: true
+        experimentalObjectRestSpread: true
 
 globals:
     _: true
@@ -47,7 +49,7 @@ rules:
     guard-for-in: 1
     handle-callback-err: 0
     id-length: [2, {"min": 1, "max": 60}]
-    indent: [2, 4, {"SwitchCase": 1}]
+    indent: [2, 4, {"SwitchCase": 1, "MemberExpression": "off", "CallExpression": {"arguments": "off"}}]
     key-spacing: [2, { "beforeColon": false, "afterColon": true }]
     lines-around-comment: 0
     linebreak-style: [0, "unix"]
@@ -104,7 +106,7 @@ rules:
     no-loop-func: 2
     no-mixed-requires: [0, false]
     no-mixed-spaces-and-tabs: [2, true]
-    no-multi-spaces: 2
+    no-multi-spaces: ["error", {"exceptions": { "VariableDeclarator": true }}]
     no-multi-str: 2
     no-multiple-empty-lines: [0, {"max": 2}]
     no-native-reassign: 2
@@ -130,7 +132,7 @@ rules:
     no-script-url: 0
     no-self-compare: 2
     no-sequences: 2
-    no-shadow: 2
+    no-shadow: 0
     no-shadow-restricted-names: 2
     no-spaced-func: 2
     no-sparse-arrays: 1
@@ -162,7 +164,7 @@ rules:
     prefer-const: 1
     prefer-spread: 2
     quote-props: [2, "as-needed"]
-    quotes: [2, "single"]
+    quotes: [2, "single", {"allowTemplateLiterals": true}]
     radix: 1
     semi: [2, "always"]
     semi-spacing: [2, {"before": false, "after": true}]
@@ -181,6 +183,3 @@ rules:
     wrap-iife: 0
     wrap-regex: 0
     yoda: [2, "never"]
-
-parserOptions:
-    sourceType: module

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/backend/package.json
----------------------------------------------------------------------
diff --git a/modules/web-console/backend/package.json b/modules/web-console/backend/package.json
index 2af7787..837f41c 100644
--- a/modules/web-console/backend/package.json
+++ b/modules/web-console/backend/package.json
@@ -29,19 +29,19 @@
     "win32"
   ],
   "dependencies": {
-    "body-parser": "1.17.1",
+    "body-parser": "1.17.2",
     "connect-mongo": "1.3.2",
-    "cookie-parser": "~1.4.0",
-    "express": "4.15.2",
-    "express-session": "1.15.2",
+    "cookie-parser": "1.4.3",
+    "express": "4.15.3",
+    "express-session": "1.15.4",
     "fire-up": "1.0.0",
-    "glob": "7.1.1",
+    "glob": "7.1.2",
     "jszip": "3.1.3",
     "lodash": "4.17.4",
-    "mongoose": "4.9.4",
-    "morgan": "1.8.1",
+    "mongoose": "4.11.4",
+    "morgan": "1.8.2",
     "nconf": "0.8.4",
-    "nodemailer": "3.1.4",
+    "nodemailer": "4.0.1",
     "passport": "0.3.2",
     "passport-local": "1.0.0",
     "passport-local-mongoose": "4.0.0",
@@ -49,12 +49,11 @@
     "socket.io": "1.7.3"
   },
   "devDependencies": {
-    "chai": "3.5.0",
-    "cross-env": "4.0.0",
-    "eslint": "3.19.0",
-    "eslint-friendly-formatter": "2.0.7",
-    "jasmine-core": "2.5.2",
-    "mocha": "3.2.0",
+    "chai": "4.1.0",
+    "cross-env": "5.0.1",
+    "eslint": "4.3.0",
+    "eslint-friendly-formatter": "3.0.0",
+    "mocha": "3.4.2",
     "mocha-teamcity-reporter": "1.1.1",
     "mockgoose": "6.0.8",
     "supertest": "3.0.0"

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/.eslintrc
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/.eslintrc b/modules/web-console/frontend/.eslintrc
index d88fb97..4e24d0b 100644
--- a/modules/web-console/frontend/.eslintrc
+++ b/modules/web-console/frontend/.eslintrc
@@ -6,20 +6,21 @@ plugins:
 env:
     es6: true
     browser: true
-
-ecmaFeatures:
-    arrowFunctions: true
-    blockBindings: true
-    classes: true
-    defaultParams: true
-    destructuring: true
-    module: true
-    objectLiteralComputedProperties: true
-    objectLiteralShorthandMethods: true
-    objectLiteralShorthandProperties: true
-    spread: true
-    templateStrings: true
-    experimentalObjectRestSpread: true
+parserOptions:
+    sourceType: module
+    ecmaFeatures:
+        arrowFunctions: true
+        blockBindings: true
+        classes: true
+        defaultParams: true
+        destructuring: true
+        module: true
+        objectLiteralComputedProperties: true
+        objectLiteralShorthandMethods: true
+        objectLiteralShorthandProperties: true
+        spread: true
+        templateStrings: true
+        experimentalObjectRestSpread: true
 
 globals:
     _: true
@@ -29,10 +30,6 @@ globals:
     window: true
     global: true
     angular: true
-    $generatorCommon: true
-    $generatorSpring: true
-    $generatorJava: true
-    $generatorOptional: true
     saveAs: true
     process: true
     require: true
@@ -63,7 +60,7 @@ rules:
     guard-for-in: 1
     handle-callback-err: 0
     id-length: [2, {"min": 1, "max": 60}]
-    indent: [2, 4, {"SwitchCase": 1}]
+    indent: [2, 4, {"SwitchCase": 1, "MemberExpression": "off", "CallExpression": {"arguments": "off"}}]
     key-spacing: [2, { "beforeColon": false, "afterColon": true }]
     lines-around-comment: 0
     linebreak-style: [0, "unix"]
@@ -138,7 +135,7 @@ rules:
     no-path-concat: 0
     no-plusplus: 0
     no-process-env: 0
-    no-process-exit: 1
+    no-process-exit: 0
     no-proto: 2
     no-redeclare: 2
     no-regex-spaces: 1
@@ -198,6 +195,3 @@ rules:
     wrap-regex: 0
     yoda: [2, "never"]
     babel/semi: 2
-
-parserOptions:
-    sourceType: module

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/app.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/app.js b/modules/web-console/frontend/app/app.js
index 0667e8f..e2d609a 100644
--- a/modules/web-console/frontend/app/app.js
+++ b/modules/web-console/frontend/app/app.js
@@ -133,8 +133,7 @@ import IgniteModules from 'IgniteModules/index';
 
 import baseTemplate from 'views/base.pug';
 
-angular
-.module('ignite-console', [
+angular.module('ignite-console', [
     // Optional AngularJS modules.
     'ngAnimate',
     'ngSanitize',
@@ -143,6 +142,7 @@ angular
     'btford.socket-io',
     'mgcrea.ngStrap',
     'ui.router',
+    'ui.router.state.events',
     'gridster',
     'dndLists',
     'nvd3',
@@ -278,33 +278,32 @@ angular
     $urlRouterProvider.otherwise('/404');
     $locationProvider.html5Mode(true);
 }])
-.run(['$rootScope', '$state', 'MetaTags', 'gettingStarted', ($root, $state, $meta, gettingStarted) => {
+.run(['$rootScope', '$state', 'gettingStarted', ($root, $state, gettingStarted) => {
     $root._ = _;
     $root.$state = $state;
-    $root.$meta = $meta;
     $root.gettingStarted = gettingStarted;
 }])
 .run(['$rootScope', 'AgentManager', ($root, agentMgr) => {
     $root.$on('user', () => agentMgr.connect());
 }])
-.run(['$rootScope', ($root) => {
-    $root.$on('$stateChangeStart', () => {
+.run(['$transitions', ($transitions) => {
+    $transitions.onStart({ }, () => {
         _.forEach(angular.element('.modal'), (m) => angular.element(m).scope().$hide());
     });
 
-    if (!$root.IgniteDemoMode) {
-        $root.$on('$stateChangeSuccess', (event, {name, unsaved}, params) => {
-            try {
-                if (unsaved)
-                    localStorage.removeItem('lastStateChangeSuccess');
-                else
-                    localStorage.setItem('lastStateChangeSuccess', JSON.stringify({name, params}));
-            }
-            catch (ignored) {
-                // No-op.
-            }
-        });
-    }
+    $transitions.onSuccess({ }, (trans) => {
+        try {
+            const {name, params, unsaved} = trans.$to();
+
+            if (unsaved)
+                localStorage.removeItem('lastStateChangeSuccess');
+            else
+                localStorage.setItem('lastStateChangeSuccess', JSON.stringify({name, params}));
+        }
+        catch (ignored) {
+            // No-op.
+        }
+    });
 }])
 .run(['$rootScope', '$http', '$state', 'IgniteMessages', 'User', 'IgniteNotebookData',
     ($root, $http, $state, Messages, User, Notebook) => { // eslint-disable-line no-shadow

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/components/activities-user-dialog/index.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/activities-user-dialog/index.js b/modules/web-console/frontend/app/components/activities-user-dialog/index.js
index 02c7c1e..13c1d95 100644
--- a/modules/web-console/frontend/app/components/activities-user-dialog/index.js
+++ b/modules/web-console/frontend/app/components/activities-user-dialog/index.js
@@ -15,20 +15,20 @@
  * limitations under the License.
  */
 
- import controller from './activities-user-dialog.controller';
- import templateUrl from './activities-user-dialog.tpl.pug';
+import controller from './activities-user-dialog.controller';
+import templateUrl from './activities-user-dialog.tpl.pug';
 
- export default ['$modal', ($modal) => ({ show = true, user }) => {
-     const ActivitiesUserDialog = $modal({
-         templateUrl,
-         show,
-         resolve: {
-             user: () => user
-         },
-         controller,
-         controllerAs: 'ctrl'
-     });
+export default ['$modal', ($modal) => ({ show = true, user }) => {
+    const ActivitiesUserDialog = $modal({
+        templateUrl,
+        show,
+        resolve: {
+            user: () => user
+        },
+        controller,
+        controllerAs: 'ctrl'
+    });
 
-     return ActivitiesUserDialog.$promise
+    return ActivitiesUserDialog.$promise
          .then(() => ActivitiesUserDialog);
- }];
+}];

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/components/page-configure-advanced/controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-advanced/controller.js b/modules/web-console/frontend/app/components/page-configure-advanced/controller.js
index 0e73ae3..da20527 100644
--- a/modules/web-console/frontend/app/components/page-configure-advanced/controller.js
+++ b/modules/web-console/frontend/app/components/page-configure-advanced/controller.js
@@ -16,7 +16,7 @@
  */
 
 export default class PageConfigureAdvancedController {
-    static $inject = ['PageConfigureAdvanced', '$scope'];
+    static $inject = ['$scope'];
 
     static menuItems = [
         { text: 'Clusters', sref: 'base.configuration.tabs.advanced.clusters' },
@@ -26,14 +26,11 @@ export default class PageConfigureAdvancedController {
         { text: 'Summary', sref: 'base.configuration.tabs.advanced.summary' }
     ];
 
-    constructor(PageConfigureAdvanced, $scope) {
-        Object.assign(this, {PageConfigureAdvanced, $scope});
+    constructor($scope) {
+        Object.assign(this, {$scope});
     }
 
     $onInit() {
         this.menuItems = this.constructor.menuItems;
-        this.$scope.$on('$stateChangeSuccess', (e, toState) => {
-            this.PageConfigureAdvanced.onStateEnterRedirect(toState);
-        });
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/components/page-configure-basic/service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure-basic/service.js b/modules/web-console/frontend/app/components/page-configure-basic/service.js
index 4db61ea..0032106 100644
--- a/modules/web-console/frontend/app/components/page-configure-basic/service.js
+++ b/modules/web-console/frontend/app/components/page-configure-basic/service.js
@@ -50,7 +50,7 @@ export default class PageConfigureBasic {
         const noFakeIDCaches = caches.map(stripFakeID);
         cluster = cloneDeep(stripFakeID(cluster));
         return this.$q.all(noFakeIDCaches.map((cache) => (
-                this.caches.saveCache(cache)
+            this.caches.saveCache(cache)
                 .then(
                     ({data}) => data,
                     (e) => {
@@ -58,7 +58,7 @@ export default class PageConfigureBasic {
                         return this.$q.resolve(null);
                     }
                 )
-            )))
+        )))
         .then((cacheIDs) => {
             // Make sure we don't loose new IDs even if some requests fail
             this.pageConfigure.upsertCaches(
@@ -115,8 +115,8 @@ export default class PageConfigureBasic {
     setCluster(_id) {
         this.ConfigureState.dispatchAction(
             isNewItem({_id})
-            ? {type: SET_CLUSTER, _id, cluster: this.clusters.getBlankCluster()}
-            : {type: SET_CLUSTER, _id}
+                ? {type: SET_CLUSTER, _id, cluster: this.clusters.getBlankCluster()}
+                : {type: SET_CLUSTER, _id}
         );
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/components/page-configure/controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure/controller.js b/modules/web-console/frontend/app/components/page-configure/controller.js
index 3dcd14e..5ead0bb 100644
--- a/modules/web-console/frontend/app/components/page-configure/controller.js
+++ b/modules/web-console/frontend/app/components/page-configure/controller.js
@@ -16,15 +16,9 @@
  */
 
 export default class PageConfigureController {
-    static $inject = ['$scope', 'PageConfigure'];
+    static $inject = ['$scope'];
 
-    constructor($scope, PageConfigure) {
-        Object.assign(this, {$scope, PageConfigure});
-    }
-
-    $onInit() {
-        this.$scope.$on('$stateChangeSuccess', (e, toState) => {
-            this.PageConfigure.onStateEnterRedirect(toState);
-        });
+    constructor($scope) {
+        Object.assign(this, {$scope});
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/components/page-configure/controller.spec.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure/controller.spec.js b/modules/web-console/frontend/app/components/page-configure/controller.spec.js
deleted file mode 100644
index e30eb65..0000000
--- a/modules/web-console/frontend/app/components/page-configure/controller.spec.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/*
- * 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.
- */
-
-import {suite, test} from 'mocha';
-import {assert} from 'chai';
-import {spy} from 'sinon';
-
-import Controller from './controller';
-
-const mocks = () => new Map([
-    ['$scope', {
-        $on: spy()
-    }],
-    ['PageConfigure', {
-        onStateEnterRedirect: spy()
-    }]
-]);
-
-suite('page-configure component controller', () => {
-    test('State change success redirect', () => {
-        const c = new Controller(...mocks().values());
-        c.$onInit();
-        c.$scope.$on.getCall(0).args[1](null, {name: 'base.items'});
-        assert.isOk(
-            c.PageConfigure.onStateEnterRedirect.calledOnce,
-            'calls PageConfigure.onStateEnterRedirect every $stateChangeSuccess'
-        );
-        assert.deepEqual(
-            c.PageConfigure.onStateEnterRedirect.getCall(0).args,
-            [{name: 'base.items'}],
-            'calls PageConfigure.onStateEnterRedirect with correct arguments'
-        );
-    });
-});

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/components/page-configure/services/PageConfigure.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/page-configure/services/PageConfigure.js b/modules/web-console/frontend/app/components/page-configure/services/PageConfigure.js
index a712aca..34a292a 100644
--- a/modules/web-console/frontend/app/components/page-configure/services/PageConfigure.js
+++ b/modules/web-console/frontend/app/components/page-configure/services/PageConfigure.js
@@ -31,15 +31,17 @@ export default class PageConfigure {
     }
 
     onStateEnterRedirect(toState) {
-        if (toState.name !== 'base.configuration.tabs') return this.$q.resolve();
+        if (toState.name !== 'base.configuration.tabs')
+            return this.$q.resolve();
+
         return this.configuration.read()
-        .then((data) => {
-            this.loadList(data);
-            const nextState = data.clusters.length
-                ? 'base.configuration.tabs.advanced'
-                : 'base.configuration.tabs.basic';
-            return this.$state.go(nextState, null, {location: 'replace'});
-        });
+            .then((data) => {
+                this.loadList(data);
+
+                return this.$q.resolve(data.clusters.length
+                    ? 'base.configuration.tabs.advanced'
+                    : 'base.configuration.tabs.basic');
+            });
     }
 
     loadList(list) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/components/web-console-header/component.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/web-console-header/component.js b/modules/web-console/frontend/app/components/web-console-header/component.js
index d4c5c4b..66f09e9 100644
--- a/modules/web-console/frontend/app/components/web-console-header/component.js
+++ b/modules/web-console/frontend/app/components/web-console-header/component.js
@@ -33,11 +33,15 @@ export default {
             Object.assign(this, {$rootScope, $scope, $state, branding, UserNotifications});
         }
 
+        setWebAgentDownloadVisible() {
+            this.isWebAgentDownloadVisible =
+                this.constructor.webAgentDownloadVisibleStates.some((state) => this.$state.includes(state));
+        }
+
         $onInit() {
-            this.$scope.$on('$stateChangeSuccess', () => {
-                this.isWebAgentDownloadVisible =
-                    this.constructor.webAgentDownloadVisibleStates.some((state) => this.$state.includes(state));
-            });
+            this.setWebAgentDownloadVisible();
+
+            this.$scope.$on('$stateChangeSuccess', () => this.setWebAgentDownloadVisible());
         }
     },
     transclude: {

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/components/web-console-header/index.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/web-console-header/index.js b/modules/web-console/frontend/app/components/web-console-header/index.js
index 36caa3d..e41e1cc 100644
--- a/modules/web-console/frontend/app/components/web-console-header/index.js
+++ b/modules/web-console/frontend/app/components/web-console-header/index.js
@@ -19,5 +19,5 @@ import angular from 'angular';
 import component from './component';
 
 export default angular
-	.module('ignite-console.web-console-header', [])
-	.component('webConsoleHeader', component);
+    .module('ignite-console.web-console-header', [])
+    .component('webConsoleHeader', component);

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/ace.module.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/ace.module.js b/modules/web-console/frontend/app/modules/ace.module.js
index 4920a6f..a28536a 100644
--- a/modules/web-console/frontend/app/modules/ace.module.js
+++ b/modules/web-console/frontend/app/modules/ace.module.js
@@ -184,10 +184,10 @@ angular
                     return (e) => {
                         const newValue = session.getValue();
 
+                        // HACK make sure to only trigger the apply outside of the
+                        // digest loop 'cause ACE is actually using this callback
+                        // for any text transformation !
                         if (ngModel && newValue !== ngModel.$viewValue &&
-                                // HACK make sure to only trigger the apply outside of the
-                                // digest loop 'cause ACE is actually using this callback
-                                // for any text transformation !
                             !scope.$$phase && !scope.$root.$$phase)
                             scope.$eval(() => ngModel.$setViewValue(newValue));
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/branding/branding.module.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/branding/branding.module.js b/modules/web-console/frontend/app/modules/branding/branding.module.js
index cae7c91..9c4a5e5 100644
--- a/modules/web-console/frontend/app/modules/branding/branding.module.js
+++ b/modules/web-console/frontend/app/modules/branding/branding.module.js
@@ -28,14 +28,18 @@ import ignitePoweredByApache from './powered-by-apache.directive';
 
 angular
 .module('ignite-console.branding', [
-    'ui.router.metatags'
+    'tf.metatags'
 ])
 .provider(...IgniteBranding)
-.config(['UIRouterMetatagsProvider', (UIRouterMetatagsProvider) => {
-    UIRouterMetatagsProvider
-        .setDefaultTitle('Apache Ignite - Management Tool and Configuration Wizard')
-        .setTitleSuffix(' – Apache Ignite Web Console')
-        .setDefaultDescription('The Apache Ignite Web Console is an interactive management tool and configuration wizard which walks you through the creation of config files. Try it now.');
+.config(['tfMetaTagsProvider', (tfMetaTagsProvider) => {
+    tfMetaTagsProvider.setDefaults({
+        title: 'Apache Ignite - Management Tool and Configuration Wizard',
+        properties: {
+            description: 'The Apache Ignite Web Console is an interactive management tool and configuration wizard which walks you through the creation of config files. Try it now.'
+        }
+    });
+
+    tfMetaTagsProvider.setTitleSuffix(' – Apache Ignite Web Console');
 }])
 .directive(...ignitePoweredByApache)
 .directive(...igniteHeaderLogo)

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/configuration/generator/ConfigurationGenerator.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/configuration/generator/ConfigurationGenerator.js b/modules/web-console/frontend/app/modules/configuration/generator/ConfigurationGenerator.js
index 8299b9b..a14bfd3 100644
--- a/modules/web-console/frontend/app/modules/configuration/generator/ConfigurationGenerator.js
+++ b/modules/web-console/frontend/app/modules/configuration/generator/ConfigurationGenerator.js
@@ -887,7 +887,7 @@ export default class IgniteConfigurationGenerator {
             cfg.intProperty('peerClassLoadingMissedResourcesCacheSize')
                 .intProperty('peerClassLoadingThreadPoolSize')
                 .varArgProperty('p2pLocClsPathExcl', 'peerClassLoadingLocalClassPathExclude',
-                   cluster.peerClassLoadingLocalClassPathExclude);
+                    cluster.peerClassLoadingLocalClassPathExclude);
         }
 
         // Since ignite 2.0

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/configuration/generator/PlatformGenerator.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/configuration/generator/PlatformGenerator.js b/modules/web-console/frontend/app/modules/configuration/generator/PlatformGenerator.js
index b076193..234c7ec 100644
--- a/modules/web-console/frontend/app/modules/configuration/generator/PlatformGenerator.js
+++ b/modules/web-console/frontend/app/modules/configuration/generator/PlatformGenerator.js
@@ -168,7 +168,7 @@ export default ['JavaTypes', 'igniteClusterPlatformDefaults', 'igniteCachePlatfo
                 .intProperty('unacknowledgedMessagesBufferSize')
                 // .intProperty('socketWriteTimeout')
                 .intProperty('selectorsCount');
-                // .emptyBeanProperty('addressResolver');
+            // .emptyBeanProperty('addressResolver');
 
             if (commSpi.nonEmpty())
                 cfg.beanProperty('CommunicationSpi', commSpi);
@@ -176,7 +176,7 @@ export default ['JavaTypes', 'igniteClusterPlatformDefaults', 'igniteCachePlatfo
             cfg.intProperty('networkTimeout', 'NetworkTimeout')
                 .intProperty('networkSendRetryDelay')
                 .intProperty('networkSendRetryCount');
-                // .intProperty('discoveryStartupDelay');
+            // .intProperty('discoveryStartupDelay');
 
             return cfg;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/demo/Demo.module.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/demo/Demo.module.js b/modules/web-console/frontend/app/modules/demo/Demo.module.js
index d75beda..2445461 100644
--- a/modules/web-console/frontend/app/modules/demo/Demo.module.js
+++ b/modules/web-console/frontend/app/modules/demo/Demo.module.js
@@ -24,7 +24,7 @@ angular
 .module('ignite-console.demo', [
     'ignite-console.socket'
 ])
-.config(['$stateProvider', 'AclRouteProvider', ($stateProvider, AclRoute) => {
+.config(['$stateProvider', ($stateProvider) => {
     $stateProvider
         .state('demo', {
             abstract: true,
@@ -33,17 +33,17 @@ angular
         })
         .state('demo.resume', {
             url: '/resume',
-            onEnter: AclRoute.checkAccess('demo'),
+            permission: 'demo',
             controller: ['$state', ($state) => {
                 $state.go('base.configuration.tabs.advanced.clusters');
             }],
-            metaTags: {
+            tfMetaTags: {
                 title: 'Demo resume'
             }
         })
         .state('demo.reset', {
             url: '/reset',
-            onEnter: AclRoute.checkAccess('demo'),
+            permission: 'demo',
             controller: ['$state', '$http', 'IgniteMessages', ($state, $http, Messages) => {
                 $http.post('/api/v1/demo/reset')
                     .then(() => $state.go('base.configuration.tabs.advanced.clusters'))
@@ -53,7 +53,7 @@ angular
                         Messages.showError(res);
                     });
             }],
-            metaTags: {
+            tfMetaTags: {
                 title: 'Demo reset'
             }
         });

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/dialog/dialog.controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/dialog/dialog.controller.js b/modules/web-console/frontend/app/modules/dialog/dialog.controller.js
index 05518d3..0256b84 100644
--- a/modules/web-console/frontend/app/modules/dialog/dialog.controller.js
+++ b/modules/web-console/frontend/app/modules/dialog/dialog.controller.js
@@ -33,8 +33,4 @@ export default ['$rootScope', '$scope', 'IgniteDialog', function($root, $scope,
     $scope.$watch(() => ctrl.content, () => {
         $scope.content = ctrl.content;
     });
-
-    $root.$on('$stateChangeStart', () => {
-        dialog.hide();
-    });
 }];

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/form/field/label.directive.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/form/field/label.directive.js b/modules/web-console/frontend/app/modules/form/field/label.directive.js
index 97ba598..94f7889 100644
--- a/modules/web-console/frontend/app/modules/form/field/label.directive.js
+++ b/modules/web-console/frontend/app/modules/form/field/label.directive.js
@@ -20,7 +20,7 @@ export default ['igniteFormFieldLabel', [() => {
         restrict: 'E',
         compile() {
             return {
-                post($scope, $element, $attrs, [form, field], $transclude) {
+                post($scope, $element, $attrs, [field], $transclude) {
                     $transclude($scope, function(clone) {
                         const text = clone.text();
 
@@ -42,6 +42,6 @@ export default ['igniteFormFieldLabel', [() => {
         },
         replace: true,
         transclude: true,
-        require: ['^form', '?^igniteFormField']
+        require: ['?^igniteFormField']
     };
 }]];

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/form/field/tooltip.directive.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/form/field/tooltip.directive.js b/modules/web-console/frontend/app/modules/form/field/tooltip.directive.js
index 4f440a1..9e764bc 100644
--- a/modules/web-console/frontend/app/modules/form/field/tooltip.directive.js
+++ b/modules/web-console/frontend/app/modules/form/field/tooltip.directive.js
@@ -18,7 +18,7 @@
 const template = '<i class="tipField icon-help"></i>';
 
 export default ['igniteFormFieldTooltip', ['$tooltip', ($tooltip) => {
-    const link = ($scope, $element, $attrs, [form, field], $transclude) => {
+    const link = ($scope, $element, $attrs, [field], $transclude) => {
         const content = Array.prototype.slice
             .apply($transclude($scope))
             .reduce((html, el) => html += el.outerHTML || el.textContent || el, '');
@@ -44,6 +44,6 @@ export default ['igniteFormFieldTooltip', ['$tooltip', ($tooltip) => {
         link,
         replace: true,
         transclude: true,
-        require: ['^form', '?^igniteFormField']
+        require: ['?^igniteFormField']
     };
 }]];

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/sql/sql.controller.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/sql/sql.controller.js b/modules/web-console/frontend/app/modules/sql/sql.controller.js
index 633f167..3d38634 100644
--- a/modules/web-console/frontend/app/modules/sql/sql.controller.js
+++ b/modules/web-console/frontend/app/modules/sql/sql.controller.js
@@ -1247,7 +1247,7 @@ export default ['$rootScope', '$scope', '$http', '$q', '$timeout', '$interval',
 
             const chartHistory = paragraph.chartHistory;
 
-                // Clear history on query change.
+            // Clear history on query change.
             if (clearChart) {
                 chartHistory.length = 0;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/sql/sql.module.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/sql/sql.module.js b/modules/web-console/frontend/app/modules/sql/sql.module.js
index 79614c2..da9955c 100644
--- a/modules/web-console/frontend/app/modules/sql/sql.module.js
+++ b/modules/web-console/frontend/app/modules/sql/sql.module.js
@@ -27,37 +27,35 @@ import sqlTplUrl from 'app/../views/sql/sql.tpl.pug';
 angular.module('ignite-console.sql', [
     'ui.router'
 ])
-    .config(['$stateProvider', 'AclRouteProvider',
-        ($stateProvider, AclRoute) => {
-            // set up the states
-            $stateProvider
-                .state('base.sql', {
-                    url: '/queries',
-                    abstract: true,
-                    template: '<ui-view></ui-view>'
-                })
-                .state('base.sql.notebook', {
-                    url: '/notebook/{noteId}',
-                    templateUrl: sqlTplUrl,
-                    onEnter: AclRoute.checkAccess('query'),
-                    metaTags: {
-                        title: 'Query notebook'
-                    },
-                    controller,
-                    controllerAs: '$ctrl'
-                })
-                .state('base.sql.demo', {
-                    url: '/demo',
-                    templateUrl: sqlTplUrl,
-                    onEnter: AclRoute.checkAccess('query'),
-                    metaTags: {
-                        title: 'SQL demo'
-                    },
-                    controller,
-                    controllerAs: '$ctrl'
-                });
-        }]
-    )
-    .service('IgniteNotebookData', NotebookData)
-    .service('IgniteNotebook', Notebook)
-    .controller('notebookController', notebook);
+.config(['$stateProvider', ($stateProvider) => {
+    // set up the states
+    $stateProvider
+        .state('base.sql', {
+            url: '/queries',
+            abstract: true,
+            template: '<ui-view></ui-view>'
+        })
+        .state('base.sql.notebook', {
+            url: '/notebook/{noteId}',
+            templateUrl: sqlTplUrl,
+            permission: 'query',
+            tfMetaTags: {
+                title: 'Query notebook'
+            },
+            controller,
+            controllerAs: '$ctrl'
+        })
+        .state('base.sql.demo', {
+            url: '/demo',
+            templateUrl: sqlTplUrl,
+            permission: 'query',
+            tfMetaTags: {
+                title: 'SQL demo'
+            },
+            controller,
+            controllerAs: '$ctrl'
+        });
+}])
+.service('IgniteNotebookData', NotebookData)
+.service('IgniteNotebook', Notebook)
+.controller('notebookController', notebook);

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/states/admin.state.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/admin.state.js b/modules/web-console/frontend/app/modules/states/admin.state.js
index 7189508..65e13aa 100644
--- a/modules/web-console/frontend/app/modules/states/admin.state.js
+++ b/modules/web-console/frontend/app/modules/states/admin.state.js
@@ -24,7 +24,7 @@ angular
 .module('ignite-console.states.admin', [
     'ui.router'
 ])
-.config(['$stateProvider', 'AclRouteProvider', function($stateProvider, AclRoute) {
+.config(['$stateProvider', function($stateProvider) {
     // set up the states
     $stateProvider
     .state('base.settings.admin', {
@@ -50,8 +50,8 @@ angular
             }
         },
         // templateUrl,
-        onEnter: AclRoute.checkAccess('admin_page'),
-        metaTags: {
+        permission: 'admin_page',
+        tfMetaTags: {
             title: 'Admin panel'
         }
     });

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/states/configuration.state.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration.state.js b/modules/web-console/frontend/app/modules/states/configuration.state.js
index faf9315..d2c1410 100644
--- a/modules/web-console/frontend/app/modules/states/configuration.state.js
+++ b/modules/web-console/frontend/app/modules/states/configuration.state.js
@@ -51,7 +51,7 @@ angular.module('ignite-console.states.configuration', ['ui.router'])
         $templateCache.put('summary-tabs.html', summaryTabsTemplateUrl);
     }])
     // Configure state provider.
-    .config(['$stateProvider', 'AclRouteProvider', ($stateProvider, AclRoute) => {
+    .config(['$stateProvider', ($stateProvider) => {
         // Setup the states.
         $stateProvider
             .state('base.configuration', {
@@ -64,15 +64,21 @@ angular.module('ignite-console.states.configuration', ['ui.router'])
             })
             .state('base.configuration.tabs', {
                 url: '/configuration',
+                permission: 'configuration',
                 template: '<page-configure></page-configure>',
-                metaTags: {
+                redirectTo: (trans) => {
+                    const PageConfigure = trans.injector().get('PageConfigure');
+
+                    return PageConfigure.onStateEnterRedirect(trans.to());
+                },
+                tfMetaTags: {
                     title: 'Configuration'
                 }
             })
             .state('base.configuration.tabs.basic', {
                 url: '/basic',
                 template: '<page-configure-basic></page-configure-basic>',
-                metaTags: {
+                tfMetaTags: {
                     title: 'Basic Configuration'
                 },
                 resolve: {
@@ -88,13 +94,14 @@ angular.module('ignite-console.states.configuration', ['ui.router'])
             })
             .state('base.configuration.tabs.advanced', {
                 url: '/advanced',
-                template: '<page-configure-advanced></page-configure-advanced>'
+                template: '<page-configure-advanced></page-configure-advanced>',
+                redirectTo: 'base.configuration.tabs.advanced.clusters'
             })
             .state('base.configuration.tabs.advanced.clusters', {
                 url: '/clusters',
                 templateUrl: clustersTpl,
-                onEnter: AclRoute.checkAccess('configuration'),
-                metaTags: {
+                permission: 'configuration',
+                tfMetaTags: {
                     title: 'Configure Clusters'
                 },
                 controller: clustersCtrl,
@@ -103,8 +110,8 @@ angular.module('ignite-console.states.configuration', ['ui.router'])
             .state('base.configuration.tabs.advanced.caches', {
                 url: '/caches',
                 templateUrl: cachesTpl,
-                onEnter: AclRoute.checkAccess('configuration'),
-                metaTags: {
+                permission: 'configuration',
+                tfMetaTags: {
                     title: 'Configure Caches'
                 },
                 controller: cachesCtrl,
@@ -113,8 +120,8 @@ angular.module('ignite-console.states.configuration', ['ui.router'])
             .state('base.configuration.tabs.advanced.domains', {
                 url: '/domains',
                 templateUrl: domainsTpl,
-                onEnter: AclRoute.checkAccess('configuration'),
-                metaTags: {
+                permission: 'configuration',
+                tfMetaTags: {
                     title: 'Configure Domain Model'
                 },
                 controller: domainsCtrl,
@@ -123,8 +130,8 @@ angular.module('ignite-console.states.configuration', ['ui.router'])
             .state('base.configuration.tabs.advanced.igfs', {
                 url: '/igfs',
                 templateUrl: igfsTpl,
-                onEnter: AclRoute.checkAccess('configuration'),
-                metaTags: {
+                permission: 'configuration',
+                tfMetaTags: {
                     title: 'Configure IGFS'
                 },
                 controller: igfsCtrl,
@@ -133,10 +140,10 @@ angular.module('ignite-console.states.configuration', ['ui.router'])
             .state('base.configuration.tabs.advanced.summary', {
                 url: '/summary',
                 templateUrl: summaryTpl,
-                onEnter: AclRoute.checkAccess('configuration'),
+                permission: 'configuration',
                 controller: ConfigurationSummaryCtrl,
                 controllerAs: 'ctrl',
-                metaTags: {
+                tfMetaTags: {
                     title: 'Configurations Summary'
                 }
             });

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/states/configuration/summary/summary-zipper.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/summary/summary-zipper.service.js b/modules/web-console/frontend/app/modules/states/configuration/summary/summary-zipper.service.js
index 0259d39..47ce9ad 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/summary/summary-zipper.service.js
+++ b/modules/web-console/frontend/app/modules/states/configuration/summary/summary-zipper.service.js
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import Worker from 'worker?inline=true!./summary.worker';
+import Worker from 'worker!./summary.worker';
 
 export default ['$q', function($q) {
     return function(message) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/states/errors.state.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/errors.state.js b/modules/web-console/frontend/app/modules/states/errors.state.js
index e3d4d41..3cc03be 100644
--- a/modules/web-console/frontend/app/modules/states/errors.state.js
+++ b/modules/web-console/frontend/app/modules/states/errors.state.js
@@ -29,7 +29,7 @@ angular
             .state('404', {
                 url: '/404',
                 templateUrl: templateNotFoundPage,
-                metaTags: {
+                tfMetaTags: {
                     title: 'Page not found'
                 },
                 unsaved: true
@@ -37,7 +37,7 @@ angular
             .state('403', {
                 url: '/403',
                 templateUrl: templateNotAuthorizedPage,
-                metaTags: {
+                tfMetaTags: {
                     title: 'Not authorized'
                 },
                 unsaved: true

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/states/logout.state.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/logout.state.js b/modules/web-console/frontend/app/modules/states/logout.state.js
index 42795ea..9f9c7c6 100644
--- a/modules/web-console/frontend/app/modules/states/logout.state.js
+++ b/modules/web-console/frontend/app/modules/states/logout.state.js
@@ -17,18 +17,16 @@
 
 import angular from 'angular';
 
-angular
-.module('ignite-console.states.logout', [
+angular.module('ignite-console.states.logout', [
     'ui.router'
 ])
-.config(['$stateProvider', 'AclRouteProvider', function($stateProvider, AclRoute) {
+.config(['$stateProvider', function($stateProvider) {
     // set up the states
-    $stateProvider
-    .state('logout', {
+    $stateProvider.state('logout', {
         url: '/logout',
-        onEnter: AclRoute.checkAccess('logout'),
+        permission: 'logout',
         controller: ['Auth', (Auth) => Auth.logout()],
-        metaTags: {
+        tfMetaTags: {
             title: 'Logout'
         }
     });

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/states/password.state.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/password.state.js b/modules/web-console/frontend/app/modules/states/password.state.js
index 587f83d..8e326bf 100644
--- a/modules/web-console/frontend/app/modules/states/password.state.js
+++ b/modules/web-console/frontend/app/modules/states/password.state.js
@@ -34,14 +34,14 @@ angular
     .state('password.reset', {
         url: '/reset?{token}',
         templateUrl,
-        metaTags: {
+        tfMetaTags: {
             title: 'Reset password'
         }
     })
     .state('password.send', {
         url: '/send',
         templateUrl,
-        metaTags: {
+        tfMetaTags: {
             title: 'Password Send'
         }
     });

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/states/profile.state.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/profile.state.js b/modules/web-console/frontend/app/modules/states/profile.state.js
index 3298bdc..87d1d02 100644
--- a/modules/web-console/frontend/app/modules/states/profile.state.js
+++ b/modules/web-console/frontend/app/modules/states/profile.state.js
@@ -23,14 +23,13 @@ angular
 .module('ignite-console.states.profile', [
     'ui.router'
 ])
-.config(['$stateProvider', 'AclRouteProvider', function($stateProvider, AclRoute) {
+.config(['$stateProvider', 'AclRouteProvider', function($stateProvider) {
     // set up the states
-    $stateProvider
-    .state('base.settings.profile', {
+    $stateProvider.state('base.settings.profile', {
         url: '/profile',
         templateUrl,
-        onEnter: AclRoute.checkAccess('profile'),
-        metaTags: {
+        permission: 'profile',
+        tfMetaTags: {
             title: 'User profile'
         }
     });

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/states/signin.state.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/signin.state.js b/modules/web-console/frontend/app/modules/states/signin.state.js
index b7be51d..f5a4964 100644
--- a/modules/web-console/frontend/app/modules/states/signin.state.js
+++ b/modules/web-console/frontend/app/modules/states/signin.state.js
@@ -24,30 +24,26 @@ angular
     // services
     'ignite-console.user'
 ])
-.config(['$stateProvider', 'AclRouteProvider', function($stateProvider) {
+.config(['$stateProvider', function($stateProvider) {
     // set up the states
     $stateProvider
     .state('signin', {
         url: '/',
         templateUrl,
-        resolve: {
-            user: ['$state', 'User', ($state, User) => {
-                return User.read()
-                    .then(() => {
-                        try {
-                            const {name, params} = JSON.parse(localStorage.getItem('lastStateChangeSuccess'));
+        redirectTo: (trans) => {
+            return trans.injector().get('User').read()
+                .then(() => {
+                    try {
+                        const {name, params} = JSON.parse(localStorage.getItem('lastStateChangeSuccess'));
 
-                            $state.go(name, params);
-                        } catch (ignored) {
-                            $state.go('base.configuration.tabs');
-                        }
-                    })
-                    .catch(() => {});
-            }]
-        },
-        controllerAs: '$ctrl',
-        controller() {},
-        metaTags: {
+                        const restored = trans.router.stateService.target(name, params);
+
+                        return restored.valid() ? restored : 'base.configuration.tabs';
+                    } catch (ignored) {
+                        return 'base.configuration.tabs';
+                    }
+                })
+                .catch(() => true);
         }
     });
 }]);

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/user/AclRoute.provider.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/user/AclRoute.provider.js b/modules/web-console/frontend/app/modules/user/AclRoute.provider.js
index 4225bc4..f5556ff 100644
--- a/modules/web-console/frontend/app/modules/user/AclRoute.provider.js
+++ b/modules/web-console/frontend/app/modules/user/AclRoute.provider.js
@@ -17,11 +17,9 @@
 
 export default [() => {
     class AclRoute {
-        static checkAccess(permissions, failState) {
-            failState = failState || '403';
-
+        static checkAccess(permissions, failState = '403') {
             return ['$q', '$state', 'AclService', 'User', 'IgniteActivitiesData', function($q, $state, AclService, User, Activities) {
-                const action = this.name ? $state.href(this.name) : null;
+                const action = '';
 
                 return User.read()
                     .catch(() => {

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/modules/user/user.module.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/user/user.module.js b/modules/web-console/frontend/app/modules/user/user.module.js
index b86a62e..721d07f 100644
--- a/modules/web-console/frontend/app/modules/user/user.module.js
+++ b/modules/web-console/frontend/app/modules/user/user.module.js
@@ -50,7 +50,7 @@ angular.module('ignite-console.user', [
 .service(...Auth)
 .service(...User)
 .provider('AclRoute', AclRouteProvider)
-.run(['$rootScope', 'AclService', ($root, AclService) => {
+.run(['$rootScope', '$transitions', 'AclService', 'User', 'IgniteActivitiesData', ($root, $transitions, AclService, User, Activities) => {
     AclService.setAbilities(aclData);
     AclService.attachRole('guest');
 
@@ -70,4 +70,32 @@ angular.module('ignite-console.user', [
 
         AclService.attachRole(role);
     });
+
+    $transitions.onBefore({}, (t) => {
+        const $state = t.router.stateService;
+        const {name, permission} = t.to();
+
+        return User.read()
+            .catch(() => {
+                User.clean();
+
+                if (name !== 'signin')
+                    return $state.target('signin');
+
+                return true;
+            })
+            .then(() => {
+                if (_.isEmpty(permission))
+                    return true;
+
+                if (AclService.can(permission)) {
+                    Activities.post({action: $state.href(name, t.params('to'))});
+
+                    return true;
+                }
+
+                return $state.target(t.to().failState || '403');
+            });
+
+    });
 }]);

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/services/CopyToClipboard.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/services/CopyToClipboard.service.js b/modules/web-console/frontend/app/services/CopyToClipboard.service.js
index 74c4764..df0bb8a 100644
--- a/modules/web-console/frontend/app/services/CopyToClipboard.service.js
+++ b/modules/web-console/frontend/app/services/CopyToClipboard.service.js
@@ -38,10 +38,10 @@ export default ['IgniteCopyToClipboard', ['$window', 'IgniteMessages', ($window,
                 if (document.execCommand('copy'))
                     Messages.showInfo('Value copied to clipboard');
                 else
-                    window.prompt('Copy to clipboard: Ctrl+C, Enter', toCopy);  // eslint-disable-line no-alert
+                    window.prompt('Copy to clipboard: Ctrl+C, Enter', toCopy); // eslint-disable-line no-alert
             }
             catch (err) {
-                window.prompt('Copy to clipboard: Ctrl+C, Enter', toCopy);  // eslint-disable-line no-alert
+                window.prompt('Copy to clipboard: Ctrl+C, Enter', toCopy); // eslint-disable-line no-alert
             }
 
             textArea.remove();

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/services/LegacyTable.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/services/LegacyTable.service.js b/modules/web-console/frontend/app/services/LegacyTable.service.js
index a024a3b..ab95164 100644
--- a/modules/web-console/frontend/app/services/LegacyTable.service.js
+++ b/modules/web-console/frontend/app/services/LegacyTable.service.js
@@ -25,7 +25,7 @@ export default ['IgniteLegacyTable',
                 return item;
 
             path = path.replace(/\[(\w+)\]/g, '.$1'); // convert indexes to properties
-            path = path.replace(/^\./, '');           // strip a leading dot
+            path = path.replace(/^\./, ''); // strip a leading dot
 
             const segs = path.split('.');
             let root = item;

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/app/vendor.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/vendor.js b/modules/web-console/frontend/app/vendor.js
index 3bbb322..ea0f63c 100644
--- a/modules/web-console/frontend/app/vendor.js
+++ b/modules/web-console/frontend/app/vendor.js
@@ -24,9 +24,12 @@ import 'angular-strap';
 import 'angular-strap/dist/angular-strap.tpl';
 import 'angular-socket-io';
 import 'angular-retina';
-import 'angular-ui-router';
+
+import '@uirouter/angularjs';
+import '@uirouter/angularjs/lib/legacy/stateEvents';
+
+import 'tf-metatags';
 import 'angular-translate';
-import 'ui-router-metatags/dist/ui-router-metatags';
 import 'angular-smart-table';
 import 'angular-ui-grid/ui-grid';
 import 'angular-drag-and-drop-lists';
@@ -49,6 +52,7 @@ import 'file-saver';
 import 'jszip';
 import 'nvd3';
 import 'lodash';
+
 import 'angular-gridster/dist/angular-gridster.min.css';
 import 'angular-tree-control/css/tree-control-attribute.css';
 import 'angular-tree-control/css/tree-control.css';

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/package.json
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/package.json b/modules/web-console/frontend/package.json
index 05c6eec..6b049ff 100644
--- a/modules/web-console/frontend/package.json
+++ b/modules/web-console/frontend/package.json
@@ -8,7 +8,7 @@
     "dev": "npm start",
     "build": "webpack --config ./webpack/webpack.prod.babel.js",
     "test": "karma start ./test/karma.conf.js",
-    "eslint": "eslint --format node_modules/eslint-friendly-formatter gulpfile.babel.js/ app/ controllers/ ignite_modules/ -- --eff-by-issue"
+    "eslint": "eslint --format node_modules/eslint-friendly-formatter app/ controllers/ ignite_modules/ -- --eff-by-issue"
   },
   "author": "",
   "contributors": [
@@ -45,13 +45,13 @@
     "angular-socket-io": "0.7.0",
     "angular-strap": "2.3.12",
     "angular-touch": "1.5.11",
-    "angular-translate": "2.15.1",
+    "angular-translate": "2.15.2",
     "angular-tree-control": "0.2.28",
-    "angular-ui-grid": "4.0.4",
-    "angular-ui-router": "0.4.2",
-    "babel-core": "6.24.1",
+    "angular-ui-grid": "4.0.6",
+    "@uirouter/angularjs": "1.0.5",
+    "babel-core": "6.25.0",
     "babel-eslint": "7.2.3",
-    "babel-loader": "7.0.0",
+    "babel-loader": "7.1.1",
     "babel-plugin-add-module-exports": "0.2.1",
     "babel-plugin-transform-runtime": "6.23.0",
     "babel-polyfill": "6.23.0",
@@ -61,45 +61,46 @@
     "bootstrap-sass": "3.3.7",
     "brace": "0.10.0",
     "copy-webpack-plugin": "4.0.1",
-    "css-loader": "0.28.3",
-    "eslint": "3.19.0",
+    "css-loader": "0.28.4",
+    "eslint": "4.3.0",
     "eslint-friendly-formatter": "3.0.0",
-    "eslint-loader": "1.7.1",
-    "eslint-plugin-babel": "^4.1.1",
+    "eslint-loader": "1.9.0",
+    "eslint-plugin-babel": "4.1.1",
     "expose-loader": "0.7.3",
-    "extract-text-webpack-plugin": "2.1.0",
-    "file-loader": "0.11.1",
+    "extract-text-webpack-plugin": "3.0.0",
+    "file-loader": "0.11.2",
     "file-saver": "1.3.3",
     "font-awesome": "4.7.0",
     "glob": "7.1.2",
     "html-loader": "0.4.5",
-    "html-webpack-plugin": "2.28.0",
+    "html-webpack-plugin": "2.29.0",
     "jquery": "3.2.1",
-    "json-loader": "0.5.4",
+    "json-loader": "0.5.7",
     "jszip": "3.1.3",
     "lodash": "4.17.4",
     "node-sass": "4.5.3",
     "nvd3": "1.8.4",
-    "progress-bar-webpack-plugin": "1.9.3",
+    "progress-bar-webpack-plugin": "1.10.0",
     "pug-html-loader": "1.1.0",
     "pug-loader": "2.3.0",
     "raleway-webfont": "3.0.1",
-    "resolve-url-loader": "2.0.2",
+    "resolve-url-loader": "2.1.0",
     "roboto-font": "0.1.0",
-    "rxjs": "5.4.0",
-    "sass-loader": "6.0.5",
+    "rxjs": "5.4.2",
+    "sass-loader": "6.0.6",
     "socket.io-client": "1.7.3",
-    "style-loader": "0.18.1",
-    "svg-sprite-loader": "^3.0.5",
-    "ui-router-metatags": "1.0.3",
-    "webpack": "2.6.1",
-    "webpack-dev-server": "2.4.5",
+    "style-loader": "0.18.2",
+    "svg-sprite-loader": "3.0.7",
+    "tf-metatags": "2.0.0",
+    "webpack": "3.3.0",
+    "webpack-dev-server": "2.6.1",
     "webpack-merge": "4.1.0",
-    "worker-loader": "0.8.0"
+    "worker-loader": "0.8.1"
   },
   "devDependencies": {
-    "chai": "4.0.2",
-    "jasmine-core": "2.6.2",
+    "chai": "4.1.0",
+    "type-detect": "4.0.3",
+    "jasmine-core": "2.6.4",
     "karma": "1.7.0",
     "karma-babel-preprocessor": "6.0.1",
     "karma-jasmine": "1.1.0",
@@ -107,10 +108,10 @@
     "karma-mocha-reporter": "2.2.3",
     "karma-phantomjs-launcher": "1.0.4",
     "karma-teamcity-reporter": "1.0.0",
-    "karma-webpack": "2.0.3",
+    "karma-webpack": "2.0.4",
     "mocha": "3.4.2",
     "mocha-teamcity-reporter": "1.1.1",
     "phantomjs-prebuilt": "2.1.14",
-    "sinon": "2.3.4"
+    "sinon": "2.3.8"
   }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/f277530a/modules/web-console/frontend/views/index.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/index.pug b/modules/web-console/frontend/views/index.pug
index f8f13dd..1881b38 100644
--- a/modules/web-console/frontend/views/index.pug
+++ b/modules/web-console/frontend/views/index.pug
@@ -23,23 +23,13 @@ html(ng-app='ignite-console' id='app' ng-strict-di)
         meta(http-equiv='content-language' content='en')
         meta(http-equiv='X-UA-Compatible' content='IE=Edge')
 
-        title(ng-bind='$meta.title')
+        title(ng-bind='tfMetaTags.title')
+        meta(ng-repeat='(key, value) in tfMetaTags.properties' name='{{::key}}' content='{{::value}}')
 
         meta(name='fragment' content='!')
-        meta(name='description' content='{{$meta.description}}')
-        meta(name='keywords' content='{{$meta.keywords}}')
-        meta(ng-repeat='(key, value) in $meta.properties' name='{{::key}}' content='{{::value}}')
 
     body.theme-line.body-overlap
 
-        .splash.splash-max-foreground(hide-on-state-change)
-            .splash-wrapper
-                .spinner
-                    .bounce1
-                    .bounce2
-                    .bounce3
-
-                .splash-wellcome Loading...
 
         .ribbon-wrapper.right(ng-cloak)
             .ribbon(ng-style='IgniteDemoMode && {"background": "#1b6d88"}')


[32/50] [abbrv] ignite git commit: IGNITE-5278: BLAS implemented.

Posted by yz...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/test/java/org/apache/ignite/ml/math/BlasTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/BlasTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/BlasTest.java
new file mode 100644
index 0000000..00bce47
--- /dev/null
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/BlasTest.java
@@ -0,0 +1,357 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.ml.math;
+
+import java.util.function.BiPredicate;
+import org.apache.ignite.ml.math.impls.matrix.DenseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.matrix.SparseLocalOnHeapMatrix;
+import org.apache.ignite.ml.math.impls.vector.DenseLocalOnHeapVector;
+import org.apache.ignite.ml.math.impls.vector.SparseLocalVector;
+import org.apache.ignite.ml.math.util.MatrixUtil;
+import org.junit.Assert;
+import org.junit.Test;
+
+/** Tests for BLAS operations (all operations are only available for local matrices and vectors). */
+public class BlasTest {
+    /** Test 'axpy' operation for two array-based vectors. */
+    @Test
+    public void testAxpyArrayArray() {
+        Vector y = new DenseLocalOnHeapVector(new double[] {1.0, 2.0});
+        double a = 2.0;
+        Vector x = new DenseLocalOnHeapVector(new double[] {1.0, 2.0});
+
+        Vector exp = x.times(a).plus(y);
+        Blas.axpy(a, x, y);
+
+        Assert.assertEquals(y, exp);
+    }
+
+    /** Test 'axpy' operation for sparse vector and array-based vector. */
+    @Test
+    public void testAxpySparseArray() {
+        DenseLocalOnHeapVector y = new DenseLocalOnHeapVector(new double[] {1.0, 2.0});
+        double a = 2.0;
+        SparseLocalVector x = sparseFromArray(new double[] {1.0, 2.0});
+
+        SparseLocalVector exp = (SparseLocalVector)x.times(a).plus(y);
+        Blas.axpy(a, x, y);
+
+        Assert.assertTrue(elementsEqual(exp, y));
+    }
+
+    /** Test 'dot' operation. */
+    @Test
+    public void testDot() {
+        DenseLocalOnHeapVector v1 = new DenseLocalOnHeapVector(new double[] {1.0, 1.0});
+        DenseLocalOnHeapVector v2 = new DenseLocalOnHeapVector(new double[] {2.0, 2.0});
+
+        Assert.assertEquals(Blas.dot(v1, v2), v1.dot(v2), 0.0);
+    }
+
+    /** Test 'scal' operation for dense matrix. */
+    @Test
+    public void testScalDense() {
+        double[] data = new double[] {1.0, 1.0};
+        double alpha = 2.0;
+
+        DenseLocalOnHeapVector v = new DenseLocalOnHeapVector(data);
+        Vector exp = new DenseLocalOnHeapVector(data, true).times(alpha);
+        Blas.scal(alpha, v);
+
+        Assert.assertEquals(v, exp);
+    }
+
+    /** Test 'scal' operation for sparse matrix. */
+    @Test
+    public void testScalSparse() {
+        double[] data = new double[] {1.0, 1.0};
+        double alpha = 2.0;
+
+        SparseLocalVector v = sparseFromArray(data);
+        Vector exp = sparseFromArray(data).times(alpha);
+
+        Blas.scal(alpha, v);
+
+        Assert.assertEquals(v, exp);
+    }
+
+    /** Test 'spr' operation for dense vector v and dense matrix A. */
+    @Test
+    public void testSprDenseDense() {
+        double alpha = 3.0;
+
+        DenseLocalOnHeapVector v = new DenseLocalOnHeapVector(new double[] {1.0, 2.0});
+        DenseLocalOnHeapVector u = new DenseLocalOnHeapVector(new double[] {3.0, 13.0, 20.0, 0.0});
+
+        // m is alpha * v * v^t
+        DenseLocalOnHeapMatrix m = (DenseLocalOnHeapMatrix)new DenseLocalOnHeapMatrix(new double[][] {{1.0, 0.0},
+            {2.0, 4.0}}, StorageConstants.COLUMN_STORAGE_MODE).times(alpha);
+        DenseLocalOnHeapMatrix a = new DenseLocalOnHeapMatrix(new double[][] {{3.0, 0.0}, {13.0, 20.0}},
+            StorageConstants.COLUMN_STORAGE_MODE);
+
+        //m := alpha * v * v.t + A
+        Blas.spr(alpha, v, u);
+
+        DenseLocalOnHeapMatrix mu = fromVector(u, a.rowSize(), StorageConstants.COLUMN_STORAGE_MODE, (i, j) -> i >= j);
+        Assert.assertEquals(m.plus(a), mu);
+    }
+
+    /** Test 'spr' operation for sparse vector v (sparse in representation, dense in fact) and dense matrix A. */
+    @Test
+    public void testSprSparseDense1() {
+        double alpha = 3.0;
+
+        SparseLocalVector v = sparseFromArray(new double[] {1.0, 2.0});
+        DenseLocalOnHeapVector u = new DenseLocalOnHeapVector(new double[] {3.0, 13.0, 20.0, 0.0});
+
+        DenseLocalOnHeapMatrix a = new DenseLocalOnHeapMatrix(new double[][] {{3.0, 0.0}, {13.0, 20.0}},
+            StorageConstants.COLUMN_STORAGE_MODE);
+        DenseLocalOnHeapMatrix exp = (DenseLocalOnHeapMatrix)new DenseLocalOnHeapMatrix(new double[][] {{1.0, 0.0},
+            {2.0, 4.0}}, StorageConstants.COLUMN_STORAGE_MODE).times(alpha).plus(a);
+
+        //m := alpha * v * v.t + A
+        Blas.spr(alpha, v, u);
+        DenseLocalOnHeapMatrix mu = fromVector(u, a.rowSize(), StorageConstants.COLUMN_STORAGE_MODE, (i, j) -> i >= j);
+        Assert.assertEquals(exp, mu);
+    }
+
+    /** Test 'spr' operation for sparse vector v (sparse in representation, sparse in fact) and dense matrix A. */
+    @Test
+    public void testSprSparseDense2() {
+        double alpha = 3.0;
+
+        SparseLocalVector v = new SparseLocalVector(2, StorageConstants.RANDOM_ACCESS_MODE);
+        v.set(0, 1);
+
+        DenseLocalOnHeapVector u = new DenseLocalOnHeapVector(new double[] {3.0, 13.0, 20.0, 0.0});
+
+        // m is alpha * v * v^t
+        DenseLocalOnHeapMatrix m = (DenseLocalOnHeapMatrix)new DenseLocalOnHeapMatrix(new double[][] {{1.0, 0.0},
+            {0.0, 0.0}}, StorageConstants.COLUMN_STORAGE_MODE).times(alpha);
+        DenseLocalOnHeapMatrix a = new DenseLocalOnHeapMatrix(new double[][] {{3.0, 0.0}, {13.0, 20.0}},
+            StorageConstants.COLUMN_STORAGE_MODE);
+
+        //m := alpha * v * v.t + A
+        Blas.spr(alpha, v, u);
+        DenseLocalOnHeapMatrix mu = fromVector(u, a.rowSize(), StorageConstants.COLUMN_STORAGE_MODE, (i, j) -> i >= j);
+        Assert.assertEquals(m.plus(a), mu);
+    }
+
+    /** Tests 'syr' operation for dense vector x and dense matrix A. */
+    @Test
+    public void testSyrDenseDense() {
+        double alpha = 2.0;
+        DenseLocalOnHeapVector x = new DenseLocalOnHeapVector(new double[] {1.0, 2.0});
+        DenseLocalOnHeapMatrix a = new DenseLocalOnHeapMatrix(new double[][] {{10.0, 20.0}, {20.0, 10.0}});
+
+        // alpha * x * x^T + A
+        DenseLocalOnHeapMatrix exp = (DenseLocalOnHeapMatrix)new DenseLocalOnHeapMatrix(new double[][] {{1.0, 2.0},
+            {2.0, 4.0}}).times(alpha).plus(a);
+
+        Blas.syr(alpha, x, a);
+
+        Assert.assertEquals(exp, a);
+    }
+
+    /** Tests 'gemm' operation for dense matrix A, dense matrix B and dense matrix C. */
+    @Test
+    public void testGemmDenseDenseDense() {
+        // C := alpha * A * B + beta * C
+        double alpha = 2.0;
+        DenseLocalOnHeapMatrix a = new DenseLocalOnHeapMatrix(new double[][] {{10.0, 11.0}, {0.0, 1.0}});
+        DenseLocalOnHeapMatrix b = new DenseLocalOnHeapMatrix(new double[][] {{1.0, 0.0}, {0.0, 1.0}});
+        double beta = 3.0;
+        DenseLocalOnHeapMatrix c = new DenseLocalOnHeapMatrix(new double[][] {{1.0, 2.0}, {2.0, 3.0}});
+
+        DenseLocalOnHeapMatrix exp = (DenseLocalOnHeapMatrix)a.times(b).times(alpha).plus(c.times(beta));
+
+        Blas.gemm(alpha, a, b, beta, c);
+        Assert.assertEquals(exp, c);
+    }
+
+    /** Tests 'gemm' operation for sparse matrix A, dense matrix B and dense matrix C. */
+    @Test
+    public void testGemmSparseDenseDense() {
+        // C := alpha * A * B + beta * C
+        double alpha = 2.0;
+        SparseLocalOnHeapMatrix a = sparseFromArray(new double[][] {{10.0, 11.0}, {0.0, 1.0}}, 2);
+        DenseLocalOnHeapMatrix b = new DenseLocalOnHeapMatrix(new double[][] {{1.0, 0.0}, {0.0, 1.0}});
+        double beta = 3.0;
+        DenseLocalOnHeapMatrix c = new DenseLocalOnHeapMatrix(new double[][] {{1.0, 2.0}, {2.0, 3.0}});
+
+        DenseLocalOnHeapMatrix exp = MatrixUtil.asDense((SparseLocalOnHeapMatrix)a.times(b).times(alpha).plus(c.times(beta)),
+            StorageConstants.ROW_STORAGE_MODE);
+
+        Blas.gemm(alpha, a, b, beta, c);
+
+        Assert.assertEquals(exp, c);
+    }
+
+    /** Tests 'gemv' operation for dense matrix A, dense vector x and dense vector y. */
+    @Test
+    public void testGemvSparseDenseDense() {
+        // y := alpha * A * x + beta * y
+        double alpha = 3.0;
+        SparseLocalOnHeapMatrix a = sparseFromArray(new double[][] {{10.0, 11.0}, {0.0, 1.0}}, 2);
+        DenseLocalOnHeapVector x = new DenseLocalOnHeapVector(new double[] {1.0, 2.0});
+        double beta = 2.0;
+        DenseLocalOnHeapVector y = new DenseLocalOnHeapVector(new double[] {3.0, 4.0});
+
+        DenseLocalOnHeapVector exp = (DenseLocalOnHeapVector)y.times(beta).plus(a.times(x).times(alpha));
+
+        Blas.gemv(alpha, a, x, beta, y);
+
+        Assert.assertEquals(exp, y);
+    }
+
+    /** Tests 'gemv' operation for dense matrix A, sparse vector x and dense vector y. */
+    @Test
+    public void testGemvDenseSparseDense() {
+        // y := alpha * A * x + beta * y
+        double alpha = 3.0;
+        SparseLocalOnHeapMatrix a = sparseFromArray(new double[][] {{10.0, 11.0}, {0.0, 1.0}}, 2);
+        SparseLocalVector x = sparseFromArray(new double[] {1.0, 2.0});
+        double beta = 2.0;
+        DenseLocalOnHeapVector y = new DenseLocalOnHeapVector(new double[] {3.0, 4.0});
+
+        DenseLocalOnHeapVector exp = (DenseLocalOnHeapVector)y.times(beta).plus(a.times(x).times(alpha));
+
+        Blas.gemv(alpha, a, x, beta, y);
+
+        Assert.assertEquals(exp, y);
+    }
+
+    /** Tests 'gemv' operation for sparse matrix A, sparse vector x and dense vector y. */
+    @Test
+    public void testGemvSparseSparseDense() {
+        // y := alpha * A * x + beta * y
+        double alpha = 3.0;
+        DenseLocalOnHeapMatrix a = new DenseLocalOnHeapMatrix(new double[][] {{10.0, 11.0}, {0.0, 1.0}}, 2);
+        SparseLocalVector x = sparseFromArray(new double[] {1.0, 2.0});
+        double beta = 2.0;
+        DenseLocalOnHeapVector y = new DenseLocalOnHeapVector(new double[] {3.0, 4.0});
+
+        DenseLocalOnHeapVector exp = (DenseLocalOnHeapVector)y.times(beta).plus(a.times(x).times(alpha));
+
+        Blas.gemv(alpha, a, x, beta, y);
+
+        Assert.assertEquals(exp, y);
+    }
+
+    /** Tests 'gemv' operation for dense matrix A, dense vector x and dense vector y. */
+    @Test
+    public void testGemvDenseDenseDense() {
+        // y := alpha * A * x + beta * y
+        double alpha = 3.0;
+        DenseLocalOnHeapMatrix a = new DenseLocalOnHeapMatrix(new double[][] {{10.0, 11.0}, {0.0, 1.0}}, 2);
+        DenseLocalOnHeapVector x = new DenseLocalOnHeapVector(new double[] {1.0, 2.0});
+        double beta = 2.0;
+        DenseLocalOnHeapVector y = new DenseLocalOnHeapVector(new double[] {3.0, 4.0});
+
+        DenseLocalOnHeapVector exp = (DenseLocalOnHeapVector)y.times(beta).plus(a.times(x).times(alpha));
+
+        Blas.gemv(alpha, a, x, beta, y);
+
+        Assert.assertEquals(exp, y);
+    }
+
+    /**
+     * Create a sparse vector from array.
+     *
+     * @param arr Array with vector elements.
+     * @return sparse local on-heap vector.
+     */
+    private static SparseLocalVector sparseFromArray(double[] arr) {
+        SparseLocalVector res = new SparseLocalVector(2, StorageConstants.RANDOM_ACCESS_MODE);
+
+        for (int i = 0; i < arr.length; i++)
+            res.setX(i, arr[i]);
+
+        return res;
+    }
+
+    /**
+     * Create a sparse matrix from array.
+     *
+     * @param arr Array with matrix elements.
+     * @param rows Number of rows in target matrix.
+     * @return sparse local on-heap matrix.
+     */
+    private static SparseLocalOnHeapMatrix sparseFromArray(double[][] arr, int rows) {
+        int cols = arr[0].length;
+        SparseLocalOnHeapMatrix res = new SparseLocalOnHeapMatrix(rows, cols);
+
+        for (int i = 0; i < rows; i++)
+            for (int j = 0; j < cols; j++)
+                res.set(i, j, arr[i][j]);
+
+        return res;
+    }
+
+    /**
+     * Checks if two vectors have equal elements.
+     *
+     * @param a Matrix a.
+     * @param b Vector b
+     * @return true if vectors are equal element-wise, false otherwise.
+     */
+    private static boolean elementsEqual(Vector a, Vector b) {
+        int n = b.size();
+
+        for (int i = 0; i < n; i++)
+            if (a.get(i) != b.get(i))
+                return false;
+
+        return true;
+    }
+
+    /**
+     * Creates dense local on-heap matrix from vector v entities filtered by bipredicate p.
+     *
+     * @param v Vector with entities for matrix to be created.
+     * @param rows Rows number in the target matrix.
+     * @param acsMode column or row major mode.
+     * @param p bipredicate to filter entities by.
+     * @return dense local on-heap matrix.
+     */
+    private static DenseLocalOnHeapMatrix fromVector(DenseLocalOnHeapVector v, int rows, int acsMode,
+        BiPredicate<Integer, Integer> p) {
+        double[] data = v.getStorage().data();
+        int cols = data.length / rows;
+        double[] d = new double[data.length];
+
+        int iLim = acsMode == StorageConstants.ROW_STORAGE_MODE ? rows : cols;
+        int jLim = acsMode == StorageConstants.ROW_STORAGE_MODE ? cols : rows;
+
+        int shift = 0;
+
+        for (int i = 0; i < iLim; i++)
+            for (int j = 0; j < jLim; j++) {
+                int ind = i * jLim + j;
+
+                if (!p.test(i, j)) {
+                    shift++;
+                    d[ind] = 0.0;
+                    continue;
+                }
+                d[ind] = data[ind - shift];
+            }
+
+        return new DenseLocalOnHeapMatrix(d, rows, acsMode);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplMainTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplMainTestSuite.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplMainTestSuite.java
index 4d245b4..974b7bb 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplMainTestSuite.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/MathImplMainTestSuite.java
@@ -27,7 +27,8 @@ import org.junit.runners.Suite;
 @Suite.SuiteClasses({
     MathImplLocalTestSuite.class,
     MathImplDistributedTestSuite.class,
-    TracerTest.class
+    TracerTest.class,
+    BlasTest.class
 })
 public class MathImplMainTestSuite {
     // No-op.

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixViewConstructorTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixViewConstructorTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixViewConstructorTest.java
index 82564cb..3e9cdfe 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixViewConstructorTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/matrix/MatrixViewConstructorTest.java
@@ -108,7 +108,7 @@ public class MatrixViewConstructorTest {
             assertEquals(m.isDense(), delegateStorage.isDense());
             assertEquals(m.isArrayBased(), delegateStorage.isArrayBased());
 
-            assertArrayEquals(m.getStorage().data(), delegateStorage.data());
+            assertArrayEquals(m.getStorage().data(), delegateStorage.data(), 0.0);
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/de259fff/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixArrayStorageTest.java
----------------------------------------------------------------------
diff --git a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixArrayStorageTest.java b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixArrayStorageTest.java
index 569ed57..3395422 100644
--- a/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixArrayStorageTest.java
+++ b/modules/ml/src/test/java/org/apache/ignite/ml/math/impls/storage/matrix/MatrixArrayStorageTest.java
@@ -54,10 +54,10 @@ public class MatrixArrayStorageTest extends MatrixBaseStorageTest<ArrayMatrixSto
     /** */
     @Test
     public void data() throws Exception {
-        double[][] data = storage.data();
+        double[] data = storage.data();
         assertNotNull(MathTestConstants.NULL_VAL, data);
-        assertTrue(MathTestConstants.UNEXPECTED_VAL, data.length == MathTestConstants.STORAGE_SIZE);
-        assertTrue(MathTestConstants.UNEXPECTED_VAL, data[0].length == MathTestConstants.STORAGE_SIZE);
+        assertTrue(MathTestConstants.UNEXPECTED_VAL, data.length == MathTestConstants.STORAGE_SIZE *
+            MathTestConstants.STORAGE_SIZE);
     }
 
 }


[45/50] [abbrv] ignite git commit: IGNITE-5769 Abstract away .NET->Java calls

Posted by yz...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/StreamReceiverHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/StreamReceiverHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/StreamReceiverHolder.cs
index c91334d..b717d14 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/StreamReceiverHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/StreamReceiverHolder.cs
@@ -27,7 +27,6 @@ namespace Apache.Ignite.Core.Impl.Datastream
     using Apache.Ignite.Core.Impl.Binary.IO;
     using Apache.Ignite.Core.Impl.Cache;
     using Apache.Ignite.Core.Impl.Common;
-    using Apache.Ignite.Core.Impl.Unmanaged;
 
     /// <summary>
     /// Binary wrapper for <see cref="IStreamReceiver{TK,TV}"/>.
@@ -44,7 +43,7 @@ namespace Apache.Ignite.Core.Impl.Datastream
         private readonly object _rcv;
         
         /** Invoker delegate. */
-        private readonly Action<object, Ignite, IUnmanagedTarget, IBinaryStream, bool> _invoke;
+        private readonly Action<object, Ignite, IPlatformTargetInternal, IBinaryStream, bool> _invoke;
 
         /// <summary>
         /// Initializes a new instance of the <see cref="StreamReceiverHolder"/> class.
@@ -77,7 +76,7 @@ namespace Apache.Ignite.Core.Impl.Datastream
         /// <param name="rcv">Receiver.</param>
         /// <param name="invoke">Invoke delegate.</param>
         public StreamReceiverHolder(object rcv, 
-            Action<object, Ignite, IUnmanagedTarget, IBinaryStream, bool> invoke)
+            Action<object, Ignite, IPlatformTargetInternal, IBinaryStream, bool> invoke)
         {
             Debug.Assert(rcv != null);
             Debug.Assert(invoke != null);
@@ -109,7 +108,7 @@ namespace Apache.Ignite.Core.Impl.Datastream
         /// <param name="cache">Cache.</param>
         /// <param name="stream">Stream.</param>
         /// <param name="keepBinary">Binary flag.</param>
-        public void Receive(Ignite grid, IUnmanagedTarget cache, IBinaryStream stream, bool keepBinary)
+        public void Receive(Ignite grid, IPlatformTargetInternal cache, IBinaryStream stream, bool keepBinary)
         {
             Debug.Assert(grid != null);
             Debug.Assert(cache != null);
@@ -126,8 +125,8 @@ namespace Apache.Ignite.Core.Impl.Datastream
         /// <param name="cache">Cache.</param>
         /// <param name="stream">Stream.</param>
         /// <param name="keepBinary">Binary flag.</param>
-        public static void InvokeReceiver<TK, TV>(IStreamReceiver<TK, TV> receiver, Ignite grid, IUnmanagedTarget cache,
-            IBinaryStream stream, bool keepBinary)
+        public static void InvokeReceiver<TK, TV>(IStreamReceiver<TK, TV> receiver, Ignite grid, 
+            IPlatformTargetInternal cache, IBinaryStream stream, bool keepBinary)
         {
             var reader = grid.Marshaller.StartUnmarshal(stream, keepBinary);
 
@@ -138,7 +137,7 @@ namespace Apache.Ignite.Core.Impl.Datastream
             for (var i = 0; i < size; i++)
                 entries.Add(new CacheEntry<TK, TV>(reader.ReadObject<TK>(), reader.ReadObject<TV>()));
 
-            receiver.Receive(grid.GetCache<TK, TV>(cache, keepBinary), entries);
+            receiver.Receive(Ignite.GetCache<TK, TV>(cache, keepBinary), entries);
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Events/Events.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Events/Events.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Events/Events.cs
index eb454d6..3c7363e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Events/Events.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Events/Events.cs
@@ -30,13 +30,11 @@ namespace Apache.Ignite.Core.Impl.Events
     using Apache.Ignite.Core.Impl.Binary.IO;
     using Apache.Ignite.Core.Impl.Common;
     using Apache.Ignite.Core.Impl.Handle;
-    using Apache.Ignite.Core.Impl.Unmanaged;
-    using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils;
 
     /// <summary>
     /// Ignite events.
     /// </summary>
-    internal sealed class Events : PlatformTarget, IEvents
+    internal sealed class Events : PlatformTargetAdapter, IEvents
     {
         /// <summary>
         /// Opcodes.
@@ -66,15 +64,14 @@ namespace Apache.Ignite.Core.Impl.Events
 
         /** Cluster group. */
         private readonly IClusterGroup _clusterGroup;
-        
+
         /// <summary>
         /// Initializes a new instance of the <see cref="Events" /> class.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
         /// <param name="clusterGroup">Cluster group.</param>
-        public Events(IUnmanagedTarget target, Marshaller marsh, IClusterGroup clusterGroup) 
-            : base(target, marsh)
+        public Events(IPlatformTargetInternal target, IClusterGroup clusterGroup) 
+            : base(target)
         {
             Debug.Assert(clusterGroup != null);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IPlatformTargetInternal.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IPlatformTargetInternal.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IPlatformTargetInternal.cs
new file mode 100644
index 0000000..23174b4
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/IPlatformTargetInternal.cs
@@ -0,0 +1,102 @@
+/*
+ * 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.Impl
+{
+    using System;
+    using Apache.Ignite.Core.Impl.Binary;
+    using Apache.Ignite.Core.Impl.Binary.IO;
+    using Apache.Ignite.Core.Interop;
+
+    /// <summary>
+    /// Extended platform target interface with methods that operate on internal entities (streams and targets).
+    /// </summary>
+    internal interface IPlatformTargetInternal : IPlatformTarget, IDisposable
+    {
+        /// <summary>
+        /// Gets the marshaller.
+        /// </summary>
+        Marshaller Marshaller { get; }
+
+        /// <summary>
+        /// Performs InStreamOutLong operation.
+        /// </summary>
+        /// <param name="type">Operation type code.</param>
+        /// <param name="writeAction">Write action.</param>
+        /// <returns>Result.</returns>
+        long InStreamOutLong(int type, Action<IBinaryStream> writeAction);
+
+        /// <summary>
+        /// Performs InStreamOutLong operation with stream reuse.
+        /// </summary>
+        /// <param name="type">Operation type code.</param>
+        /// <param name="writeAction">Write action.</param>
+        /// <param name="readAction">Read action.</param>
+        /// <param name="readErrorAction">Error action.</param>
+        /// <returns>
+        /// Result.
+        /// </returns>
+        T InStreamOutLong<T>(int type, Action<IBinaryStream> writeAction, Func<IBinaryStream, long, T> readAction,
+            Func<IBinaryStream, Exception> readErrorAction);
+
+        /// <summary>
+        /// Performs InStreamOutStream operation.
+        /// </summary>
+        /// <typeparam name="T">Result type.</typeparam>
+        /// <param name="type">Operation type code.</param>
+        /// <param name="writeAction">Write action.</param>
+        /// <param name="readAction">Read action.</param>
+        /// <returns>Result.</returns>
+        T InStreamOutStream<T>(int type, Action<IBinaryStream> writeAction, Func<IBinaryStream, T> readAction);
+
+        /// <summary>
+        /// Performs InStreamOutObject operation.
+        /// </summary>
+        /// <param name="type">Operation type code.</param>
+        /// <param name="writeAction">Write action.</param>
+        /// <returns>Result.</returns>
+        IPlatformTargetInternal InStreamOutObject(int type, Action<IBinaryStream> writeAction);
+
+        /// <summary>
+        /// Performs InObjectStreamOutObjectStream operation.
+        /// </summary>
+        /// <typeparam name="T">Result type.</typeparam>
+        /// <param name="type">Operation type code.</param>
+        /// <param name="arg">Target argument.</param>
+        /// <param name="writeAction">Write action.</param>
+        /// <param name="readAction">Read action.</param>
+        /// <returns>Result.</returns>
+        T InObjectStreamOutObjectStream<T>(int type, Action<IBinaryStream> writeAction,
+            Func<IBinaryStream, IPlatformTargetInternal, T> readAction, IPlatformTargetInternal arg);
+
+        /// <summary>
+        /// Performs OutStream operation.
+        /// </summary>
+        /// <typeparam name="T">Result type.</typeparam>
+        /// <param name="type">Operation type code.</param>
+        /// <param name="readAction">Read action.</param>
+        /// <returns>Result.</returns>
+        T OutStream<T>(int type, Func<IBinaryStream, T> readAction);
+
+        /// <summary>
+        /// Performs the OutObject operation.
+        /// </summary>
+        /// <param name="type">Operation type code.</param>
+        /// <returns>Result.</returns>
+        IPlatformTargetInternal OutObjectInternal(int type);
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 715776e..aae6ce7 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs
@@ -28,6 +28,7 @@ namespace Apache.Ignite.Core.Impl
     using Apache.Ignite.Core.Cache;
     using Apache.Ignite.Core.Cache.Configuration;
     using Apache.Ignite.Core.Cluster;
+    using Apache.Ignite.Core.Common;
     using Apache.Ignite.Core.Compute;
     using Apache.Ignite.Core.Datastream;
     using Apache.Ignite.Core.DataStructures;
@@ -54,7 +55,7 @@ namespace Apache.Ignite.Core.Impl
     /// <summary>
     /// Native Ignite wrapper.
     /// </summary>
-    internal class Ignite : PlatformTarget, IIgnite, ICluster
+    internal class Ignite : PlatformTargetAdapter, IIgnite, ICluster
     {
         /// <summary>
         /// Operation codes for PlatformProcessorImpl calls.
@@ -92,7 +93,7 @@ namespace Apache.Ignite.Core.Impl
         private readonly string _name;
 
         /** Unmanaged node. */
-        private readonly IUnmanagedTarget _proc;
+        private readonly IPlatformTargetInternal _proc;
 
         /** Marshaller. */
         private readonly Marshaller _marsh;
@@ -138,8 +139,8 @@ namespace Apache.Ignite.Core.Impl
         /// <param name="marsh">Marshaller.</param>
         /// <param name="lifecycleHandlers">Lifecycle beans.</param>
         /// <param name="cbs">Callbacks.</param>
-        public Ignite(IgniteConfiguration cfg, string name, IUnmanagedTarget proc, Marshaller marsh,
-            IList<LifecycleHandlerHolder> lifecycleHandlers, UnmanagedCallbacks cbs) : base(proc, marsh)
+        public Ignite(IgniteConfiguration cfg, string name, IPlatformTargetInternal proc, Marshaller marsh,
+            IList<LifecycleHandlerHolder> lifecycleHandlers, UnmanagedCallbacks cbs) : base(proc)
         {
             Debug.Assert(cfg != null);
             Debug.Assert(proc != null);
@@ -156,17 +157,17 @@ namespace Apache.Ignite.Core.Impl
 
             marsh.Ignite = this;
 
-            _prj = new ClusterGroupImpl(DoOutOpObject((int) Op.GetClusterGroup), this, null);
+            _prj = new ClusterGroupImpl(Target.OutObjectInternal((int) Op.GetClusterGroup), null);
 
             _binary = new Binary.Binary(marsh);
 
-            _binaryProc = new BinaryProcessor(DoOutOpObject((int) Op.GetBinaryProcessor), marsh);
+            _binaryProc = new BinaryProcessor(DoOutOpObject((int) Op.GetBinaryProcessor));
 
             cbs.Initialize(this);
 
             // Grid is not completely started here, can't initialize interop transactions right away.
             _transactions = new Lazy<TransactionsImpl>(
-                () => new TransactionsImpl(DoOutOpObject((int) Op.GetTransactions), marsh, GetLocalNode().Id));
+                () => new TransactionsImpl(DoOutOpObject((int) Op.GetTransactions), GetLocalNode().Id));
 
             // Set reconnected task to completed state for convenience.
             _clientReconnectTaskCompletionSource.SetResult(false);
@@ -380,7 +381,14 @@ namespace Apache.Ignite.Core.Impl
         /// <param name="cancel">Cancel flag.</param>
         internal unsafe void Stop(bool cancel)
         {
-            UU.IgnitionStop(_proc.Context, Name, cancel);
+            var jniTarget = _proc as PlatformJniTarget;
+
+            if (jniTarget == null)
+            {
+                throw new IgniteException("Ignition.Stop is not supported in thin client.");
+            }
+
+            UU.IgnitionStop(jniTarget.Target.Context, Name, cancel);
 
             _cbs.Cleanup();
         }
@@ -507,9 +515,9 @@ namespace Apache.Ignite.Core.Impl
         /// <returns>
         /// New instance of cache wrapping specified native cache.
         /// </returns>
-        public ICache<TK, TV> GetCache<TK, TV>(IUnmanagedTarget nativeCache, bool keepBinary = false)
+        public static ICache<TK, TV> GetCache<TK, TV>(IPlatformTargetInternal nativeCache, bool keepBinary = false)
         {
-            return new CacheImpl<TK, TV>(this, nativeCache, _marsh, false, keepBinary, false, false);
+            return new CacheImpl<TK, TV>(nativeCache, false, keepBinary, false, false);
         }
 
         /** <inheritdoc /> */
@@ -585,7 +593,7 @@ namespace Apache.Ignite.Core.Impl
 
             var aff = DoOutOpObject((int) Op.GetAffinity, w => w.WriteString(cacheName));
             
-            return new CacheAffinityImpl(aff, _marsh, false, this);
+            return new CacheAffinityImpl(aff, false);
         }
 
         /** <inheritdoc /> */
@@ -627,7 +635,7 @@ namespace Apache.Ignite.Core.Impl
             if (nativeLong == null)
                 return null;
 
-            return new AtomicLong(nativeLong, Marshaller, name);
+            return new AtomicLong(nativeLong, name);
         }
 
         /** <inheritdoc /> */
@@ -645,7 +653,7 @@ namespace Apache.Ignite.Core.Impl
             if (nativeSeq == null)
                 return null;
 
-            return new AtomicSequence(nativeSeq, Marshaller, name);
+            return new AtomicSequence(nativeSeq, name);
         }
 
         /** <inheritdoc /> */
@@ -660,7 +668,7 @@ namespace Apache.Ignite.Core.Impl
                 w.WriteBoolean(create);
             });
 
-            return refTarget == null ? null : new AtomicReference<T>(refTarget, Marshaller, name);
+            return refTarget == null ? null : new AtomicReference<T>(refTarget, name);
         }
 
         /** <inheritdoc /> */
@@ -685,7 +693,7 @@ namespace Apache.Ignite.Core.Impl
         /** <inheritdoc /> */
         public ICollection<string> GetCacheNames()
         {
-            return OutStream((int) Op.GetCacheNames, r =>
+            return Target.OutStream((int) Op.GetCacheNames, r =>
             {
                 var res = new string[r.ReadInt()];
 
@@ -848,7 +856,7 @@ namespace Apache.Ignite.Core.Impl
         /// <summary>
         /// Gets the interop processor.
         /// </summary>
-        internal IUnmanagedTarget InteropProcessor
+        internal IPlatformTargetInternal InteropProcessor
         {
             get { return _proc; }
         }
@@ -891,7 +899,7 @@ namespace Apache.Ignite.Core.Impl
         /// </summary>
         internal void ProcessorReleaseStart()
         {
-            InLongOutLong((int) Op.ReleaseStart, 0);
+            Target.InLongOutLong((int) Op.ReleaseStart, 0);
         }
 
         /// <summary>
@@ -899,7 +907,7 @@ namespace Apache.Ignite.Core.Impl
         /// </summary>
         internal bool LoggerIsLevelEnabled(LogLevel logLevel)
         {
-            return InLongOutLong((int) Op.LoggerIsLevelEnabled, (long) logLevel) == True;
+            return Target.InLongOutLong((int) Op.LoggerIsLevelEnabled, (long) logLevel) == True;
         }
 
         /// <summary>
@@ -907,7 +915,7 @@ namespace Apache.Ignite.Core.Impl
         /// </summary>
         internal void LoggerLog(LogLevel level, string msg, string category, string err)
         {
-            InStreamOutLong((int) Op.LoggerLog, w =>
+            Target.InStreamOutLong((int) Op.LoggerLog, w =>
             {
                 w.WriteInt((int) level);
                 w.WriteString(msg);
@@ -921,7 +929,7 @@ namespace Apache.Ignite.Core.Impl
         /// </summary>
         internal IPlatformTarget GetExtension(int id)
         {
-            return InStreamOutObject((int) Op.GetExtension, w => w.WriteInt(id));
+            return ((IPlatformTarget) Target).InStreamOutObject((int) Op.GetExtension, w => w.WriteInt(id));
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Messaging/Messaging.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Messaging/Messaging.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Messaging/Messaging.cs
index 1b43438..e17bcbf 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Messaging/Messaging.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Messaging/Messaging.cs
@@ -29,13 +29,12 @@ namespace Apache.Ignite.Core.Impl.Messaging
     using Apache.Ignite.Core.Impl.Collections;
     using Apache.Ignite.Core.Impl.Common;
     using Apache.Ignite.Core.Impl.Resource;
-    using Apache.Ignite.Core.Impl.Unmanaged;
     using Apache.Ignite.Core.Messaging;
 
     /// <summary>
     /// Messaging functionality.
     /// </summary>
-    internal class Messaging : PlatformTarget, IMessaging
+    internal class Messaging : PlatformTargetAdapter, IMessaging
     {
         /// <summary>
         /// Opcodes.
@@ -67,10 +66,9 @@ namespace Apache.Ignite.Core.Impl.Messaging
         /// Initializes a new instance of the <see cref="Messaging" /> class.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
         /// <param name="prj">Cluster group.</param>
-        public Messaging(IUnmanagedTarget target, Marshaller marsh, IClusterGroup prj)
-            : base(target, marsh)
+        public Messaging(IPlatformTargetInternal target, IClusterGroup prj)
+            : base(target)
         {
             Debug.Assert(prj != null);
 
@@ -102,7 +100,7 @@ namespace Apache.Ignite.Core.Impl.Messaging
             {
                 writer.Write(topic);
 
-                WriteEnumerable(writer, messages.OfType<object>());
+                writer.WriteEnumerable(messages.OfType<object>());
             });
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformDisposableTargetAdapter.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformDisposableTargetAdapter.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformDisposableTargetAdapter.cs
new file mode 100644
index 0000000..f884c40
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformDisposableTargetAdapter.cs
@@ -0,0 +1,75 @@
+/*
+ * 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.Impl
+{
+    using System;
+
+    /// <summary>
+    /// PlatformTargetAdapter with IDisposable pattern.
+    /// </summary>
+    internal abstract class PlatformDisposableTargetAdapter : PlatformTargetAdapter, IDisposable
+    {
+        /** Disposed flag. */
+        private volatile bool _disposed;
+
+        /// <summary>
+        /// Constructor.
+        /// </summary>
+        /// <param name="target">Target.</param>
+        protected PlatformDisposableTargetAdapter(IPlatformTargetInternal target) : base(target)
+        {
+            // No-op.
+        }
+
+        /** <inheritdoc /> */
+        public void Dispose()
+        {
+            lock (this)
+            {
+                if (_disposed)
+                    return;
+
+                Dispose(true);
+
+                GC.SuppressFinalize(this);
+
+                _disposed = true;
+            }
+        }
+
+        /// <summary>
+        /// Releases unmanaged and - optionally - managed resources.
+        /// </summary>
+        /// <param name="disposing">
+        /// <c>true</c> when called from Dispose;  <c>false</c> when called from finalizer.
+        /// </param>
+        protected virtual void Dispose(bool disposing)
+        {
+            Target.Dispose();
+        }
+
+        /// <summary>
+        /// Throws <see cref="ObjectDisposedException"/> if this instance has been disposed.
+        /// </summary>
+        protected void ThrowIfDisposed()
+        {
+            if (_disposed)
+                throw new ObjectDisposedException(GetType().Name, "Object has been disposed.");
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformJniTarget.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformJniTarget.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformJniTarget.cs
new file mode 100644
index 0000000..725c112
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformJniTarget.cs
@@ -0,0 +1,536 @@
+/*
+ * 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.Impl
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Diagnostics;
+    using System.Diagnostics.CodeAnalysis;
+    using System.IO;
+    using System.Threading;
+    using System.Threading.Tasks;
+    using Apache.Ignite.Core.Binary;
+    using Apache.Ignite.Core.Impl.Binary;
+    using Apache.Ignite.Core.Impl.Binary.IO;
+    using Apache.Ignite.Core.Impl.Common;
+    using Apache.Ignite.Core.Impl.Memory;
+    using Apache.Ignite.Core.Impl.Unmanaged;
+    using Apache.Ignite.Core.Interop;
+    using BinaryReader = Apache.Ignite.Core.Impl.Binary.BinaryReader;
+    using BinaryWriter = Apache.Ignite.Core.Impl.Binary.BinaryWriter;
+    using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils;
+
+    /// <summary>
+    /// Base class for interop targets.
+    /// </summary>
+    internal class PlatformJniTarget : IPlatformTargetInternal
+    {
+        /** */
+        private static readonly Dictionary<Type, FutureType> IgniteFutureTypeMap
+            = new Dictionary<Type, FutureType>
+            {
+                {typeof(bool), FutureType.Bool},
+                {typeof(byte), FutureType.Byte},
+                {typeof(char), FutureType.Char},
+                {typeof(double), FutureType.Double},
+                {typeof(float), FutureType.Float},
+                {typeof(int), FutureType.Int},
+                {typeof(long), FutureType.Long},
+                {typeof(short), FutureType.Short}
+            };
+        
+        /** Unmanaged target. */
+        private readonly IUnmanagedTarget _target;
+
+        /** Marshaller. */
+        private readonly Marshaller _marsh;
+
+        /// <summary>
+        /// Constructor.
+        /// </summary>
+        /// <param name="target">Target.</param>
+        /// <param name="marsh">Marshaller.</param>
+        public PlatformJniTarget(IUnmanagedTarget target, Marshaller marsh)
+        {
+            Debug.Assert(target != null);
+            Debug.Assert(marsh != null);
+
+            _target = target;
+            _marsh = marsh;
+        }
+
+        /// <summary>
+        /// Gets the target.
+        /// </summary>
+        public IUnmanagedTarget Target
+        {
+            get { return _target; }
+        }
+
+        /** <inheritdoc /> */
+        public Marshaller Marshaller { get { return _marsh; } }
+
+        /** <inheritdoc /> */
+        public long InStreamOutLong(int type, Action<IBinaryStream> writeAction)
+        {
+            using (var stream = IgniteManager.Memory.Allocate().GetStream())
+            {
+                writeAction(stream);
+
+                return UU.TargetInStreamOutLong(_target, type, stream.SynchronizeOutput());
+            }
+        }
+
+        /** <inheritdoc /> */
+        public IPlatformTargetInternal InStreamOutObject(int type, Action<IBinaryStream> writeAction)
+        {
+            using (var stream = IgniteManager.Memory.Allocate().GetStream())
+            {
+                writeAction(stream);
+
+                var target = UU.TargetInStreamOutObject(_target, type, stream.SynchronizeOutput());
+
+                return target == null ? null : new PlatformJniTarget(target, _marsh);
+            }
+        }
+
+        /** <inheritdoc /> */
+        public IPlatformTargetInternal OutObjectInternal(int type)
+        {
+            return GetPlatformTarget(UU.TargetOutObject(_target, type));
+        }
+
+        /** <inheritdoc /> */
+        public T OutStream<T>(int type, Func<IBinaryStream, T> readAction)
+        {
+            using (var stream = IgniteManager.Memory.Allocate().GetStream())
+            {
+                UU.TargetOutStream(_target, type, stream.MemoryPointer);
+
+                stream.SynchronizeInput();
+
+                return readAction(stream);
+            }
+        }
+
+        /** <inheritdoc /> */
+        public TR InStreamOutStream<TR>(int type, Action<IBinaryStream> writeAction, 
+            Func<IBinaryStream, TR> readAction)
+        {
+            using (var outStream = IgniteManager.Memory.Allocate().GetStream())
+            using (var inStream = IgniteManager.Memory.Allocate().GetStream())
+            {
+                writeAction(outStream);
+
+                UU.TargetInStreamOutStream(_target, type, outStream.SynchronizeOutput(), inStream.MemoryPointer);
+
+                inStream.SynchronizeInput();
+
+                return readAction(inStream);
+            }
+        }
+
+        /** <inheritdoc /> */
+        public TR InStreamOutLong<TR>(int type, Action<IBinaryStream> outAction, Func<IBinaryStream, long, TR> inAction, 
+            Func<IBinaryStream, Exception> readErrorAction)
+        {
+            Debug.Assert(readErrorAction != null);
+
+            using (var stream = IgniteManager.Memory.Allocate().GetStream())
+            {
+                outAction(stream);
+
+                var res = UU.TargetInStreamOutLong(_target, type, stream.SynchronizeOutput());
+
+                if (res != PlatformTargetAdapter.Error && inAction == null)
+                    return default(TR);  // quick path for void operations
+
+                stream.SynchronizeInput();
+
+                stream.Seek(0, SeekOrigin.Begin);
+
+                if (res != PlatformTargetAdapter.Error)
+                {
+                    return inAction != null ? inAction(stream, res) : default(TR);
+                }
+
+                throw readErrorAction(stream);
+            }
+        }
+
+        /** <inheritdoc /> */
+        public unsafe TR InObjectStreamOutObjectStream<TR>(int type, Action<IBinaryStream> writeAction, 
+            Func<IBinaryStream, IPlatformTargetInternal, TR> readAction, IPlatformTargetInternal arg)
+        {
+            PlatformMemoryStream outStream = null;
+            long outPtr = 0;
+
+            PlatformMemoryStream inStream = null;
+            long inPtr = 0;
+
+            try
+            {
+                if (writeAction != null)
+                {
+                    outStream = IgniteManager.Memory.Allocate().GetStream();
+                    writeAction(outStream);
+                    outPtr = outStream.SynchronizeOutput();
+                }
+
+                if (readAction != null)
+                {
+                    inStream = IgniteManager.Memory.Allocate().GetStream();
+                    inPtr = inStream.MemoryPointer;
+                }
+
+                var res = UU.TargetInObjectStreamOutObjectStream(_target, type, 
+                    ((PlatformJniTarget)arg).Target.Target, outPtr, inPtr);
+
+                if (readAction == null)
+                    return default(TR);
+
+                inStream.SynchronizeInput();
+
+                var target = res == null ? null : new PlatformJniTarget(res, _marsh);
+
+                return readAction(inStream, target);
+
+            }
+            finally
+            {
+                try
+                {
+                    if (inStream != null)
+                        inStream.Dispose();
+
+                }
+                finally
+                {
+                    if (outStream != null)
+                        outStream.Dispose();
+                }
+            }
+        }
+
+        /// <summary>
+        /// Finish marshaling.
+        /// </summary>
+        /// <param name="writer">Writer.</param>
+        private void FinishMarshal(BinaryWriter writer)
+        {
+            _marsh.FinishMarshal(writer);
+        }
+
+        /// <summary>
+        /// Creates a future and starts listening.
+        /// </summary>
+        /// <typeparam name="T">Future result type</typeparam>
+        /// <param name="listenAction">The listen action.</param>
+        /// <param name="keepBinary">Keep binary flag, only applicable to object futures. False by default.</param>
+        /// <param name="convertFunc">The function to read future result from stream.</param>
+        /// <returns>Created future.</returns>
+        private Future<T> GetFuture<T>(Func<long, int, IUnmanagedTarget> listenAction, bool keepBinary = false,
+            Func<BinaryReader, T> convertFunc = null)
+        {
+            var futType = FutureType.Object;
+
+            var type = typeof(T);
+
+            if (type.IsPrimitive)
+                IgniteFutureTypeMap.TryGetValue(type, out futType);
+
+            var fut = convertFunc == null && futType != FutureType.Object
+                ? new Future<T>()
+                : new Future<T>(new FutureConverter<T>(_marsh, keepBinary, convertFunc));
+
+            var futHnd = _marsh.Ignite.HandleRegistry.Allocate(fut);
+
+            IUnmanagedTarget futTarget;
+
+            try
+            {
+                futTarget = listenAction(futHnd, (int)futType);
+            }
+            catch (Exception)
+            {
+                _marsh.Ignite.HandleRegistry.Release(futHnd);
+
+                throw;
+            }
+
+            fut.SetTarget(new Listenable(new PlatformJniTarget(futTarget, _marsh)));
+
+            return fut;
+        }
+
+        /// <summary>
+        /// Creates a future and starts listening.
+        /// </summary>
+        /// <typeparam name="T">Future result type</typeparam>
+        /// <param name="listenAction">The listen action.</param>
+        /// <param name="keepBinary">Keep binary flag, only applicable to object futures. False by default.</param>
+        /// <param name="convertFunc">The function to read future result from stream.</param>
+        /// <returns>Created future.</returns>
+        private Future<T> GetFuture<T>(Action<long, int> listenAction, bool keepBinary = false,
+            Func<BinaryReader, T> convertFunc = null)
+        {
+            var futType = FutureType.Object;
+
+            var type = typeof(T);
+
+            if (type.IsPrimitive)
+                IgniteFutureTypeMap.TryGetValue(type, out futType);
+
+            var fut = convertFunc == null && futType != FutureType.Object
+                ? new Future<T>()
+                : new Future<T>(new FutureConverter<T>(_marsh, keepBinary, convertFunc));
+
+            var futHnd = _marsh.Ignite.HandleRegistry.Allocate(fut);
+
+            try
+            {
+                listenAction(futHnd, (int)futType);
+            }
+            catch (Exception)
+            {
+                _marsh.Ignite.HandleRegistry.Release(futHnd);
+
+                throw;
+            }
+
+            return fut;
+        }
+
+        #region IPlatformTarget
+
+        /** <inheritdoc /> */
+        public long InLongOutLong(int type, long val)
+        {
+            return UU.TargetInLongOutLong(_target, type, val);
+        }
+
+        /** <inheritdoc /> */
+        public long InStreamOutLong(int type, Action<IBinaryRawWriter> writeAction)
+        {
+            using (var stream = IgniteManager.Memory.Allocate().GetStream())
+            {
+                var writer = _marsh.StartMarshal(stream);
+
+                writeAction(writer);
+
+                FinishMarshal(writer);
+
+                return UU.TargetInStreamOutLong(_target, type, stream.SynchronizeOutput());
+            }
+        }
+
+        /** <inheritdoc /> */
+        public T InStreamOutStream<T>(int type, Action<IBinaryRawWriter> writeAction, 
+            Func<IBinaryRawReader, T> readAction)
+        {
+            using (var outStream = IgniteManager.Memory.Allocate().GetStream())
+            using (var inStream = IgniteManager.Memory.Allocate().GetStream())
+            {
+                var writer = _marsh.StartMarshal(outStream);
+
+                writeAction(writer);
+
+                FinishMarshal(writer);
+
+                UU.TargetInStreamOutStream(_target, type, outStream.SynchronizeOutput(), inStream.MemoryPointer);
+
+                inStream.SynchronizeInput();
+
+                return readAction(_marsh.StartUnmarshal(inStream));
+            }
+        }
+
+        /** <inheritdoc /> */
+        public IPlatformTarget InStreamOutObject(int type, Action<IBinaryRawWriter> writeAction)
+        {
+            using (var stream = IgniteManager.Memory.Allocate().GetStream())
+            {
+                var writer = _marsh.StartMarshal(stream);
+
+                writeAction(writer);
+
+                FinishMarshal(writer);
+
+                return GetPlatformTarget(UU.TargetInStreamOutObject(_target, type, stream.SynchronizeOutput()));
+            }
+        }
+
+        /** <inheritdoc /> */
+        public unsafe T InObjectStreamOutObjectStream<T>(int type, IPlatformTarget arg, 
+            Action<IBinaryRawWriter> writeAction, Func<IBinaryRawReader, IPlatformTarget, T> readAction)
+        {
+            PlatformMemoryStream outStream = null;
+            long outPtr = 0;
+
+            PlatformMemoryStream inStream = null;
+            long inPtr = 0;
+
+            try
+            {
+                if (writeAction != null)
+                {
+                    outStream = IgniteManager.Memory.Allocate().GetStream();
+                    var writer = _marsh.StartMarshal(outStream);
+                    writeAction(writer);
+                    FinishMarshal(writer);
+                    outPtr = outStream.SynchronizeOutput();
+                }
+
+                if (readAction != null)
+                {
+                    inStream = IgniteManager.Memory.Allocate().GetStream();
+                    inPtr = inStream.MemoryPointer;
+                }
+
+                var res = UU.TargetInObjectStreamOutObjectStream(_target, type, GetTargetPtr(arg), outPtr, inPtr);
+
+                if (readAction == null)
+                    return default(T);
+
+                inStream.SynchronizeInput();
+
+                return readAction(_marsh.StartUnmarshal(inStream), GetPlatformTarget(res));
+
+            }
+            finally
+            {
+                try
+                {
+                    if (inStream != null)
+                        inStream.Dispose();
+
+                }
+                finally
+                {
+                    if (outStream != null)
+                        outStream.Dispose();
+                }
+            }
+        }
+
+        /** <inheritdoc /> */
+        public T OutStream<T>(int type, Func<IBinaryRawReader, T> readAction)
+        {
+            using (var stream = IgniteManager.Memory.Allocate().GetStream())
+            {
+                UU.TargetOutStream(_target, type, stream.MemoryPointer);
+
+                stream.SynchronizeInput();
+
+                return readAction(_marsh.StartUnmarshal(stream));
+            }
+        }
+
+        /** <inheritdoc /> */
+        public IPlatformTarget OutObject(int type)
+        {
+            return OutObjectInternal(type);
+        }
+
+        /** <inheritdoc /> */
+        public Task<T> DoOutOpAsync<T>(int type, Action<IBinaryRawWriter> writeAction = null, 
+            Func<IBinaryRawReader, T> readAction = null)
+        {
+            var convertFunc = readAction != null
+                ? r => readAction(r)
+                : (Func<BinaryReader, T>)null;
+            return GetFuture((futId, futType) =>
+            {
+                using (var stream = IgniteManager.Memory.Allocate().GetStream())
+                {
+                    stream.WriteLong(futId);
+                    stream.WriteInt(futType);
+
+                    if (writeAction != null)
+                    {
+                        var writer = _marsh.StartMarshal(stream);
+
+                        writeAction(writer);
+
+                        FinishMarshal(writer);
+                    }
+
+                    UU.TargetInStreamAsync(_target, type, stream.SynchronizeOutput());
+                }
+            }, false, convertFunc).Task;
+        }
+
+        /** <inheritdoc /> */
+        public Task<T> DoOutOpAsync<T>(int type, Action<IBinaryRawWriter> writeAction, 
+            Func<IBinaryRawReader, T> readAction, CancellationToken cancellationToken)
+        {
+            var convertFunc = readAction != null
+                ? r => readAction(r)
+                : (Func<BinaryReader, T>) null;
+
+            return GetFuture((futId, futType) =>
+            {
+                using (var stream = IgniteManager.Memory.Allocate().GetStream())
+                {
+                    stream.WriteLong(futId);
+                    stream.WriteInt(futType);
+
+                    if (writeAction != null)
+                    {
+                        var writer = _marsh.StartMarshal(stream);
+
+                        writeAction(writer);
+
+                        FinishMarshal(writer);
+                    }
+
+                    return UU.TargetInStreamOutObjectAsync(_target, type, stream.SynchronizeOutput());
+                }
+            }, false, convertFunc).GetTask(cancellationToken);
+        }
+
+        /// <summary>
+        /// Gets the platform target.
+        /// </summary>
+        private IPlatformTargetInternal GetPlatformTarget(IUnmanagedTarget target)
+        {
+            return target == null ? null : new PlatformJniTarget(target, _marsh);
+        }
+
+        /// <summary>
+        /// Gets the target pointer.
+        /// </summary>
+        private static unsafe void* GetTargetPtr(IPlatformTarget target)
+        {
+            return target == null ? null : ((PlatformJniTarget) target)._target.Target;
+        }
+
+        #endregion
+
+        /** <inheritdoc /> */
+        [SuppressMessage("Microsoft.Usage", "CA1816:CallGCSuppressFinalizeCorrectly",
+            Justification = "There is no finalizer.")]
+        public void Dispose()
+        {
+            if (_target != null)
+            {
+                _target.Dispose();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTarget.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTarget.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTarget.cs
deleted file mode 100644
index 474af0e..0000000
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTarget.cs
+++ /dev/null
@@ -1,1086 +0,0 @@
-/*
- * 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.Impl
-{
-    using System;
-    using System.Collections.Generic;
-    using System.Diagnostics;
-    using System.Diagnostics.CodeAnalysis;
-    using System.IO;
-    using System.Threading.Tasks;
-    using Apache.Ignite.Core.Binary;
-    using Apache.Ignite.Core.Impl.Binary;
-    using Apache.Ignite.Core.Impl.Binary.IO;
-    using Apache.Ignite.Core.Impl.Common;
-    using Apache.Ignite.Core.Impl.Memory;
-    using Apache.Ignite.Core.Impl.Unmanaged;
-    using Apache.Ignite.Core.Interop;
-    using BinaryReader = Apache.Ignite.Core.Impl.Binary.BinaryReader;
-    using BinaryWriter = Apache.Ignite.Core.Impl.Binary.BinaryWriter;
-    using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils;
-
-    /// <summary>
-    /// Base class for interop targets.
-    /// </summary>
-    [SuppressMessage("ReSharper", "LocalVariableHidesMember")]
-    internal class PlatformTarget : IPlatformTarget
-    {
-        /** */
-        protected const int False = 0;
-
-        /** */
-        protected const int True = 1;
-
-        /** */
-        protected const int Error = -1;
-
-        /** */
-        public const int OpNone = -2;
-
-        /** */
-        private static readonly Dictionary<Type, FutureType> IgniteFutureTypeMap
-            = new Dictionary<Type, FutureType>
-            {
-                {typeof(bool), FutureType.Bool},
-                {typeof(byte), FutureType.Byte},
-                {typeof(char), FutureType.Char},
-                {typeof(double), FutureType.Double},
-                {typeof(float), FutureType.Float},
-                {typeof(int), FutureType.Int},
-                {typeof(long), FutureType.Long},
-                {typeof(short), FutureType.Short}
-            };
-        
-        /** Unmanaged target. */
-        private readonly IUnmanagedTarget _target;
-
-        /** Marshaller. */
-        private readonly Marshaller _marsh;
-
-        /// <summary>
-        /// Constructor.
-        /// </summary>
-        /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
-        public PlatformTarget(IUnmanagedTarget target, Marshaller marsh)
-        {
-            Debug.Assert(target != null);
-            Debug.Assert(marsh != null);
-
-            _target = target;
-            _marsh = marsh;
-        }
-
-        /// <summary>
-        /// Unmanaged target.
-        /// </summary>
-        internal IUnmanagedTarget Target
-        {
-            get { return _target; }
-        }
-
-        /// <summary>
-        /// Marshaller.
-        /// </summary>
-        internal Marshaller Marshaller
-        {
-            get { return _marsh; }
-        }
-
-        #region Static Helpers
-
-        /// <summary>
-        /// Write collection.
-        /// </summary>
-        /// <param name="writer">Writer.</param>
-        /// <param name="vals">Values.</param>
-        /// <returns>The same writer for chaining.</returns>
-        protected static BinaryWriter WriteCollection<T>(BinaryWriter writer, ICollection<T> vals)
-        {
-            return WriteCollection<T, T>(writer, vals, null);
-        }
-
-        /// <summary>
-        /// Write nullable collection.
-        /// </summary>
-        /// <param name="writer">Writer.</param>
-        /// <param name="vals">Values.</param>
-        /// <returns>The same writer for chaining.</returns>
-        protected static BinaryWriter WriteNullableCollection<T>(BinaryWriter writer, ICollection<T> vals)
-        {
-            return WriteNullable(writer, vals, WriteCollection);
-        }
-
-        /// <summary>
-        /// Write collection.
-        /// </summary>
-        /// <param name="writer">Writer.</param>
-        /// <param name="vals">Values.</param>
-        /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>The same writer for chaining.</returns>
-        protected static BinaryWriter WriteCollection<T1, T2>(BinaryWriter writer,
-            ICollection<T1> vals, Func<T1, T2> selector)
-        {
-            writer.WriteInt(vals.Count);
-
-            if (selector == null)
-            {
-                foreach (var val in vals)
-                    writer.Write(val);
-            }
-            else
-            {
-                foreach (var val in vals)
-                    writer.Write(selector(val));
-            }
-
-            return writer;
-        }
-
-        /// <summary>
-        /// Write enumerable.
-        /// </summary>
-        /// <param name="writer">Writer.</param>
-        /// <param name="vals">Values.</param>
-        /// <returns>The same writer for chaining.</returns>
-        protected static BinaryWriter WriteEnumerable<T>(BinaryWriter writer, IEnumerable<T> vals)
-        {
-            return WriteEnumerable<T, T>(writer, vals, null);
-        }
-
-        /// <summary>
-        /// Write enumerable.
-        /// </summary>
-        /// <param name="writer">Writer.</param>
-        /// <param name="vals">Values.</param>
-        /// <param name="selector">A transform function to apply to each element.</param>
-        /// <returns>The same writer for chaining.</returns>
-        protected static BinaryWriter WriteEnumerable<T1, T2>(BinaryWriter writer,
-            IEnumerable<T1> vals, Func<T1, T2> selector)
-        {
-            var col = vals as ICollection<T1>;
-
-            if (col != null)
-                return WriteCollection(writer, col, selector);
-            
-            var stream = writer.Stream;
-
-            var pos = stream.Position;
-
-            stream.Seek(4, SeekOrigin.Current);
-
-            var size = 0;
-
-            if (selector == null)
-            {
-                foreach (var val in vals)
-                {
-                    writer.Write(val);
-
-                    size++;
-                }
-            }
-            else
-            {
-                foreach (var val in vals)
-                {
-                    writer.Write(selector(val));
-
-                    size++;
-                }
-            }
-
-            stream.WriteInt(pos, size);
-                
-            return writer;
-        }
-
-        /// <summary>
-        /// Write dictionary.
-        /// </summary>
-        /// <param name="writer">Writer.</param>
-        /// <param name="vals">Values.</param>
-        protected static void WriteDictionary<T1, T2>(BinaryWriter writer, IEnumerable<KeyValuePair<T1, T2>> vals)
-        {
-            var pos = writer.Stream.Position;
-            writer.WriteInt(0);  // Reserve count.
-
-            int cnt = 0;
-
-            foreach (var pair in vals)
-            {
-                writer.Write(pair.Key);
-                writer.Write(pair.Value);
-
-                cnt++;
-            }
-
-            writer.Stream.WriteInt(pos, cnt);
-        }
-
-        /// <summary>
-        /// Write a nullable item.
-        /// </summary>
-        /// <param name="writer">Writer.</param>
-        /// <param name="item">Item.</param>
-        /// <param name="writeItem">Write action to perform on item when it is not null.</param>
-        /// <returns>The same writer for chaining.</returns>
-        private static BinaryWriter WriteNullable<T>(BinaryWriter writer, T item,
-            Func<BinaryWriter, T, BinaryWriter> writeItem) where T : class
-        {
-            if (item == null)
-            {
-                writer.WriteBoolean(false);
-
-                return writer;
-            }
-
-            writer.WriteBoolean(true);
-
-            return writeItem(writer, item);
-        }
-
-        #endregion
-
-        #region OUT operations
-
-        /// <summary>
-        /// Perform out operation.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="action">Action to be performed on the stream.</param>
-        /// <returns></returns>
-        protected long DoOutOp(int type, Action<IBinaryStream> action)
-        {
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                action(stream);
-
-                return UU.TargetInStreamOutLong(_target, type, stream.SynchronizeOutput());
-            }
-        }
-
-        /// <summary>
-        /// Perform out operation.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="action">Action to be performed on the stream.</param>
-        /// <returns></returns>
-        protected long DoOutOp(int type, Action<BinaryWriter> action)
-        {
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                var writer = _marsh.StartMarshal(stream);
-
-                action(writer);
-
-                FinishMarshal(writer);
-
-                return UU.TargetInStreamOutLong(_target, type, stream.SynchronizeOutput());
-            }
-        }
-
-        /// <summary>
-        /// Perform out operation.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="action">Action to be performed on the stream.</param>
-        /// <returns>Resulting object.</returns>
-        protected IUnmanagedTarget DoOutOpObject(int type, Action<BinaryWriter> action)
-        {
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                var writer = _marsh.StartMarshal(stream);
-
-                action(writer);
-
-                FinishMarshal(writer);
-
-                return UU.TargetInStreamOutObject(_target, type, stream.SynchronizeOutput());
-            }
-        }
-
-        /// <summary>
-        /// Perform out operation.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="action">Action to be performed on the stream.</param>
-        /// <returns>Resulting object.</returns>
-        protected IUnmanagedTarget DoOutOpObject(int type, Action<IBinaryStream> action)
-        {
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                action(stream);
-
-                return UU.TargetInStreamOutObject(_target, type, stream.SynchronizeOutput());
-            }
-        }
-
-        /// <summary>
-        /// Perform out operation.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <returns>Resulting object.</returns>
-        protected IUnmanagedTarget DoOutOpObject(int type)
-        {
-            return UU.TargetOutObject(_target, type);
-        }
-
-        /// <summary>
-        /// Perform simple output operation accepting single argument.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="val1">Value.</param>
-        /// <returns>Result.</returns>
-        protected long DoOutOp<T1>(int type, T1 val1)
-        {
-            return DoOutOp(type, writer =>
-            {
-                writer.Write(val1);
-            });
-        }
-
-        /// <summary>
-        /// Perform simple output operation accepting two arguments.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="val1">Value 1.</param>
-        /// <param name="val2">Value 2.</param>
-        /// <returns>Result.</returns>
-        protected long DoOutOp<T1, T2>(int type, T1 val1, T2 val2)
-        {
-            return DoOutOp(type, writer =>
-            {
-                writer.Write(val1);
-                writer.Write(val2);
-            });
-        }
-
-        /// <summary>
-        /// Perform simple output operation accepting three arguments.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="val1">Value 1.</param>
-        /// <param name="val2">Value 2.</param>
-        /// <param name="val3">Value 3.</param>
-        /// <returns>Result.</returns>
-        protected long DoOutOp<T1, T2, T3>(int type, T1 val1, T2 val2, T3 val3)
-        {
-            return DoOutOp(type, writer =>
-            {
-                writer.Write(val1);
-                writer.Write(val2);
-                writer.Write(val3);
-            });
-        }
-
-        #endregion
-
-        #region IN operations
-
-        /// <summary>
-        /// Perform in operation.
-        /// </summary>
-        /// <param name="type">Type.</param>
-        /// <param name="action">Action.</param>
-        protected void DoInOp(int type, Action<IBinaryStream> action)
-        {
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                UU.TargetOutStream(_target, type, stream.MemoryPointer);
-                
-                stream.SynchronizeInput();
-
-                action(stream);
-            }
-        }
-
-        /// <summary>
-        /// Perform in operation.
-        /// </summary>
-        /// <param name="type">Type.</param>
-        /// <param name="action">Action.</param>
-        /// <returns>Result.</returns>
-        protected T DoInOp<T>(int type, Func<IBinaryStream, T> action)
-        {
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                UU.TargetOutStream(_target, type, stream.MemoryPointer);
-
-                stream.SynchronizeInput();
-
-                return action(stream);
-            }
-        }
-
-        /// <summary>
-        /// Perform simple in operation returning immediate result.
-        /// </summary>
-        /// <param name="type">Type.</param>
-        /// <returns>Result.</returns>
-        protected T DoInOp<T>(int type)
-        {
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                UU.TargetOutStream(_target, type, stream.MemoryPointer);
-
-                stream.SynchronizeInput();
-
-                return Unmarshal<T>(stream);
-            }
-        }
-
-        #endregion
-
-        #region OUT-IN operations
-        
-        /// <summary>
-        /// Perform out-in operation.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="outAction">Out action.</param>
-        /// <param name="inAction">In action.</param>
-        protected void DoOutInOp(int type, Action<BinaryWriter> outAction, Action<IBinaryStream> inAction)
-        {
-            using (PlatformMemoryStream outStream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                using (PlatformMemoryStream inStream = IgniteManager.Memory.Allocate().GetStream())
-                {
-                    BinaryWriter writer = _marsh.StartMarshal(outStream);
-
-                    outAction(writer);
-
-                    FinishMarshal(writer);
-
-                    UU.TargetInStreamOutStream(_target, type, outStream.SynchronizeOutput(), inStream.MemoryPointer);
-
-                    inStream.SynchronizeInput();
-
-                    inAction(inStream);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Perform out-in operation.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="outAction">Out action.</param>
-        /// <param name="inAction">In action.</param>
-        /// <returns>Result.</returns>
-        protected TR DoOutInOp<TR>(int type, Action<BinaryWriter> outAction, Func<IBinaryStream, TR> inAction)
-        {
-            using (PlatformMemoryStream outStream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                using (PlatformMemoryStream inStream = IgniteManager.Memory.Allocate().GetStream())
-                {
-                    BinaryWriter writer = _marsh.StartMarshal(outStream);
-
-                    outAction(writer);
-
-                    FinishMarshal(writer);
-
-                    UU.TargetInStreamOutStream(_target, type, outStream.SynchronizeOutput(), inStream.MemoryPointer);
-
-                    inStream.SynchronizeInput();
-
-                    return inAction(inStream);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Perform out-in operation with a single stream.
-        /// </summary>
-        /// <typeparam name="TR">The type of the r.</typeparam>
-        /// <param name="type">Operation type.</param>
-        /// <param name="outAction">Out action.</param>
-        /// <param name="inAction">In action.</param>
-        /// <param name="inErrorAction">The action to read an error.</param>
-        /// <returns>
-        /// Result.
-        /// </returns>
-        protected TR DoOutInOpX<TR>(int type, Action<BinaryWriter> outAction, Func<IBinaryStream, long, TR> inAction,
-            Func<IBinaryStream, Exception> inErrorAction)
-        {
-            Debug.Assert(inErrorAction != null);
-
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                var writer = _marsh.StartMarshal(stream);
-
-                outAction(writer);
-
-                FinishMarshal(writer);
-
-                var res = UU.TargetInStreamOutLong(_target, type, stream.SynchronizeOutput());
-
-                if (res != Error && inAction == null)
-                    return default(TR);  // quick path for void operations
-
-                stream.SynchronizeInput();
-
-                stream.Seek(0, SeekOrigin.Begin);
-
-                if (res != Error)
-                    return inAction != null ? inAction(stream, res) : default(TR);
-
-                throw inErrorAction(stream);
-            }
-        }
-
-        /// <summary>
-        /// Perform out-in operation with a single stream.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="outAction">Out action.</param>
-        /// <param name="inErrorAction">The action to read an error.</param>
-        /// <returns>
-        /// Result.
-        /// </returns>
-        protected bool DoOutInOpX(int type, Action<BinaryWriter> outAction,
-            Func<IBinaryStream, Exception> inErrorAction)
-        {
-            Debug.Assert(inErrorAction != null);
-
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                var writer = _marsh.StartMarshal(stream);
-
-                outAction(writer);
-
-                FinishMarshal(writer);
-
-                var res = UU.TargetInStreamOutLong(_target, type, stream.SynchronizeOutput());
-
-                if (res != Error)
-                    return res == True;
-
-                stream.SynchronizeInput();
-
-                stream.Seek(0, SeekOrigin.Begin);
-
-                throw inErrorAction(stream);
-            }
-        }
-
-        /// <summary>
-        /// Perform out-in operation.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="outAction">Out action.</param>
-        /// <param name="inAction">In action.</param>
-        /// <param name="arg">Argument.</param>
-        /// <returns>Result.</returns>
-        protected unsafe TR DoOutInOp<TR>(int type, Action<BinaryWriter> outAction,
-            Func<IBinaryStream, IUnmanagedTarget, TR> inAction, void* arg)
-        {
-            PlatformMemoryStream outStream = null;
-            long outPtr = 0;
-
-            PlatformMemoryStream inStream = null;
-            long inPtr = 0;
-
-            try
-            {
-                if (outAction != null)
-                {
-                    outStream = IgniteManager.Memory.Allocate().GetStream();
-                    var writer = _marsh.StartMarshal(outStream);
-                    outAction(writer);
-                    FinishMarshal(writer);
-                    outPtr = outStream.SynchronizeOutput();
-                }
-
-                if (inAction != null)
-                {
-                    inStream = IgniteManager.Memory.Allocate().GetStream();
-                    inPtr = inStream.MemoryPointer;
-                }
-
-                var res = UU.TargetInObjectStreamOutObjectStream(_target, type, arg, outPtr, inPtr);
-
-                if (inAction == null)
-                    return default(TR);
-
-                inStream.SynchronizeInput();
-
-                return inAction(inStream, res);
-
-            }
-            finally
-            {
-                try
-                {
-                    if (inStream != null)
-                        inStream.Dispose();
-
-                }
-                finally
-                {
-                    if (outStream != null)
-                        outStream.Dispose();
-                }
-            }
-        }
-
-        /// <summary>
-        /// Perform out-in operation.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="outAction">Out action.</param>
-        /// <returns>Result.</returns>
-        protected TR DoOutInOp<TR>(int type, Action<BinaryWriter> outAction)
-        {
-            using (PlatformMemoryStream outStream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                using (PlatformMemoryStream inStream = IgniteManager.Memory.Allocate().GetStream())
-                {
-                    BinaryWriter writer = _marsh.StartMarshal(outStream);
-
-                    outAction(writer);
-
-                    FinishMarshal(writer);
-
-                    UU.TargetInStreamOutStream(_target, type, outStream.SynchronizeOutput(), inStream.MemoryPointer);
-
-                    inStream.SynchronizeInput();
-
-                    return Unmarshal<TR>(inStream);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Perform simple out-in operation accepting single argument.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="val">Value.</param>
-        /// <returns>Result.</returns>
-        protected TR DoOutInOp<T1, TR>(int type, T1 val)
-        {
-            using (PlatformMemoryStream outStream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                using (PlatformMemoryStream inStream = IgniteManager.Memory.Allocate().GetStream())
-                {
-                    BinaryWriter writer = _marsh.StartMarshal(outStream);
-
-                    writer.WriteObject(val);
-
-                    FinishMarshal(writer);
-
-                    UU.TargetInStreamOutStream(_target, type, outStream.SynchronizeOutput(), inStream.MemoryPointer);
-
-                    inStream.SynchronizeInput();
-
-                    return Unmarshal<TR>(inStream);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Perform simple out-in operation accepting two arguments.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="val1">Value.</param>
-        /// <param name="val2">Value.</param>
-        /// <returns>Result.</returns>
-        protected TR DoOutInOp<T1, T2, TR>(int type, T1 val1, T2 val2)
-        {
-            using (PlatformMemoryStream outStream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                using (PlatformMemoryStream inStream = IgniteManager.Memory.Allocate().GetStream())
-                {
-                    BinaryWriter writer = _marsh.StartMarshal(outStream);
-
-                    writer.WriteObject(val1);
-                    writer.WriteObject(val2);
-
-                    FinishMarshal(writer);
-
-                    UU.TargetInStreamOutStream(_target, type, outStream.SynchronizeOutput(), inStream.MemoryPointer);
-
-                    inStream.SynchronizeInput();
-
-                    return Unmarshal<TR>(inStream);
-                }
-            }
-        }
-
-        /// <summary>
-        /// Perform simple out-in operation accepting two arguments.
-        /// </summary>
-        /// <param name="type">Operation type.</param>
-        /// <param name="val">Value.</param>
-        /// <returns>Result.</returns>
-        protected long DoOutInOp(int type, long val = 0)
-        {
-            return UU.TargetInLongOutLong(_target, type, val);
-        }
-
-        #endregion
-
-        #region Async operations
-
-        /// <summary>
-        /// Performs async operation.
-        /// </summary>
-        /// <param name="type">The type code.</param>
-        /// <param name="writeAction">The write action.</param>
-        /// <returns>Task for async operation</returns>
-        protected Task DoOutOpAsync(int type, Action<BinaryWriter> writeAction = null)
-        {
-            return DoOutOpAsync<object>(type, writeAction);
-        }
-
-        /// <summary>
-        /// Performs async operation.
-        /// </summary>
-        /// <typeparam name="T">Type of the result.</typeparam>
-        /// <param name="type">The type code.</param>
-        /// <param name="writeAction">The write action.</param>
-        /// <param name="keepBinary">Keep binary flag, only applicable to object futures. False by default.</param>
-        /// <param name="convertFunc">The function to read future result from stream.</param>
-        /// <returns>Task for async operation</returns>
-        protected Task<T> DoOutOpAsync<T>(int type, Action<BinaryWriter> writeAction = null, bool keepBinary = false,
-            Func<BinaryReader, T> convertFunc = null)
-        {
-            return GetFuture((futId, futType) => DoOutOp(type, w =>
-            {
-                if (writeAction != null)
-                    writeAction(w);
-                w.WriteLong(futId);
-                w.WriteInt(futType);
-            }), keepBinary, convertFunc).Task;
-        }
-
-        /// <summary>
-        /// Performs async operation.
-        /// </summary>
-        /// <typeparam name="T">Type of the result.</typeparam>
-        /// <param name="type">The type code.</param>
-        /// <param name="writeAction">The write action.</param>
-        /// <returns>Future for async operation</returns>
-        protected Future<T> DoOutOpObjectAsync<T>(int type, Action<IBinaryRawWriter> writeAction)
-        {
-            return GetFuture<T>((futId, futType) => DoOutOpObject(type, w =>
-            {
-                writeAction(w);
-                w.WriteLong(futId);
-                w.WriteInt(futType);
-            }));
-        }
-
-        /// <summary>
-        /// Performs async operation.
-        /// </summary>
-        /// <typeparam name="TR">Type of the result.</typeparam>
-        /// <typeparam name="T1">The type of the first arg.</typeparam>
-        /// <param name="type">The type code.</param>
-        /// <param name="val1">First arg.</param>
-        /// <returns>
-        /// Task for async operation
-        /// </returns>
-        protected Task<TR> DoOutOpAsync<T1, TR>(int type, T1 val1)
-        {
-            return GetFuture<TR>((futId, futType) => DoOutOp(type, w =>
-            {
-                w.WriteObject(val1);
-                w.WriteLong(futId);
-                w.WriteInt(futType);
-            })).Task;
-        }
-
-        /// <summary>
-        /// Performs async operation.
-        /// </summary>
-        /// <typeparam name="TR">Type of the result.</typeparam>
-        /// <typeparam name="T1">The type of the first arg.</typeparam>
-        /// <typeparam name="T2">The type of the second arg.</typeparam>
-        /// <param name="type">The type code.</param>
-        /// <param name="val1">First arg.</param>
-        /// <param name="val2">Second arg.</param>
-        /// <returns>
-        /// Task for async operation
-        /// </returns>
-        protected Task<TR> DoOutOpAsync<T1, T2, TR>(int type, T1 val1, T2 val2)
-        {
-            return GetFuture<TR>((futId, futType) => DoOutOp(type, w =>
-            {
-                w.WriteObject(val1);
-                w.WriteObject(val2);
-                w.WriteLong(futId);
-                w.WriteInt(futType);
-            })).Task;
-        }
-
-        #endregion
-
-        #region Miscelanneous
-
-        /// <summary>
-        /// Finish marshaling.
-        /// </summary>
-        /// <param name="writer">Writer.</param>
-        internal void FinishMarshal(BinaryWriter writer)
-        {
-            _marsh.FinishMarshal(writer);
-        }
-
-        /// <summary>
-        /// Unmarshal object using the given stream.
-        /// </summary>
-        /// <param name="stream">Stream.</param>
-        /// <returns>Unmarshalled object.</returns>
-        protected virtual T Unmarshal<T>(IBinaryStream stream)
-        {
-            return _marsh.Unmarshal<T>(stream);
-        }
-
-        /// <summary>
-        /// Creates a future and starts listening.
-        /// </summary>
-        /// <typeparam name="T">Future result type</typeparam>
-        /// <param name="listenAction">The listen action.</param>
-        /// <param name="keepBinary">Keep binary flag, only applicable to object futures. False by default.</param>
-        /// <param name="convertFunc">The function to read future result from stream.</param>
-        /// <returns>Created future.</returns>
-        private Future<T> GetFuture<T>(Func<long, int, IUnmanagedTarget> listenAction, bool keepBinary = false,
-            Func<BinaryReader, T> convertFunc = null)
-        {
-            var futType = FutureType.Object;
-
-            var type = typeof(T);
-
-            if (type.IsPrimitive)
-                IgniteFutureTypeMap.TryGetValue(type, out futType);
-
-            var fut = convertFunc == null && futType != FutureType.Object
-                ? new Future<T>()
-                : new Future<T>(new FutureConverter<T>(_marsh, keepBinary, convertFunc));
-
-            var futHnd = _marsh.Ignite.HandleRegistry.Allocate(fut);
-
-            IUnmanagedTarget futTarget;
-
-            try
-            {
-                futTarget = listenAction(futHnd, (int)futType);
-            }
-            catch (Exception)
-            {
-                _marsh.Ignite.HandleRegistry.Release(futHnd);
-
-                throw;
-            }
-
-            fut.SetTarget(new Listenable(futTarget, _marsh));
-
-            return fut;
-        }
-
-        /// <summary>
-        /// Creates a future and starts listening.
-        /// </summary>
-        /// <typeparam name="T">Future result type</typeparam>
-        /// <param name="listenAction">The listen action.</param>
-        /// <param name="keepBinary">Keep binary flag, only applicable to object futures. False by default.</param>
-        /// <param name="convertFunc">The function to read future result from stream.</param>
-        /// <returns>Created future.</returns>
-        protected Future<T> GetFuture<T>(Action<long, int> listenAction, bool keepBinary = false,
-            Func<BinaryReader, T> convertFunc = null)
-        {
-            var futType = FutureType.Object;
-
-            var type = typeof(T);
-
-            if (type.IsPrimitive)
-                IgniteFutureTypeMap.TryGetValue(type, out futType);
-
-            var fut = convertFunc == null && futType != FutureType.Object
-                ? new Future<T>()
-                : new Future<T>(new FutureConverter<T>(_marsh, keepBinary, convertFunc));
-
-            var futHnd = _marsh.Ignite.HandleRegistry.Allocate(fut);
-
-            try
-            {
-                listenAction(futHnd, (int)futType);
-            }
-            catch (Exception)
-            {
-                _marsh.Ignite.HandleRegistry.Release(futHnd);
-
-                throw;
-            }
-
-            return fut;
-        }
-
-        #endregion
-
-        #region IPlatformTarget
-
-        /** <inheritdoc /> */
-        public long InLongOutLong(int type, long val)
-        {
-            return DoOutInOp(type, val);
-        }
-
-        /** <inheritdoc /> */
-        public long InStreamOutLong(int type, Action<IBinaryRawWriter> writeAction)
-        {
-            return DoOutOp(type, writer => writeAction(writer));
-        }
-
-        /** <inheritdoc /> */
-        public T InStreamOutStream<T>(int type, Action<IBinaryRawWriter> writeAction, 
-            Func<IBinaryRawReader, T> readAction)
-        {
-            return DoOutInOp(type, writeAction, stream => readAction(Marshaller.StartUnmarshal(stream)));
-        }
-
-        /** <inheritdoc /> */
-        public IPlatformTarget InStreamOutObject(int type, Action<IBinaryRawWriter> writeAction)
-        {
-            return GetPlatformTarget(DoOutOpObject(type, writeAction));
-        }
-
-        /** <inheritdoc /> */
-        public unsafe T InObjectStreamOutObjectStream<T>(int type, IPlatformTarget arg, Action<IBinaryRawWriter> writeAction,
-            Func<IBinaryRawReader, IPlatformTarget, T> readAction)
-        {
-            return DoOutInOp(type, writeAction, (stream, obj) => readAction(Marshaller.StartUnmarshal(stream),
-                GetPlatformTarget(obj)), GetTargetPtr(arg));
-        }
-
-        /** <inheritdoc /> */
-        public T OutStream<T>(int type, Func<IBinaryRawReader, T> readAction)
-        {
-            return DoInOp(type, stream => readAction(Marshaller.StartUnmarshal(stream)));
-        }
-
-        /** <inheritdoc /> */
-        public IPlatformTarget OutObject(int type)
-        {
-            return GetPlatformTarget(DoOutOpObject(type));
-        }
-
-        /** <inheritdoc /> */
-        public Task<T> DoOutOpAsync<T>(int type, Action<IBinaryRawWriter> writeAction = null, 
-            Func<IBinaryRawReader, T> readAction = null)
-        {
-            var convertFunc = readAction != null 
-                ? r => readAction(r) 
-                : (Func<BinaryReader, T>) null;
-
-            return GetFuture((futId, futType) =>
-            {
-                using (var stream = IgniteManager.Memory.Allocate().GetStream())
-                {
-                    stream.WriteLong(futId);
-                    stream.WriteInt(futType);
-
-                    if (writeAction != null)
-                    {
-                        var writer = _marsh.StartMarshal(stream);
-
-                        writeAction(writer);
-
-                        FinishMarshal(writer);
-                    }
-
-                    UU.TargetInStreamAsync(_target, type, stream.SynchronizeOutput());
-                }
-            }, false, convertFunc).Task;
-        }
-
-        /// <summary>
-        /// Gets the platform target.
-        /// </summary>
-        private IPlatformTarget GetPlatformTarget(IUnmanagedTarget target)
-        {
-            return target == null ? null : new PlatformTarget(target, Marshaller);
-        }
-
-        /// <summary>
-        /// Gets the target pointer.
-        /// </summary>
-        private static unsafe void* GetTargetPtr(IPlatformTarget target)
-        {
-            return target == null ? null : ((PlatformTarget) target).Target.Target;
-        }
-
-        #endregion
-    }
-
-    /// <summary>
-    /// PlatformTarget with IDisposable pattern.
-    /// </summary>
-    internal abstract class PlatformDisposableTarget : PlatformTarget, IDisposable
-    {
-        /** Disposed flag. */
-        private volatile bool _disposed;
-
-        /// <summary>
-        /// Constructor.
-        /// </summary>
-        /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
-        protected PlatformDisposableTarget(IUnmanagedTarget target, Marshaller marsh) : base(target, marsh)
-        {
-            // No-op.
-        }
-
-        /** <inheritdoc /> */
-        public void Dispose()
-        {
-            lock (this)
-            {
-                if (_disposed)
-                    return;
-
-                Dispose(true);
-
-                GC.SuppressFinalize(this);
-
-                _disposed = true;
-            }
-        }
-
-        /// <summary>
-        /// Releases unmanaged and - optionally - managed resources.
-        /// </summary>
-        /// <param name="disposing">
-        /// <c>true</c> when called from Dispose;  <c>false</c> when called from finalizer.
-        /// </param>
-        protected virtual void Dispose(bool disposing)
-        {
-            Target.Dispose();
-        }
-
-        /// <summary>
-        /// Throws <see cref="ObjectDisposedException"/> if this instance has been disposed.
-        /// </summary>
-        protected void ThrowIfDisposed()
-        {
-            if (_disposed)
-                throw new ObjectDisposedException(GetType().Name, "Object has been disposed.");
-        }
-    }
-}


[24/50] [abbrv] ignite git commit: IGNITE-5812 Set width for dropdown as for element.

Posted by yz...@apache.org.
IGNITE-5812 Set width for dropdown as for element.


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

Branch: refs/heads/ignite-5658
Commit: 39fa8fae3ec80fd3a4c07f4610ab46817b75dd23
Parents: 0d2992c
Author: Dmitriy Shabalin <ds...@gridgain.com>
Authored: Tue Jul 25 14:30:47 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Tue Jul 25 14:30:47 2017 +0700

----------------------------------------------------------------------
 modules/web-console/frontend/app/app.js         |   8 +-
 .../frontend/app/decorator/select.js            |  77 --------------
 .../frontend/app/decorator/tooltip.js           |  73 -------------
 .../services/AngularStrapSelect.decorator.js    |  77 ++++++++++++++
 .../services/AngularStrapTooltip.decorator.js   | 103 +++++++++++++++++++
 .../views/configuration/domains-import.tpl.pug  |   4 +-
 6 files changed, 186 insertions(+), 156 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/39fa8fae/modules/web-console/frontend/app/app.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/app.js b/modules/web-console/frontend/app/app.js
index dc5c6e9..0667e8f 100644
--- a/modules/web-console/frontend/app/app.js
+++ b/modules/web-console/frontend/app/app.js
@@ -20,9 +20,6 @@ import '../app/primitives';
 
 import './app.config';
 
-import './decorator/select';
-import './decorator/tooltip';
-
 import './modules/form/form.module';
 import './modules/agent/agent.module';
 import './modules/sql/sql.module';
@@ -97,6 +94,9 @@ import UnsavedChangesGuard from './services/UnsavedChangesGuard.service';
 import Clusters from './services/Clusters';
 import Caches from './services/Caches';
 
+import AngularStrapTooltip from './services/AngularStrapTooltip.decorator';
+import AngularStrapSelect from './services/AngularStrapSelect.decorator';
+
 // Filters.
 import byName from './filters/byName.filter';
 import defaultName from './filters/default-name.filter';
@@ -195,6 +195,8 @@ angular
     gridColumnSelector.name,
     bsSelectMenu.name,
     protectFromBsSelectRender.name,
+    AngularStrapTooltip.name,
+    AngularStrapSelect.name,
     // Ignite modules.
     IgniteModules.name
 ])

http://git-wip-us.apache.org/repos/asf/ignite/blob/39fa8fae/modules/web-console/frontend/app/decorator/select.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/decorator/select.js b/modules/web-console/frontend/app/decorator/select.js
deleted file mode 100644
index 2d22707..0000000
--- a/modules/web-console/frontend/app/decorator/select.js
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * 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.
- */
-
-import angular from 'angular';
-
-/**
- * Special decorator that fix problem in AngularStrap selectAll / deselectAll methods.
- * If this problem will be fixed in AngularStrap we can remove this delegate.
- */
-angular.module('mgcrea.ngStrap.select')
-    .decorator('$select', ['$delegate', ($delegate) => {
-        function SelectFactoryDecorated(element, controller, config) {
-            const delegate = $delegate(element, controller, config);
-
-            // Common vars.
-            const options = angular.extend({}, $delegate.defaults, config);
-
-            const scope = delegate.$scope;
-
-            const valueByIndex = (index) => {
-                if (angular.isUndefined(scope.$matches[index]))
-                    return null;
-
-                return scope.$matches[index].value;
-            };
-
-            const selectAll = (active) => {
-                const selected = [];
-
-                scope.$apply(() => {
-                    for (let i = 0; i < scope.$matches.length; i++) {
-                        if (scope.$isActive(i) === active) {
-                            selected[i] = scope.$matches[i].value;
-
-                            delegate.activate(i);
-
-                            controller.$setViewValue(scope.$activeIndex.map(valueByIndex));
-                        }
-                    }
-                });
-
-                // Emit events.
-                for (let i = 0; i < selected.length; i++) {
-                    if (selected[i])
-                        scope.$emit(options.prefixEvent + '.select', selected[i], i, delegate);
-                }
-            };
-
-            scope.$selectAll = () => {
-                scope.$$postDigest(selectAll.bind(this, false));
-            };
-
-            scope.$selectNone = () => {
-                scope.$$postDigest(selectAll.bind(this, true));
-            };
-
-            return delegate;
-        }
-
-        SelectFactoryDecorated.defaults = $delegate.defaults;
-
-        return SelectFactoryDecorated;
-    }]);

http://git-wip-us.apache.org/repos/asf/ignite/blob/39fa8fae/modules/web-console/frontend/app/decorator/tooltip.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/decorator/tooltip.js b/modules/web-console/frontend/app/decorator/tooltip.js
deleted file mode 100644
index 71ea694..0000000
--- a/modules/web-console/frontend/app/decorator/tooltip.js
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * 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.
- */
-
-import angular from 'angular';
-
-/**
- * Special decorator that fix problem in AngularStrap $tooltip in special case.
- * Case: when tooltip is shown on table row remove button and user click this button.
- * If this problem will be fixed in AngularStrap we can remove this delegate.
- */
-angular.module('mgcrea.ngStrap.tooltip')
-    .decorator('$tooltip', ['$delegate', ($delegate) => {
-        function TooltipFactoryDecorated(element, config) {
-            let tipElementEntered = false;
-
-            config.onShow = ($tooltip) => {
-                // Workaround for tooltip detection.
-                if ($tooltip.$element && $tooltip.$options.trigger === 'click hover') {
-                    $tooltip.$element.on('mouseenter', () => tipElementEntered = true);
-                    $tooltip.$element.on('mouseleave', () => {
-                        tipElementEntered = false;
-
-                        $tooltip.leave();
-                    });
-                }
-            };
-
-            const $tooltip = $delegate(element, config);
-
-            const scope = $tooltip.$scope;
-            const options = $tooltip.$options;
-
-            const _hide = $tooltip.hide;
-
-            $tooltip.hide = (blur) => {
-                if (!$tooltip.$isShown || tipElementEntered)
-                    return;
-
-                if ($tooltip.$element) {
-                    $tooltip.$element.off('mouseenter');
-                    $tooltip.$element.off('mouseleave');
-
-                    return _hide(blur);
-                }
-
-                scope.$emit(options.prefixEvent + '.hide.before', $tooltip);
-
-                if (angular.isDefined(options.onBeforeHide) && angular.isFunction(options.onBeforeHide))
-                    options.onBeforeHide($tooltip);
-
-                $tooltip.$isShown = scope.$isShown = false;
-                scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();
-            };
-
-            return $tooltip;
-        }
-
-        return TooltipFactoryDecorated;
-    }]);

http://git-wip-us.apache.org/repos/asf/ignite/blob/39fa8fae/modules/web-console/frontend/app/services/AngularStrapSelect.decorator.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/services/AngularStrapSelect.decorator.js b/modules/web-console/frontend/app/services/AngularStrapSelect.decorator.js
new file mode 100644
index 0000000..39f7ccd
--- /dev/null
+++ b/modules/web-console/frontend/app/services/AngularStrapSelect.decorator.js
@@ -0,0 +1,77 @@
+/*
+ * 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.
+ */
+
+import angular from 'angular';
+
+/**
+ * Special decorator that fix problem in AngularStrap selectAll / deselectAll methods.
+ * If this problem will be fixed in AngularStrap we can remove this delegate.
+ */
+export default angular.module('mgcrea.ngStrap.select')
+    .decorator('$select', ['$delegate', ($delegate) => {
+        function SelectFactoryDecorated(element, controller, config) {
+            const delegate = $delegate(element, controller, config);
+
+            // Common vars.
+            const options = angular.extend({}, $delegate.defaults, config);
+
+            const scope = delegate.$scope;
+
+            const valueByIndex = (index) => {
+                if (angular.isUndefined(scope.$matches[index]))
+                    return null;
+
+                return scope.$matches[index].value;
+            };
+
+            const selectAll = (active) => {
+                const selected = [];
+
+                scope.$apply(() => {
+                    for (let i = 0; i < scope.$matches.length; i++) {
+                        if (scope.$isActive(i) === active) {
+                            selected[i] = scope.$matches[i].value;
+
+                            delegate.activate(i);
+
+                            controller.$setViewValue(scope.$activeIndex.map(valueByIndex));
+                        }
+                    }
+                });
+
+                // Emit events.
+                for (let i = 0; i < selected.length; i++) {
+                    if (selected[i])
+                        scope.$emit(options.prefixEvent + '.select', selected[i], i, delegate);
+                }
+            };
+
+            scope.$selectAll = () => {
+                scope.$$postDigest(selectAll.bind(this, false));
+            };
+
+            scope.$selectNone = () => {
+                scope.$$postDigest(selectAll.bind(this, true));
+            };
+
+            return delegate;
+        }
+
+        SelectFactoryDecorated.defaults = $delegate.defaults;
+
+        return SelectFactoryDecorated;
+    }]);

http://git-wip-us.apache.org/repos/asf/ignite/blob/39fa8fae/modules/web-console/frontend/app/services/AngularStrapTooltip.decorator.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/services/AngularStrapTooltip.decorator.js b/modules/web-console/frontend/app/services/AngularStrapTooltip.decorator.js
new file mode 100644
index 0000000..d01a450
--- /dev/null
+++ b/modules/web-console/frontend/app/services/AngularStrapTooltip.decorator.js
@@ -0,0 +1,103 @@
+/*
+ * 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.
+ */
+
+import angular from 'angular';
+import flow from 'lodash/flow';
+
+/**
+ * Decorator that fix problem in AngularStrap $tooltip.
+ */
+export default angular
+    .module('mgcrea.ngStrap.tooltip')
+    /**
+     * Don't hide tooltip when mouse move from element to tooltip.
+     */
+    .decorator('$tooltip', ['$delegate', ($delegate) => {
+        function TooltipFactoryDecorated(element, config) {
+            let tipElementEntered = false;
+
+            config.onShow = ($tooltip) => {
+                // Workaround for tooltip detection.
+                if ($tooltip.$element && $tooltip.$options.trigger === 'click hover') {
+                    $tooltip.$element.on('mouseenter', () => tipElementEntered = true);
+                    $tooltip.$element.on('mouseleave', () => {
+                        tipElementEntered = false;
+
+                        $tooltip.leave();
+                    });
+                }
+            };
+
+            const $tooltip = $delegate(element, config);
+
+            const scope = $tooltip.$scope;
+            const options = $tooltip.$options;
+
+            const _hide = $tooltip.hide;
+
+            $tooltip.hide = (blur) => {
+                if (!$tooltip.$isShown || tipElementEntered)
+                    return;
+
+                if ($tooltip.$element) {
+                    $tooltip.$element.off('mouseenter');
+                    $tooltip.$element.off('mouseleave');
+
+                    return _hide(blur);
+                }
+
+                scope.$emit(options.prefixEvent + '.hide.before', $tooltip);
+
+                if (angular.isDefined(options.onBeforeHide) && angular.isFunction(options.onBeforeHide))
+                    options.onBeforeHide($tooltip);
+
+                $tooltip.$isShown = scope.$isShown = false;
+                scope.$$phase || (scope.$root && scope.$root.$$phase) || scope.$digest();
+            };
+
+            return $tooltip;
+        }
+
+        return TooltipFactoryDecorated;
+    }])
+    /**
+     * Set width for dropdown as for element.
+     */
+    .decorator('$tooltip', ['$delegate', ($delegate) => {
+        return function(el, config) {
+            const $tooltip = $delegate(el, config);
+
+            $tooltip.$referenceElement = el;
+            $tooltip.destroy = flow($tooltip.destroy, () => $tooltip.$referenceElement = null);
+            $tooltip.$applyPlacement = flow($tooltip.$applyPlacement, () => {
+                if (!$tooltip.$element)
+                    return;
+
+                const refWidth = $tooltip.$referenceElement[0].getBoundingClientRect().width;
+                const elWidth = $tooltip.$element[0].getBoundingClientRect().width;
+
+                if (refWidth > elWidth) {
+                    $tooltip.$element.css({
+                        width: refWidth,
+                        maxWidth: 'initial'
+                    });
+                }
+            });
+
+            return $tooltip;
+        };
+    }]);

http://git-wip-us.apache.org/repos/asf/ignite/blob/39fa8fae/modules/web-console/frontend/views/configuration/domains-import.tpl.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/configuration/domains-import.tpl.pug b/modules/web-console/frontend/views/configuration/domains-import.tpl.pug
index 7097197..e9ed6f3 100644
--- a/modules/web-console/frontend/views/configuration/domains-import.tpl.pug
+++ b/modules/web-console/frontend/views/configuration/domains-import.tpl.pug
@@ -65,13 +65,11 @@ mixin td-ellipses-lbl(w, lbl)
                             +ignite-form-field-dropdown('Driver JAR:', 'ui.selectedJdbcDriverJar', '"jdbcDriverJar"', false, true, false,
                                 'Choose JDBC driver', '', 'jdbcDriverJars',
                                 'Select appropriate JAR with JDBC driver<br> To add another driver you need to place it into "/jdbc-drivers" folder of Ignite Web Agent<br> Refer to Ignite Web Agent README.txt for for more information'
-                            )(
-                                data-ignite-form-field-input-autofocus='true'
                             )
                         .settings-row.settings-row_small-label
                             +java-class('JDBC driver:', 'selectedPreset.jdbcDriverClass', '"jdbcDriverClass"', true, true, 'Fully qualified class name of JDBC driver that will be used to connect to database')
                         .settings-row.settings-row_small-label
-                            +text('JDBC URL:', 'selectedPreset.jdbcUrl', '"jdbcUrl"', true, 'JDBC URL', 'JDBC URL for connecting to database<br>Refer to your database documentation for details')
+                            +text-enabled-autofocus('JDBC URL:', 'selectedPreset.jdbcUrl', '"jdbcUrl"', true, true, 'JDBC URL', 'JDBC URL for connecting to database<br>Refer to your database documentation for details')
                         .settings-row.settings-row_small-label
                             +text('User:', 'selectedPreset.user', '"jdbcUser"', false, '', 'User name for connecting to database')
                         .settings-row.settings-row_small-label


[20/50] [abbrv] ignite git commit: Web Console: Fixed UI for header menu.

Posted by yz...@apache.org.
Web Console: Fixed UI for header menu.


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

Branch: refs/heads/ignite-5658
Commit: 0d2992c502d54f14b71afbc98529770f49f32345
Parents: 03f02d3
Author: Andrey Novikov <an...@gridgain.com>
Authored: Mon Jul 24 14:30:05 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Mon Jul 24 14:30:05 2017 +0700

----------------------------------------------------------------------
 .../components/web-console-header/style.scss    |  6 +--
 .../states/configuration/clusters/memory.pug    |  8 ++--
 .../frontend/app/primitives/panel/index.scss    |  2 +-
 .../frontend/views/includes/header-left.pug     | 41 ++++++++++----------
 4 files changed, 29 insertions(+), 28 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2992c5/modules/web-console/frontend/app/components/web-console-header/style.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/components/web-console-header/style.scss b/modules/web-console/frontend/app/components/web-console-header/style.scss
index 376edd9..5cc2355 100644
--- a/modules/web-console/frontend/app/components/web-console-header/style.scss
+++ b/modules/web-console/frontend/app/components/web-console-header/style.scss
@@ -18,7 +18,7 @@
 web-console-header {
     @import "./../../../public/stylesheets/variables.scss";
 
-    $nav-item-margin: 42px;
+    $nav-item-margin: 40px;
     $bottom-border-width: 4px;
 
     display: block;
@@ -51,7 +51,7 @@ web-console-header {
         }
 
         &.wch-slot-left {
-            margin-left: 105px;
+            margin-left: 80px;
         }
 
         &.wch-slot-right {
@@ -73,7 +73,7 @@ web-console-header {
     }
 
     .wch-nav-item,
-    a.wch-nav-item {
+    .wch-nav-item > a {
         cursor: pointer;
         white-space: nowrap;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2992c5/modules/web-console/frontend/app/modules/states/configuration/clusters/memory.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/configuration/clusters/memory.pug b/modules/web-console/frontend/app/modules/states/configuration/clusters/memory.pug
index 0ba1ab4..a09fedd 100644
--- a/modules/web-console/frontend/app/modules/states/configuration/clusters/memory.pug
+++ b/modules/web-console/frontend/app/modules/states/configuration/clusters/memory.pug
@@ -58,12 +58,12 @@ include /app/helpers/jade/mixins
                             | Memory policies configuration
                         .group-content
                             .details-row
-                                +text('Default region name:', model + '.defaultMemoryPolicyName', '"defaultMemoryPolicyName"',
-                                'false', 'default', 'Name of the memory policy that defines the default memory region')
+                                +text('Default memory policy name:', model + '.defaultMemoryPolicyName', '"defaultMemoryPolicyName"',
+                                'false', 'default', 'Name of a memory policy to be used as default one')
                             .details-row(ng-hide='(' + model + '.defaultMemoryPolicyName || "default") !== "default"')
-                                +number('Default region size:', model + '.defaultMemoryPolicySize', '"defaultMemoryPolicySize"',
+                                +number('Default memory policy size:', model + '.defaultMemoryPolicySize', '"defaultMemoryPolicySize"',
                                 'true', '0.8 * totalMemoryAvailable', '10485760',
-                                'Size of the memory policy that defines the default memory region')
+                                'Specify desired size of default memory policy without having to use more verbose syntax of MemoryPolicyConfiguration elements')
                             .details-row(ng-init='memoryPoliciesTbl={type: "memoryPolicies", model: "memoryPolicies", focusId: "name", ui: "memory-policies-table"}')
                                 +ignite-form-group()
                                     ignite-form-field-label

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2992c5/modules/web-console/frontend/app/primitives/panel/index.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/panel/index.scss b/modules/web-console/frontend/app/primitives/panel/index.scss
index 38d18dd..56cecfe 100644
--- a/modules/web-console/frontend/app/primitives/panel/index.scss
+++ b/modules/web-console/frontend/app/primitives/panel/index.scss
@@ -31,7 +31,7 @@
         padding: 22px 20px;
 
         background-color: initial;
-        border-bottom: 1px solid $panel-default-border;
+        border-bottom: 1px solid $ignite-brand-primary;
 
         &:hover {
             text-decoration: none;

http://git-wip-us.apache.org/repos/asf/ignite/blob/0d2992c5/modules/web-console/frontend/views/includes/header-left.pug
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/views/includes/header-left.pug b/modules/web-console/frontend/views/includes/header-left.pug
index e9db53b..6b7fe6a 100644
--- a/modules/web-console/frontend/views/includes/header-left.pug
+++ b/modules/web-console/frontend/views/includes/header-left.pug
@@ -14,15 +14,13 @@
     See the License for the specific language governing permissions and
     limitations under the License.
 
-a.wch-nav-item(
-    ui-sref='base.configuration.tabs'
-    ui-sref-active='active'
-)
-    | Configure
+.wch-nav-item
+    a(ui-sref='base.configuration.tabs' ui-sref-active='active')
+        | Configure
 
 .wch-nav-item(ng-controller='notebookController')
-    div(ng-if='IgniteDemoMode' ui-sref='base.sql.demo' ng-class='{active: $state.includes("base.sql")}')
-        span Queries
+    a(ng-if='IgniteDemoMode' ui-sref='base.sql.demo' ui-sref-active='active')
+        | Queries
 
     div(ng-if='!IgniteDemoMode')
         div(ng-if='!notebooks.length' ng-class='{active: $state.includes("base.sql")}')
@@ -41,16 +39,19 @@ a.wch-nav-item(
             span Queries
                 span.caret
 
-.wch-nav-item(ignite-navbar)
-    div(ng-click='$event.stopPropagation()'
-        ng-class='{active: $state.includes("base.monitoring")}'
-        ng-repeat='item in navbar.items'
-        bs-dropdown='item.children'
-        data-placement='bottom-left'
-        data-trigger='hover focus'
-        data-container='self'
-        aria-haspopup='true'
-        aria-expanded='false'
-    )
-        span {{::item.text}}
-            span.caret
+.wch-content(ignite-navbar)
+    .wch-nav-item(ng-repeat='item in navbar.items')
+        div(ng-if='item.children' ng-click='$event.stopPropagation()'
+                ng-class='{active: $state.includes(item.sref)}'
+                bs-dropdown='item.children'
+                data-placement='bottom-left'
+                data-trigger='hover focus'
+                data-container='self'
+                aria-haspopup='true'
+                aria-expanded='false'
+            )
+                span {{::item.text}}
+                    span.caret
+
+        a(ng-if='!item.children' ui-sref='{{item.sref}}' ui-sref-active='active')
+            | {{::item.text}}
\ No newline at end of file


[05/50] [abbrv] ignite git commit: IGNITE-5788 Web Console: Fixed dependencies for maven project with c3p0.

Posted by yz...@apache.org.
IGNITE-5788 Web Console: Fixed dependencies for maven project with c3p0.


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

Branch: refs/heads/ignite-5658
Commit: 02a1bdca57ce6af7fe7636b0a9f99048c89b88b6
Parents: 70d0f99
Author: Andrey Novikov <an...@gridgain.com>
Authored: Thu Jul 20 15:47:49 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Thu Jul 20 15:47:49 2017 +0700

----------------------------------------------------------------------
 modules/web-console/frontend/app/data/pom-dependencies.json | 5 ++++-
 .../app/modules/configuration/generator/Maven.service.js    | 9 +++------
 modules/web-console/frontend/webpack/webpack.common.js      | 4 ++--
 3 files changed, 9 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/02a1bdca/modules/web-console/frontend/app/data/pom-dependencies.json
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/data/pom-dependencies.json b/modules/web-console/frontend/app/data/pom-dependencies.json
index 945e3f5..8d3fa81 100644
--- a/modules/web-console/frontend/app/data/pom-dependencies.json
+++ b/modules/web-console/frontend/app/data/pom-dependencies.json
@@ -11,7 +11,10 @@
     "HadoopIgfsJcl": {"artifactId": "ignite-hadoop"},
     "SLF4J": {"artifactId": "ignite-slf4j"},
 
-    "Generic": {"groupId": "com.mchange", "artifactId": "c3p0", "version": "0.9.5.2"},
+    "Generic": [
+        {"groupId": "com.mchange", "artifactId": "c3p0", "version": "0.9.5.2"},
+        {"groupId": "com.mchange", "artifactId": "mchange-commons-java", "version": "0.2.11"}
+    ],
     "MySQL": {"groupId": "mysql", "artifactId": "mysql-connector-java", "version": "5.1.40"},
     "PostgreSQL": {"groupId": "org.postgresql", "artifactId": "postgresql", "version": "9.4.1212.jre7"},
     "H2": {"groupId": "com.h2database", "artifactId": "h2", "version": [

http://git-wip-us.apache.org/repos/asf/ignite/blob/02a1bdca/modules/web-console/frontend/app/modules/configuration/generator/Maven.service.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/configuration/generator/Maven.service.js b/modules/web-console/frontend/app/modules/configuration/generator/Maven.service.js
index 81d7d10..abbada9 100644
--- a/modules/web-console/frontend/app/modules/configuration/generator/Maven.service.js
+++ b/modules/web-console/frontend/app/modules/configuration/generator/Maven.service.js
@@ -47,12 +47,9 @@ export default class IgniteMavenGenerator {
             return _.isArray(version) ? _.find(version, (v) => versionService.since(igniteVer, v.range)).version : version;
         };
 
-        if (!_.has(POM_DEPENDENCIES, key))
-            return;
-
-        const {groupId, artifactId, version, jar} = POM_DEPENDENCIES[key];
-
-        this.addDependency(deps, groupId || 'org.apache.ignite', artifactId, extractVersion(version) || dfltVer, jar);
+        _.forEach(POM_DEPENDENCIES[key], ({groupId, artifactId, version, jar}) => {
+            this.addDependency(deps, groupId || 'org.apache.ignite', artifactId, extractVersion(version) || dfltVer, jar);
+        });
     }
 
     addResource(sb, dir, exclude) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/02a1bdca/modules/web-console/frontend/webpack/webpack.common.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/webpack/webpack.common.js b/modules/web-console/frontend/webpack/webpack.common.js
index a303d6e..5a3763e 100644
--- a/modules/web-console/frontend/webpack/webpack.common.js
+++ b/modules/web-console/frontend/webpack/webpack.common.js
@@ -138,7 +138,7 @@ export default {
             },
             {
                 test: /\.(jpe?g|png|gif)$/i,
-                loader: 'file?name=assets/images/[name]_[hash].[ext]'
+                loader: 'file?name=assets/images/[name].[hash].[ext]'
             },
             {
                 test: require.resolve('jquery'),
@@ -178,7 +178,7 @@ export default {
         new HtmlWebpackPlugin({
             template: './views/index.pug'
         }),
-        new ExtractTextPlugin({filename: 'assets/css/[name].css', allChunks: true}),
+        new ExtractTextPlugin({filename: 'assets/css/[name].[hash].css', allChunks: true}),
         new CopyWebpackPlugin([
             { context: 'public', from: '**/*.png' },
             { context: 'public', from: '**/*.svg' },


[06/50] [abbrv] ignite git commit: IGNITE-5775: Fix bug with delay for compute jobs. This closes #2319.

Posted by yz...@apache.org.
IGNITE-5775: Fix bug with delay for compute jobs. This closes #2319.


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

Branch: refs/heads/ignite-5658
Commit: e285f9dbebc6fd86e81e52828813be9b9d2633f2
Parents: 02e2507
Author: Andrey V. Mashenkov <an...@gmail.com>
Authored: Thu Jul 20 13:24:25 2017 +0300
Committer: Andrey V. Mashenkov <an...@gmail.com>
Committed: Thu Jul 20 13:24:25 2017 +0300

----------------------------------------------------------------------
 .../processors/job/GridJobProcessor.java        | 10 +--
 .../internal/IgniteComputeJobOneThreadTest.java | 75 ++++++++++++++++++++
 .../testsuites/IgniteComputeGridTestSuite.java  |  3 +
 3 files changed, 83 insertions(+), 5 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/e285f9db/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobProcessor.java
index 7d2073e..cc8d903 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/job/GridJobProcessor.java
@@ -1794,6 +1794,11 @@ public class GridJobProcessor extends GridProcessorAdapter {
                         return;
                     }
 
+                    if (!activeJobs.remove(worker.getJobId(), worker))
+                        cancelledJobs.remove(worker.getJobId(), worker);
+
+                    heldJobs.remove(worker.getJobId());
+
                     try {
                         handleCollisions();
                     }
@@ -1801,11 +1806,6 @@ public class GridJobProcessor extends GridProcessorAdapter {
                         rwLock.readUnlock();
                     }
                 }
-
-                if (!activeJobs.remove(worker.getJobId(), worker))
-                    cancelledJobs.remove(worker.getJobId(), worker);
-
-                heldJobs.remove(worker.getJobId());
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/e285f9db/modules/core/src/test/java/org/apache/ignite/internal/IgniteComputeJobOneThreadTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/IgniteComputeJobOneThreadTest.java b/modules/core/src/test/java/org/apache/ignite/internal/IgniteComputeJobOneThreadTest.java
new file mode 100644
index 0000000..76f669e
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/IgniteComputeJobOneThreadTest.java
@@ -0,0 +1,75 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal;
+
+import org.apache.ignite.Ignite;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.lang.IgniteFuture;
+import org.apache.ignite.lang.IgniteRunnable;
+import org.apache.ignite.spi.collision.fifoqueue.FifoQueueCollisionSpi;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ * Test of absence of gaps between jobs in compute
+ */
+public class IgniteComputeJobOneThreadTest extends GridCommonAbstractTest {
+    @Override protected IgniteConfiguration getConfiguration(String name) throws Exception {
+        FifoQueueCollisionSpi colSpi = new FifoQueueCollisionSpi();
+        colSpi.setParallelJobsNumber(1);
+
+        return super.getConfiguration(name)
+            .setMetricsUpdateFrequency(10000)
+            .setCollisionSpi(colSpi);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        startGrid(0);
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected long getTestTimeout() {
+        return 10000;
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testNoTimeout() throws Exception {
+        Ignite ignite = ignite(0);
+
+        IgniteFuture fut = null;
+
+        for (int i = 0; i < 10000; i++) {
+            fut =  ignite.compute().runAsync(new IgniteRunnable() {
+                @Override public void run() {
+
+                }
+            });
+        }
+
+        fut.get();
+
+        assertTrue(true);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e285f9db/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeGridTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeGridTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeGridTestSuite.java
index 3f3bc53..ac3de73 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeGridTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteComputeGridTestSuite.java
@@ -65,6 +65,7 @@ import org.apache.ignite.internal.GridTaskNameAnnotationSelfTest;
 import org.apache.ignite.internal.GridTaskResultCacheSelfTest;
 import org.apache.ignite.internal.GridTaskTimeoutSelfTest;
 import org.apache.ignite.internal.IgniteComputeEmptyClusterGroupTest;
+import org.apache.ignite.internal.IgniteComputeJobOneThreadTest;
 import org.apache.ignite.internal.IgniteComputeTopologyExceptionTest;
 import org.apache.ignite.internal.IgniteExecutorServiceTest;
 import org.apache.ignite.internal.IgniteExplicitImplicitDeploymentSelfTest;
@@ -163,6 +164,8 @@ public class IgniteComputeGridTestSuite {
         suite.addTestSuite(IgniteComputeCustomExecutorConfigurationSelfTest.class);
         suite.addTestSuite(IgniteComputeCustomExecutorSelfTest.class);
 
+        suite.addTestSuite(IgniteComputeJobOneThreadTest.class);
+
         return suite;
     }
 }


[17/50] [abbrv] ignite git commit: Fixed checking full map on updates.

Posted by yz...@apache.org.
Fixed checking full map on updates.


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

Branch: refs/heads/ignite-5658
Commit: 95f4abc709bcf2a4534f9631b3ecea8266cfc485
Parents: 6f749bf
Author: Pavel Kovalenko <jo...@gmail.com>
Authored: Fri Jul 21 18:03:07 2017 +0300
Committer: Pavel Kovalenko <jo...@gmail.com>
Committed: Fri Jul 21 18:03:44 2017 +0300

----------------------------------------------------------------------
 .../cache/distributed/dht/GridClientPartitionTopology.java  | 9 +++++++--
 .../cache/distributed/dht/GridDhtPartitionTopologyImpl.java | 9 +++++++--
 2 files changed, 14 insertions(+), 4 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/95f4abc7/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
index f4ed517..6ff572b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
@@ -628,8 +628,13 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
                     }
                 }
 
-                for (GridDhtPartitionMap part : partMap.values())
-                    fullMapUpdated |= !node2part.containsKey(part);
+                // Check that we have new nodes.
+                for (GridDhtPartitionMap part : partMap.values()) {
+                    if (fullMapUpdated)
+                        break;
+
+                    fullMapUpdated = !node2part.containsKey(part.nodeId());
+                }
 
                 // Remove entry if node left.
                 for (Iterator<UUID> it = partMap.keySet().iterator(); it.hasNext(); ) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/95f4abc7/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
index 601da1b..0ca291d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
@@ -1154,8 +1154,13 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
                     }
                 }
 
-                for (GridDhtPartitionMap part : partMap.values())
-                    fullMapUpdated |= !node2part.containsKey(part);
+                // Check that we have new nodes.
+                for (GridDhtPartitionMap part : partMap.values()) {
+                    if (fullMapUpdated)
+                        break;
+
+                    fullMapUpdated = !node2part.containsKey(part.nodeId());
+                }
 
                 // Remove entry if node left.
                 for (Iterator<UUID> it = partMap.keySet().iterator(); it.hasNext(); ) {


[14/50] [abbrv] ignite git commit: IGNITE-5786 .NET: Fix cache store session handling for cross-cache transactions

Posted by yz...@apache.org.
IGNITE-5786 .NET: Fix cache store session handling for cross-cache transactions

This closes #2331


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

Branch: refs/heads/ignite-5658
Commit: c1a3b3744f89e27906621e62e9d73281791fcf30
Parents: 6de0571
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Fri Jul 21 17:04:39 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Fri Jul 21 17:04:39 2017 +0300

----------------------------------------------------------------------
 .../dotnet/PlatformDotNetCacheStore.java        | 31 +++++++
 .../Apache.Ignite.Core.Tests.csproj             |  5 ++
 .../Cache/Store/CacheStoreSessionTest.cs        | 90 +++++++++++++-------
 .../Store/CacheStoreSessionTestCodeConfig.cs    | 68 +++++++++++++++
 .../Store/CacheStoreSessionTestSharedFactory.cs | 48 +++++++++++
 .../Cache/Store/CacheStoreTest.cs               | 10 ++-
 .../cache-store-session-shared-factory.xml      | 76 +++++++++++++++++
 .../Config/Cache/Store/cache-store-session.xml  | 20 ++---
 .../Impl/Cache/Store/CacheStoreInternal.cs      | 14 ++-
 9 files changed, 320 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/c1a3b374/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetCacheStore.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetCacheStore.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetCacheStore.java
index dd61a54..471eb01 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetCacheStore.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/dotnet/PlatformDotNetCacheStore.java
@@ -47,6 +47,7 @@ import javax.cache.integration.CacheLoaderException;
 import javax.cache.integration.CacheWriterException;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Map;
 
 /**
@@ -90,6 +91,9 @@ public class PlatformDotNetCacheStore<K, V> implements CacheStore<K, V>, Platfor
     /** Key used to distinguish session deployment.  */
     private static final Object KEY_SES = new Object();
 
+    /** Key to designate a set of stores that share current session.  */
+    private static final Object KEY_SES_STORES = new Object();
+
     /** */
     @CacheStoreSessionResource
     private CacheStoreSession ses;
@@ -337,6 +341,23 @@ public class PlatformDotNetCacheStore<K, V> implements CacheStore<K, V>, Platfor
                     writer.writeLong(session());
                     writer.writeString(ses.cacheName());
                     writer.writeBoolean(commit);
+
+                    // When multiple stores (caches) participate in a single transaction,
+                    // they share a single session, but sessionEnd is called on each store.
+                    // Same thing happens on platform side: session is shared; each store must be notified,
+                    // then session should be closed.
+                    Collection<Long> stores = (Collection<Long>) ses.properties().get(KEY_SES_STORES);
+                    assert stores != null;
+
+                    stores.remove(ptr);
+                    boolean last = stores.isEmpty();
+
+                    writer.writeBoolean(last);
+
+                    if (last) {
+                        // Session object has been released on platform side, remove marker.
+                        ses.properties().remove(KEY_SES);
+                    }
                 }
             }, null);
         }
@@ -415,6 +436,16 @@ public class PlatformDotNetCacheStore<K, V> implements CacheStore<K, V>, Platfor
             ses.properties().put(KEY_SES, sesPtr);
         }
 
+        // Keep track of all stores that use current session (cross-cache tx uses single session for all caches).
+        Collection<Long> stores = (Collection<Long>) ses.properties().get(KEY_SES_STORES);
+
+        if (stores == null) {
+            stores = new HashSet<>();
+            ses.properties().put(KEY_SES_STORES, stores);
+        }
+
+        stores.add(ptr);
+
         return sesPtr;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/c1a3b374/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
index 90b7970..e4f65bc 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Apache.Ignite.Core.Tests.csproj
@@ -89,6 +89,8 @@
     <Compile Include="Cache\Query\Linq\CacheLinqTest.Misc.cs" />
     <Compile Include="Cache\Query\Linq\CacheLinqTest.Custom.cs" />
     <Compile Include="Cache\Query\Linq\CacheLinqTest.Contains.cs" />
+    <Compile Include="Cache\Store\CacheStoreSessionTestCodeConfig.cs" />
+    <Compile Include="Cache\Store\CacheStoreSessionTestSharedFactory.cs" />
     <Compile Include="Deployment\CacheGetFunc.cs" />
     <Compile Include="Deployment\GetAddressFunc.cs" />
     <Compile Include="Deployment\PeerAssemblyLoadingAllApisTest.cs" />
@@ -314,6 +316,9 @@
     <Content Include="Config\Cache\Affinity\affinity-function.xml">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>
+    <Content Include="Config\Cache\Store\cache-store-session-shared-factory.xml">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </Content>
     <Content Include="Config\Cache\Store\cache-store-session.xml">
       <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
     </Content>

http://git-wip-us.apache.org/repos/asf/ignite/blob/c1a3b374/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs
index 315e285..818948c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTest.cs
@@ -28,16 +28,13 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
     /// <summary>
     /// Tests for store session.
     /// </summary>
-    public sealed class CacheStoreSessionTest
+    public class CacheStoreSessionTest
     {
-        /** Grid name. */
-        private const string IgniteName = "grid";
-
         /** Cache 1 name. */
-        private const string Cache1 = "cache1";
+        protected const string Cache1 = "cache1";
 
         /** Cache 2 name. */
-        private const string Cache2 = "cache2";
+        protected const string Cache2 = "cache2";
 
         /** Operations. */
         private static ConcurrentBag<ICollection<Operation>> _dumps;
@@ -48,11 +45,26 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
         [TestFixtureSetUp]
         public void BeforeTests()
         {
-            Ignition.Start(new IgniteConfiguration(TestUtils.GetTestConfiguration())
+            Ignition.Start(GetIgniteConfiguration());
+        }
+
+        /// <summary>
+        /// Gets the ignite configuration.
+        /// </summary>
+        protected virtual IgniteConfiguration GetIgniteConfiguration()
+        {
+            return new IgniteConfiguration(TestUtils.GetTestConfiguration())
             {
-                IgniteInstanceName = IgniteName,
                 SpringConfigUrl = @"config\cache\store\cache-store-session.xml"
-            });
+            };
+        }
+
+        /// <summary>
+        /// Gets the store count.
+        /// </summary>
+        protected virtual int StoreCount
+        {
+            get { return 2; }
         }
 
         /// <summary>
@@ -61,21 +73,29 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
         [TestFixtureTearDown]
         public void AfterTests()
         {
-            Ignition.StopAll(true);
+            try
+            {
+                TestUtils.AssertHandleRegistryHasItems(Ignition.GetIgnite(), 2, 1000);
+            }
+            finally 
+            {
+                Ignition.StopAll(true);
+            }
         }
         
         /// <summary>
         /// Test basic session API.
         /// </summary>
         [Test]
+        [Timeout(30000)]
         public void TestSession()
         {
             _dumps = new ConcurrentBag<ICollection<Operation>>();
 
-            var ignite = Ignition.GetIgnite(IgniteName);
+            var ignite = Ignition.GetIgnite();
 
-            var cache1 = Ignition.GetIgnite(IgniteName).GetCache<int, int>(Cache1);
-            var cache2 = Ignition.GetIgnite(IgniteName).GetCache<int, int>(Cache2);
+            var cache1 = ignite.GetCache<int, int>(Cache1);
+            var cache2 = ignite.GetCache<int, int>(Cache2);
 
             // 1. Test rollback.
             using (var tx = ignite.GetTransactions().TxStart())
@@ -86,11 +106,15 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
                 tx.Rollback();
             }
 
-            Assert.AreEqual(1, _dumps.Count);
-            var ops = _dumps.First();
-            Assert.AreEqual(1, ops.Count);
+            // SessionEnd is called once per store instance.
+            Assert.AreEqual(StoreCount, _dumps.Count);
 
-            Assert.AreEqual(1, ops.Count(op => op.Type == OperationType.SesEnd && !op.Commit));
+            foreach (var ops in _dumps)
+            {
+                var op = ops.Single();
+                Assert.AreEqual(OperationType.SesEnd, op.Type);
+                Assert.IsFalse(op.Commit);
+            }
 
             _dumps = new ConcurrentBag<ICollection<Operation>>();
 
@@ -103,13 +127,17 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
                 tx.Commit();
             }
 
-            Assert.AreEqual(1, _dumps.Count);
-            ops = _dumps.First();
-            Assert.AreEqual(3, ops.Count);
+            Assert.AreEqual(StoreCount, _dumps.Count);
 
-            Assert.AreEqual(1, ops.Count(op => op.Type == OperationType.Write && Cache1.Equals(op.CacheName) && 1.Equals(op.Key) && 1.Equals(op.Value)));
-            Assert.AreEqual(1, ops.Count(op => op.Type == OperationType.Write && Cache2.Equals(op.CacheName) && 2.Equals(op.Key) && 2.Equals(op.Value)));
-            Assert.AreEqual(1, ops.Count(op => op.Type == OperationType.SesEnd && op.Commit));
+            foreach (var ops in _dumps)
+            {
+                Assert.AreEqual(2 + StoreCount, ops.Count);
+                Assert.AreEqual(1, ops.Count(op => op.Type == OperationType.Write
+                                                   && Cache1 == op.CacheName && 1 == op.Key && 1 == op.Value));
+                Assert.AreEqual(1, ops.Count(op => op.Type == OperationType.Write
+                                                   && Cache2 == op.CacheName && 2 == op.Key && 2 == op.Value));
+                Assert.AreEqual(StoreCount, ops.Count(op => op.Type == OperationType.SesEnd && op.Commit));
+            }
 
             _dumps = new ConcurrentBag<ICollection<Operation>>();
 
@@ -122,13 +150,17 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
                 tx.Commit();
             }
 
-            Assert.AreEqual(1, _dumps.Count);
-            ops = _dumps.First();
-            Assert.AreEqual(3, ops.Count);
+            Assert.AreEqual(StoreCount, _dumps.Count);
+            foreach (var ops in _dumps)
+            {
+                Assert.AreEqual(2 + StoreCount, ops.Count);
 
-            Assert.AreEqual(1, ops.Count(op => op.Type == OperationType.Delete && Cache1.Equals(op.CacheName) && 1.Equals(op.Key)));
-            Assert.AreEqual(1, ops.Count(op => op.Type == OperationType.Delete && Cache2.Equals(op.CacheName) && 2.Equals(op.Key)));
-            Assert.AreEqual(1, ops.Count(op => op.Type == OperationType.SesEnd && op.Commit));
+                Assert.AreEqual(1, ops.Count(op => op.Type == OperationType.Delete
+                                                   && Cache1 == op.CacheName && 1 == op.Key));
+                Assert.AreEqual(1, ops.Count(op => op.Type == OperationType.Delete
+                                                   && Cache2 == op.CacheName && 2 == op.Key));
+                Assert.AreEqual(StoreCount, ops.Count(op => op.Type == OperationType.SesEnd && op.Commit));
+            }
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/c1a3b374/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestCodeConfig.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestCodeConfig.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestCodeConfig.cs
new file mode 100644
index 0000000..0b5f474
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestCodeConfig.cs
@@ -0,0 +1,68 @@
+/*
+ * 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.Tests.Cache.Store
+{
+    using Apache.Ignite.Core.Cache.Configuration;
+    using Apache.Ignite.Core.Cache.Store;
+    using Apache.Ignite.Core.Common;
+    using NUnit.Framework;
+
+    /// <summary>
+    /// Tests store session with programmatic configuration (uses different store factory on Java side).
+    /// </summary>
+    [TestFixture]
+    public class CacheStoreSessionTestCodeConfig : CacheStoreSessionTest
+    {
+        /** <inheritdoc /> */
+        protected override IgniteConfiguration GetIgniteConfiguration()
+        {
+            return new IgniteConfiguration(TestUtils.GetTestConfiguration())
+            {
+                CacheConfiguration = new[]
+                {
+                    new CacheConfiguration(Cache1)
+                    {
+                        AtomicityMode = CacheAtomicityMode.Transactional,
+                        ReadThrough = true,
+                        WriteThrough = true,
+                        CacheStoreFactory = new StoreFactory()
+                    },
+                    new CacheConfiguration(Cache2)
+                    {
+                        AtomicityMode = CacheAtomicityMode.Transactional,
+                        ReadThrough = true,
+                        WriteThrough = true,
+                        CacheStoreFactory = new StoreFactory()
+                    }
+                }
+            };
+        }
+
+        /// <summary>
+        /// Store factory.
+        /// </summary>
+        private class StoreFactory : IFactory<ICacheStore>
+        {
+            /** <inheritdoc /> */
+            public ICacheStore CreateInstance()
+            {
+                return new Store();
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/c1a3b374/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestSharedFactory.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestSharedFactory.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestSharedFactory.cs
new file mode 100644
index 0000000..2af5915
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreSessionTestSharedFactory.cs
@@ -0,0 +1,48 @@
+/*
+ * 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.Tests.Cache.Store
+{
+    using NUnit.Framework;
+
+    /// <summary>
+    /// Session test with shared PlatformDotNetCacheStoreFactory,
+    /// which causes the same store insance to be used for both caches.
+    /// </summary>
+    [TestFixture]
+    public class CacheStoreSessionTestSharedFactory : CacheStoreSessionTest
+    {
+        /** <inheritdoc /> */
+        protected override IgniteConfiguration GetIgniteConfiguration()
+        {
+            return new IgniteConfiguration(TestUtils.GetTestConfiguration())
+            {
+                SpringConfigUrl = @"config\cache\store\cache-store-session-shared-factory.xml"
+            };
+        }
+
+        /** <inheritdoc /> */
+        protected override int StoreCount
+        {
+            get
+            {
+                // Shared PlatformDotNetCacheStoreFactory results in a single store instance.
+                return 1;
+            }
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/c1a3b374/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
index e05f4bd..d3e4ab6 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/Store/CacheStoreTest.cs
@@ -64,7 +64,15 @@ namespace Apache.Ignite.Core.Tests.Cache.Store
         [TestFixtureTearDown]
         public void AfterTests()
         {
-            Ignition.StopAll(true);
+            try
+            {
+                // 3 stores are expected in HandleRegistry.
+                TestUtils.AssertHandleRegistryHasItems(Ignition.GetIgnite(), 3, 1000);
+            }
+            finally
+            {
+                Ignition.StopAll(true);
+            }
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/c1a3b374/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Cache/Store/cache-store-session-shared-factory.xml
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Cache/Store/cache-store-session-shared-factory.xml b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Cache/Store/cache-store-session-shared-factory.xml
new file mode 100644
index 0000000..05515c4
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Cache/Store/cache-store-session-shared-factory.xml
@@ -0,0 +1,76 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!--
+  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.
+-->
+
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:util="http://www.springframework.org/schema/util"
+       xsi:schemaLocation="
+        http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans.xsd
+        http://www.springframework.org/schema/util
+        http://www.springframework.org/schema/util/spring-util.xsd">
+    <bean id="storeFactory" class="org.apache.ignite.platform.dotnet.PlatformDotNetCacheStoreFactory">
+        <property name="typeName" value="Apache.Ignite.Core.Tests.Cache.Store.CacheStoreSessionTest+Store, Apache.Ignite.Core.Tests"/>
+    </bean>
+  
+    <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
+        <property name="localHost" value="127.0.0.1"/>
+        <property name="connectorConfiguration"><null/></property>
+
+        <property name="cacheConfiguration">
+            <list>
+                <bean class="org.apache.ignite.configuration.CacheConfiguration">
+                    <property name="name" value="cache1"/>
+                    <property name="cacheMode" value="LOCAL"/>
+                    <property name="atomicityMode" value="TRANSACTIONAL"/>
+                    <property name="writeThrough" value="true"/>
+                    <property name="readThrough" value="true"/>
+
+                    <property name="cacheStoreFactory" ref="storeFactory" />
+                </bean>
+
+                <bean class="org.apache.ignite.configuration.CacheConfiguration">
+                    <property name="name" value="cache2"/>
+                    <property name="cacheMode" value="LOCAL"/>
+                    <property name="atomicityMode" value="TRANSACTIONAL"/>
+                    <property name="writeThrough" value="true"/>
+                    <property name="readThrough" value="true"/>
+
+                    <property name="cacheStoreFactory" ref="storeFactory" />
+                </bean>
+            </list>
+        </property>
+
+        <property name="discoverySpi">
+            <bean class="org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi">
+                <property name="ipFinder">
+                    <bean class="org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder">
+                        <property name="addresses">
+                            <list>
+                                <!-- In distributed environment, replace with actual host IP address. -->
+                                <value>127.0.0.1:47500</value>
+                            </list>
+                        </property>
+                    </bean>
+                </property>
+                <property name="socketTimeout" value="300" />
+            </bean>
+        </property>
+    </bean>
+</beans>

http://git-wip-us.apache.org/repos/asf/ignite/blob/c1a3b374/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Cache/Store/cache-store-session.xml
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Cache/Store/cache-store-session.xml b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Cache/Store/cache-store-session.xml
index 3cc9efa..14dc78e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Cache/Store/cache-store-session.xml
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Config/Cache/Store/cache-store-session.xml
@@ -25,18 +25,10 @@
         http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/util
         http://www.springframework.org/schema/util/spring-util.xsd">
-    <bean id="storeFactory" class="org.apache.ignite.platform.dotnet.PlatformDotNetCacheStoreFactory">
-        <property name="typeName" value="Apache.Ignite.Core.Tests.Cache.Store.CacheStoreSessionTest+Store, Apache.Ignite.Core.Tests"/>
-    </bean>
-  
     <bean id="grid.cfg" class="org.apache.ignite.configuration.IgniteConfiguration">
         <property name="localHost" value="127.0.0.1"/>
         <property name="connectorConfiguration"><null/></property>
 
-        <property name="includeEventTypes">
-            <util:constant static-field="org.apache.ignite.events.EventType.EVTS_CACHE"/>
-        </property>
-      
         <property name="cacheConfiguration">
             <list>
                 <bean class="org.apache.ignite.configuration.CacheConfiguration">
@@ -46,7 +38,11 @@
                     <property name="writeThrough" value="true"/>
                     <property name="readThrough" value="true"/>
 
-                    <property name="cacheStoreFactory" ref="storeFactory" />
+                    <property name="cacheStoreFactory">
+                        <bean class="org.apache.ignite.platform.dotnet.PlatformDotNetCacheStoreFactory">
+                            <property name="typeName" value="Apache.Ignite.Core.Tests.Cache.Store.CacheStoreSessionTest+Store, Apache.Ignite.Core.Tests"/>
+                        </bean>
+                    </property>
                 </bean>
 
                 <bean class="org.apache.ignite.configuration.CacheConfiguration">
@@ -56,7 +52,11 @@
                     <property name="writeThrough" value="true"/>
                     <property name="readThrough" value="true"/>
 
-                    <property name="cacheStoreFactory" ref="storeFactory" />
+                    <property name="cacheStoreFactory">
+                        <bean class="org.apache.ignite.platform.dotnet.PlatformDotNetCacheStoreFactory">
+                            <property name="typeName" value="Apache.Ignite.Core.Tests.Cache.Store.CacheStoreSessionTest+Store, Apache.Ignite.Core.Tests"/>
+                        </bean>
+                    </property>
                 </bean>
             </list>
         </property>

http://git-wip-us.apache.org/repos/asf/ignite/blob/c1a3b374/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Store/CacheStoreInternal.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Store/CacheStoreInternal.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Store/CacheStoreInternal.cs
index f147579..df4c1ae 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Store/CacheStoreInternal.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Store/CacheStoreInternal.cs
@@ -111,6 +111,8 @@ namespace Apache.Ignite.Core.Impl.Cache.Store
 
             CacheStoreSession ses = grid.HandleRegistry.Get<CacheStoreSession>(sesId, true);
 
+            // Session cache name may change in cross-cache transaction.
+            // Single session is used for all stores in cross-cache transactions.
             ses.CacheName = rawReader.ReadString();
 
             _sesProxy.SetSession(ses);
@@ -223,11 +225,19 @@ namespace Apache.Ignite.Core.Impl.Cache.Store
                         break;
 
                     case OpSesEnd:
-                        grid.HandleRegistry.Release(sesId);
+                    {
+                        var commit = rawReader.ReadBoolean();
+                        var last = rawReader.ReadBoolean();
 
-                        _store.SessionEnd(rawReader.ReadBoolean());
+                        if (last)
+                        {
+                            grid.HandleRegistry.Release(sesId);
+                        }
+
+                        _store.SessionEnd(commit);
 
                         break;
+                    }
 
                     default:
                         throw new IgniteException("Invalid operation type: " + opType);


[04/50] [abbrv] ignite git commit: IGNITE-4728 Web Console: Saved last succeeded state and redirect to it on reload.

Posted by yz...@apache.org.
IGNITE-4728 Web Console: Saved last succeeded state and redirect to it on reload.


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

Branch: refs/heads/ignite-5658
Commit: 70d0f9918c708cb117e69163cc7b7c119c9a693c
Parents: 23f26af
Author: Dmitriy Shabalin <ds...@gridgain.com>
Authored: Thu Jul 20 15:08:20 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Thu Jul 20 15:08:20 2017 +0700

----------------------------------------------------------------------
 modules/web-console/frontend/app/app.js               | 14 ++++++++++++++
 .../frontend/app/modules/states/errors.state.js       |  6 ++++--
 .../frontend/app/modules/states/signin.state.js       | 10 +++++++++-
 3 files changed, 27 insertions(+), 3 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/70d0f991/modules/web-console/frontend/app/app.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/app.js b/modules/web-console/frontend/app/app.js
index c707810..dc5c6e9 100644
--- a/modules/web-console/frontend/app/app.js
+++ b/modules/web-console/frontend/app/app.js
@@ -289,6 +289,20 @@ angular
     $root.$on('$stateChangeStart', () => {
         _.forEach(angular.element('.modal'), (m) => angular.element(m).scope().$hide());
     });
+
+    if (!$root.IgniteDemoMode) {
+        $root.$on('$stateChangeSuccess', (event, {name, unsaved}, params) => {
+            try {
+                if (unsaved)
+                    localStorage.removeItem('lastStateChangeSuccess');
+                else
+                    localStorage.setItem('lastStateChangeSuccess', JSON.stringify({name, params}));
+            }
+            catch (ignored) {
+                // No-op.
+            }
+        });
+    }
 }])
 .run(['$rootScope', '$http', '$state', 'IgniteMessages', 'User', 'IgniteNotebookData',
     ($root, $http, $state, Messages, User, Notebook) => { // eslint-disable-line no-shadow

http://git-wip-us.apache.org/repos/asf/ignite/blob/70d0f991/modules/web-console/frontend/app/modules/states/errors.state.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/errors.state.js b/modules/web-console/frontend/app/modules/states/errors.state.js
index e816ff8..e3d4d41 100644
--- a/modules/web-console/frontend/app/modules/states/errors.state.js
+++ b/modules/web-console/frontend/app/modules/states/errors.state.js
@@ -31,13 +31,15 @@ angular
                 templateUrl: templateNotFoundPage,
                 metaTags: {
                     title: 'Page not found'
-                }
+                },
+                unsaved: true
             })
             .state('403', {
                 url: '/403',
                 templateUrl: templateNotAuthorizedPage,
                 metaTags: {
                     title: 'Not authorized'
-                }
+                },
+                unsaved: true
             });
     }]);

http://git-wip-us.apache.org/repos/asf/ignite/blob/70d0f991/modules/web-console/frontend/app/modules/states/signin.state.js
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/modules/states/signin.state.js b/modules/web-console/frontend/app/modules/states/signin.state.js
index 5155bde..b7be51d 100644
--- a/modules/web-console/frontend/app/modules/states/signin.state.js
+++ b/modules/web-console/frontend/app/modules/states/signin.state.js
@@ -33,7 +33,15 @@ angular
         resolve: {
             user: ['$state', 'User', ($state, User) => {
                 return User.read()
-                    .then(() => $state.go('base.configuration.tabs'))
+                    .then(() => {
+                        try {
+                            const {name, params} = JSON.parse(localStorage.getItem('lastStateChangeSuccess'));
+
+                            $state.go(name, params);
+                        } catch (ignored) {
+                            $state.go('base.configuration.tabs');
+                        }
+                    })
                     .catch(() => {});
             }]
         },


[19/50] [abbrv] ignite git commit: ignite-2.1.3 Merged with ignite-2.1.2.

Posted by yz...@apache.org.
ignite-2.1.3 Merged with ignite-2.1.2.


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

Branch: refs/heads/ignite-5658
Commit: 03f02d30fda66ed12b3bd8b3af0671fa69b2b298
Parents: abc6e46 e88fcd8
Author: Alexey Kuznetsov <ak...@apache.org>
Authored: Mon Jul 24 13:49:32 2017 +0700
Committer: Alexey Kuznetsov <ak...@apache.org>
Committed: Mon Jul 24 13:49:32 2017 +0700

----------------------------------------------------------------------
 examples/pom.xml              |  7 +++++++
 modules/geospatial/pom.xml    | 24 ++++++++++++++++++++++++
 modules/hibernate-4.2/pom.xml | 24 ++++++++++++++++++++++++
 modules/hibernate-5.1/pom.xml | 24 ++++++++++++++++++++++++
 modules/schedule/pom.xml      | 24 ++++++++++++++++++++++++
 5 files changed, 103 insertions(+)
----------------------------------------------------------------------



[15/50] [abbrv] ignite git commit: Merge branch 'ignite-2.1.3'

Posted by yz...@apache.org.
Merge branch 'ignite-2.1.3'


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

Branch: refs/heads/ignite-5658
Commit: ca496f6e9e48a107abb72a4fea87b5b11da66806
Parents: 0adaf6e c1a3b37
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Fri Jul 21 17:05:10 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Fri Jul 21 17:05:10 2017 +0300

----------------------------------------------------------------------
 .../dht/preloader/GridDhtPartitionMap.java      |  7 +-
 .../wal/FileWriteAheadLogManager.java           | 93 +++++++++++++-------
 .../dotnet/PlatformDotNetCacheStore.java        | 31 +++++++
 .../Apache.Ignite.Core.Tests.csproj             |  5 ++
 .../Cache/Store/CacheStoreSessionTest.cs        | 90 +++++++++++++------
 .../Store/CacheStoreSessionTestCodeConfig.cs    | 68 ++++++++++++++
 .../Store/CacheStoreSessionTestSharedFactory.cs | 48 ++++++++++
 .../Cache/Store/CacheStoreTest.cs               | 10 ++-
 .../cache-store-session-shared-factory.xml      | 76 ++++++++++++++++
 .../Config/Cache/Store/cache-store-session.xml  | 20 ++---
 .../Impl/Cache/Store/CacheStoreInternal.cs      | 14 ++-
 modules/web-console/frontend/app/app.js         | 14 +++
 .../frontend/app/data/pom-dependencies.json     |  5 +-
 .../configuration/generator/Maven.service.js    |  9 +-
 .../frontend/app/modules/states/errors.state.js |  6 +-
 .../frontend/app/modules/states/signin.state.js | 10 ++-
 .../frontend/webpack/webpack.common.js          |  4 +-
 17 files changed, 422 insertions(+), 88 deletions(-)
----------------------------------------------------------------------



[08/50] [abbrv] ignite git commit: Assembly procedure fix

Posted by yz...@apache.org.
Assembly procedure fix


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

Branch: refs/heads/ignite-5658
Commit: db43b0c40161f8756ab5cad0c1b4b404f0743d8f
Parents: bd7a08e
Author: Anton Vinogradov <av...@apache.org>
Authored: Thu Jul 20 14:58:09 2017 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Thu Jul 20 14:58:09 2017 +0300

----------------------------------------------------------------------
 DEVNOTES.txt | 18 +++++++++---------
 1 file changed, 9 insertions(+), 9 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/db43b0c4/DEVNOTES.txt
----------------------------------------------------------------------
diff --git a/DEVNOTES.txt b/DEVNOTES.txt
index 8a689b8..340153e 100644
--- a/DEVNOTES.txt
+++ b/DEVNOTES.txt
@@ -2,14 +2,14 @@ Ignite Fabric Maven Build Instructions
 ======================================
 1) Optional: build Apache Ignite.NET as described at modules/platforms/dotnet/DEVNOTES.txt.
 
-2) Compile and package:
+2) Compile and install:
 
-  mvn clean package -Pall-java,all-scala,licenses -DskipTests
+  mvn clean install -Pall-java,all-scala,licenses -DskipTests
 
   or if you have built Apache Ignite.NET on the first step use following command:
   (Note that 'doxygen' should be installed before running this command.)
 
-  mvn clean package -Pall-java,all-scala,licenses -DskipTests -DclientDocs
+  mvn clean install -Pall-java,all-scala,licenses -DskipTests -DclientDocs
 
 3) Javadoc generation (optional):
 
@@ -25,14 +25,14 @@ Ignite Fabric with LGPL Maven Build Instructions
 ======================================
 1) Optional: build Apache Ignite.NET as described at modules/platforms/dotnet/DEVNOTES.txt.
 
-2) Compile and package:
+2) Compile and install:
 
-  mvn clean package -Pall-java,all-scala,licenses -DskipTests
+  mvn clean install -Pall-java,all-scala,licenses -DskipTests
 
   or if you have built Apache Ignite.NET on the first step use following command:
   (Note that 'doxygen' should be installed before running this command.)
 
-  mvn clean package -Pall-java,all-scala,licenses -DskipTests -DclientDocs
+  mvn clean install -Pall-java,all-scala,licenses -DskipTests -DclientDocs
 
 3) Javadoc generation with LGPL (optional):
 
@@ -46,15 +46,15 @@ Look for apache-ignite-fabric-lgpl-<version>-bin.zip in ./target/bin directory.
 
 Ignite Hadoop Accelerator Maven Build Instructions
 ============================================
-1) Compile and package:
+1) Compile and install:
 
-    mvn clean package -Pall-java,all-scala,licenses -DskipTests
+    mvn clean install -Pall-java,all-scala,licenses -DskipTests
 
 Use 'hadoop.version' parameter to build Ignite against a specific Hadoop version.
 Use 'spark.version' parameter to build ignite-spark module for a specific Spark version. Version should be >= 2.0.0.
 For example:
 
-    mvn clean package -Pall-java,all-scala,licenses -DskipTests -Dhadoop.version=2.4.2 -Dspark.version=2.1.1
+    mvn clean install -Pall-java,all-scala,licenses -DskipTests -Dhadoop.version=2.4.2 -Dspark.version=2.1.1
 
 2) Assembly Hadoop Accelerator:
   mvn initialize -Prelease -Dignite.edition=hadoop


[03/50] [abbrv] ignite git commit: IGNITE-5781 Visor throws ClassCastException if cache store implementation is other than CacheJdbcPojoStore

Posted by yz...@apache.org.
IGNITE-5781 Visor throws ClassCastException if cache store implementation is other than CacheJdbcPojoStore

Signed-off-by: Konstantin Boudnik <co...@apache.org>


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

Branch: refs/heads/ignite-5658
Commit: 02e2507598598c09ecf3eaa45e5c9b7c4db74152
Parents: cde3da4
Author: Aleksandr_Meterko <al...@epam.com>
Authored: Wed Jul 19 16:55:15 2017 +0400
Committer: Konstantin Boudnik <ko...@epam.com>
Committed: Wed Jul 19 15:16:30 2017 -0700

----------------------------------------------------------------------
 .../org/apache/ignite/internal/visor/cache/VisorCacheJdbcType.java | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/02e25075/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcType.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcType.java b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcType.java
old mode 100644
new mode 100755
index e50402c..a03096f
--- a/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcType.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/visor/cache/VisorCacheJdbcType.java
@@ -64,7 +64,7 @@ public class VisorCacheJdbcType extends VisorDataTransferObject {
     public static List<VisorCacheJdbcType> list(Factory factory) {
         List<VisorCacheJdbcType> res = new ArrayList<>();
 
-        if (factory != null || factory instanceof CacheJdbcPojoStoreFactory) {
+        if (factory instanceof CacheJdbcPojoStoreFactory) {
             CacheJdbcPojoStoreFactory jdbcFactory = (CacheJdbcPojoStoreFactory) factory;
 
             JdbcType[] jdbcTypes = jdbcFactory.getTypes();


[26/50] [abbrv] ignite git commit: IGNITE-5820 Web Console: Adjust modals height.

Posted by yz...@apache.org.
IGNITE-5820 Web Console: Adjust modals height.


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

Branch: refs/heads/ignite-5658
Commit: 2005eec081add6906fa204c4db0cfcc4a4907292
Parents: f277530
Author: Andrey Novikov <an...@gridgain.com>
Authored: Tue Jul 25 15:49:21 2017 +0700
Committer: Andrey Novikov <an...@gridgain.com>
Committed: Tue Jul 25 15:49:21 2017 +0700

----------------------------------------------------------------------
 .../web-console/frontend/app/primitives/modal/index.scss    | 9 +++++++++
 1 file changed, 9 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/2005eec0/modules/web-console/frontend/app/primitives/modal/index.scss
----------------------------------------------------------------------
diff --git a/modules/web-console/frontend/app/primitives/modal/index.scss b/modules/web-console/frontend/app/primitives/modal/index.scss
index 87d8dc3..fcf9885 100644
--- a/modules/web-console/frontend/app/primitives/modal/index.scss
+++ b/modules/web-console/frontend/app/primitives/modal/index.scss
@@ -57,6 +57,15 @@
     transform: translateZ(1px);
 }
 
+.modal .modal-dialog--adjust-height {
+    margin-top: 0;
+    margin-bottom: 0;
+
+    .modal-body {
+        max-height: calc(100vh - 150px);
+    }
+}
+
 .modal .modal-content {
     background-color: $gray-lighter;
 


[29/50] [abbrv] ignite git commit: IGNITE-5770 Refactor PlatformProcessor to PlatformTarget mechanism

Posted by yz...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/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 2aecd59..9b7defd 100644
--- a/modules/platforms/cpp/jni/src/exports.cpp
+++ b/modules/platforms/cpp/jni/src/exports.cpp
@@ -26,12 +26,8 @@ extern "C" {
         return gcj::JniContext::Reallocate(memPtr, cap);
     }
 
-    void* IGNITE_CALL IgniteIgnitionStart(gcj::JniContext* ctx, char* cfgPath, char* name, int factoryId, long long dataPtr) {
-        return ctx->IgnitionStart(cfgPath, name, factoryId, dataPtr);
-    }
-
-	void* IGNITE_CALL IgniteIgnitionInstance(gcj::JniContext* ctx, char* name) {
-        return ctx->IgnitionInstance(name);
+    void IGNITE_CALL IgniteIgnitionStart(gcj::JniContext* ctx, char* cfgPath, char* name, int factoryId, long long dataPtr) {
+        ctx->IgnitionStart(cfgPath, name, factoryId, dataPtr);
     }
 
     long long IGNITE_CALL IgniteIgnitionEnvironmentPointer(gcj::JniContext* ctx, char* name) {
@@ -46,118 +42,10 @@ extern "C" {
         return ctx->IgnitionStopAll(cancel);
     }
 
-    void IGNITE_CALL IgniteProcessorReleaseStart(gcj::JniContext* ctx, void* obj) {
-        return ctx->ProcessorReleaseStart(static_cast<jobject>(obj));
-    }
-
-    void* IGNITE_CALL IgniteProcessorProjection(gcj::JniContext* ctx, void* obj) {
-        return ctx->ProcessorProjection(static_cast<jobject>(obj));
-    }
-
-    void* IGNITE_CALL IgniteProcessorCache(gcj::JniContext* ctx, void* obj, char* name) {
-        return ctx->ProcessorCache(static_cast<jobject>(obj), name);
-    }
-
-    void* IGNITE_CALL IgniteProcessorCreateCache(gcj::JniContext* ctx, void* obj, char* name) {
-        return ctx->ProcessorCreateCache(static_cast<jobject>(obj), name);
-    }
-
-    void* IGNITE_CALL IgniteProcessorGetOrCreateCache(gcj::JniContext* ctx, void* obj, char* name) {
-        return ctx->ProcessorGetOrCreateCache(static_cast<jobject>(obj), name);
-    }
-
-    void* IGNITE_CALL IgniteProcessorCreateCacheFromConfig(gcj::JniContext* ctx, void* obj, long long memPtr) {
-        return ctx->ProcessorCreateCacheFromConfig(static_cast<jobject>(obj), memPtr);
-    }
-
-    void* IGNITE_CALL IgniteProcessorGetOrCreateCacheFromConfig(gcj::JniContext* ctx, void* obj, long long memPtr) {
-        return ctx->ProcessorGetOrCreateCacheFromConfig(static_cast<jobject>(obj), memPtr);
-    }
-
-    void* IGNITE_CALL IgniteProcessorCreateNearCache(gcj::JniContext* ctx, void* obj, char* name, long long memPtr) {
-        return ctx->ProcessorCreateNearCache(static_cast<jobject>(obj), name, memPtr);
-    }
-
-    void* IGNITE_CALL IgniteProcessorGetOrCreateNearCache(gcj::JniContext* ctx, void* obj, char* name, long long memPtr) {
-        return ctx->ProcessorGetOrCreateNearCache(static_cast<jobject>(obj), name, memPtr);
-    }
-
-    void IGNITE_CALL IgniteProcessorDestroyCache(gcj::JniContext* ctx, void* obj, char* name) {
-        ctx->ProcessorDestroyCache(static_cast<jobject>(obj), name);
-    }
-
-    void* IGNITE_CALL IgniteProcessorAffinity(gcj::JniContext* ctx, void* obj, char* name) {
-        return ctx->ProcessorAffinity(static_cast<jobject>(obj), name);
-    }
-
-    void*IGNITE_CALL IgniteProcessorDataStreamer(gcj::JniContext* ctx, void* obj, char* name, bool keepPortable) {
-        return ctx->ProcessorDataStreamer(static_cast<jobject>(obj), name, keepPortable);
-    }
-
-    void* IGNITE_CALL IgniteProcessorTransactions(gcj::JniContext* ctx, void* obj) {
-        return ctx->ProcessorTransactions(static_cast<jobject>(obj));
-    }
-
-    void* IGNITE_CALL IgniteProcessorCompute(gcj::JniContext* ctx, void* obj, void* prj) {
-        return ctx->ProcessorCompute(static_cast<jobject>(obj), static_cast<jobject>(prj));
-    }
-
-    void* IGNITE_CALL IgniteProcessorMessage(gcj::JniContext* ctx, void* obj, void* prj) {
-        return ctx->ProcessorMessage(static_cast<jobject>(obj), static_cast<jobject>(prj));
-    }
-
-    void* IGNITE_CALL IgniteProcessorEvents(gcj::JniContext* ctx, void* obj, void* prj) {
-        return ctx->ProcessorEvents(static_cast<jobject>(obj), static_cast<jobject>(prj));
-    }
-
-    void* IGNITE_CALL IgniteProcessorServices(gcj::JniContext* ctx, void* obj, void* prj) {
-        return ctx->ProcessorServices(static_cast<jobject>(obj), static_cast<jobject>(prj));
-    }
-
-    void* IGNITE_CALL IgniteProcessorExtensions(gcj::JniContext* ctx, void* obj) {
-        return ctx->ProcessorExtensions(static_cast<jobject>(obj));
-    }
-
-    void* IGNITE_CALL IgniteProcessorExtension(gcj::JniContext* ctx, void* obj, int id) {
-        return ctx->ProcessorExtension(static_cast<jobject>(obj), id);
-    }
-
-    void* IGNITE_CALL IgniteProcessorAtomicLong(gcj::JniContext* ctx, void* obj, char* name, long long initVal, bool create) {
-        return ctx->ProcessorAtomicLong(static_cast<jobject>(obj), name, initVal, create);
-    }
-
-    void* IGNITE_CALL IgniteProcessorAtomicSequence(gcj::JniContext* ctx, void* obj, char* name, long long initVal, bool create) {
-        return ctx->ProcessorAtomicSequence(static_cast<jobject>(obj), name, initVal, create);
-    }
-
-    void* IGNITE_CALL IgniteProcessorAtomicReference(gcj::JniContext* ctx, void* obj, char* name, long long memPtr, bool create) {
-        return ctx->ProcessorAtomicReference(static_cast<jobject>(obj), name, memPtr, create);
-    }
-
-	void IGNITE_CALL IgniteProcessorGetIgniteConfiguration(gcj::JniContext* ctx, void* obj, long long memPtr) {
-        return ctx->ProcessorGetIgniteConfiguration(static_cast<jobject>(obj), memPtr);
-    }
-
-	void IGNITE_CALL IgniteProcessorGetCacheNames(gcj::JniContext* ctx, void* obj, long long memPtr) {
-        return ctx->ProcessorGetCacheNames(static_cast<jobject>(obj), memPtr);
-    }
-
     long long IGNITE_CALL IgniteTargetInLongOutLong(gcj::JniContext* ctx, void* obj, int opType, long long val) {
         return ctx->TargetInLongOutLong(static_cast<jobject>(obj), opType, val);
     }
 
-    bool IGNITE_CALL IgniteProcessorLoggerIsLevelEnabled(gcj::JniContext* ctx, void* obj, int level) {
-        return ctx->ProcessorLoggerIsLevelEnabled(static_cast<jobject>(obj), level);
-    }
-
-    void IGNITE_CALL IgniteProcessorLoggerLog(gcj::JniContext* ctx, void* obj, int level, char* message, char* category, char* errorInfo) {
-        ctx->ProcessorLoggerLog(static_cast<jobject>(obj), level, message, category, errorInfo);
-    }
-
-    void* IGNITE_CALL IgniteProcessorBinaryProcessor(gcj::JniContext* ctx, void* obj) {
-        return ctx->ProcessorBinaryProcessor(static_cast<jobject>(obj));
-    }
-
     long long IGNITE_CALL IgniteTargetInStreamOutLong(gcj::JniContext* ctx, void* obj, int opType, long long memPtr) {
         return ctx->TargetInStreamOutLong(static_cast<jobject>(obj), opType, memPtr);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/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 bc6af34..7eadec0 100644
--- a/modules/platforms/cpp/jni/src/java.cpp
+++ b/modules/platforms/cpp/jni/src/java.cpp
@@ -223,32 +223,6 @@ namespace ignite
 
             const char* C_PLATFORM_PROCESSOR = "org/apache/ignite/internal/processors/platform/PlatformProcessor";
             JniMethod M_PLATFORM_PROCESSOR_RELEASE_START = JniMethod("releaseStart", "()V", false);
-            JniMethod M_PLATFORM_PROCESSOR_PROJECTION = JniMethod("projection", "()Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_CACHE = JniMethod("cache", "(Ljava/lang/String;)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_CREATE_CACHE = JniMethod("createCache", "(Ljava/lang/String;)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_GET_OR_CREATE_CACHE = JniMethod("getOrCreateCache", "(Ljava/lang/String;)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_CREATE_CACHE_FROM_CONFIG = JniMethod("createCacheFromConfig", "(J)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_GET_OR_CREATE_CACHE_FROM_CONFIG = JniMethod("getOrCreateCacheFromConfig", "(J)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_CREATE_NEAR_CACHE = JniMethod("createNearCache", "(Ljava/lang/String;J)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_GET_OR_CREATE_NEAR_CACHE = JniMethod("getOrCreateNearCache", "(Ljava/lang/String;J)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_DESTROY_CACHE = JniMethod("destroyCache", "(Ljava/lang/String;)V", false);
-            JniMethod M_PLATFORM_PROCESSOR_AFFINITY = JniMethod("affinity", "(Ljava/lang/String;)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_DATA_STREAMER = JniMethod("dataStreamer", "(Ljava/lang/String;Z)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_TRANSACTIONS = JniMethod("transactions", "()Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_COMPUTE = JniMethod("compute", "(Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_MESSAGE = JniMethod("message", "(Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_EVENTS = JniMethod("events", "(Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_SERVICES = JniMethod("services", "(Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_EXTENSIONS = JniMethod("extensions", "()Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_EXTENSION = JniMethod("extension", "(I)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_ATOMIC_LONG = JniMethod("atomicLong", "(Ljava/lang/String;JZ)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_ATOMIC_SEQUENCE = JniMethod("atomicSequence", "(Ljava/lang/String;JZ)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_ATOMIC_REFERENCE = JniMethod("atomicReference", "(Ljava/lang/String;JZ)Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
-            JniMethod M_PLATFORM_PROCESSOR_GET_IGNITE_CONFIGURATION = JniMethod("getIgniteConfiguration", "(J)V", false);
-            JniMethod M_PLATFORM_PROCESSOR_GET_CACHE_NAMES = JniMethod("getCacheNames", "(J)V", false);
-            JniMethod M_PLATFORM_PROCESSOR_LOGGER_IS_LEVEL_ENABLED = JniMethod("loggerIsLevelEnabled", "(I)Z", false);
-            JniMethod M_PLATFORM_PROCESSOR_LOGGER_LOG = JniMethod("loggerLog", "(ILjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V", false);
-            JniMethod M_PLATFORM_PROCESSOR_BINARY_PROCESSOR = JniMethod("binaryProcessor", "()Lorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;", false);
 
             const char* C_PLATFORM_TARGET = "org/apache/ignite/internal/processors/platform/PlatformTargetProxy";
             JniMethod M_PLATFORM_TARGET_IN_LONG_OUT_LONG = JniMethod("inLongOutLong", "(IJ)J", false);
@@ -262,86 +236,9 @@ namespace ignite
 
             const char* C_PLATFORM_CALLBACK_UTILS = "org/apache/ignite/internal/processors/platform/callback/PlatformCallbackUtils";
 
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_CREATE = JniMethod("cacheStoreCreate", "(JJ)J", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_INVOKE = JniMethod("cacheStoreInvoke", "(JJJ)I", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_DESTROY = JniMethod("cacheStoreDestroy", "(JJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_STORE_SESSION_CREATE = JniMethod("cacheStoreSessionCreate", "(JJ)J", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_CREATE = JniMethod("cacheEntryFilterCreate", "(JJ)J", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_APPLY = JniMethod("cacheEntryFilterApply", "(JJJ)I", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_ENTRY_FILTER_DESTROY = JniMethod("cacheEntryFilterDestroy", "(JJ)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CACHE_INVOKE = JniMethod("cacheInvoke", "(JJJ)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_MAP = JniMethod("computeTaskMap", "(JJJJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_JOB_RESULT = JniMethod("computeTaskJobResult", "(JJJJ)I", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_REDUCE = JniMethod("computeTaskReduce", "(JJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_TASK_COMPLETE = JniMethod("computeTaskComplete", "(JJJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_SERIALIZE = JniMethod("computeJobSerialize", "(JJJ)I", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_CREATE = JniMethod("computeJobCreate", "(JJ)J", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_EXECUTE = JniMethod("computeJobExecute", "(JJIJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_DESTROY = JniMethod("computeJobDestroy", "(JJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_COMPUTE_JOB_CANCEL = JniMethod("computeJobCancel", "(JJ)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_LSNR_APPLY = JniMethod("continuousQueryListenerApply", "(JJJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_CREATE = JniMethod("continuousQueryFilterCreate", "(JJ)J", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_EVAL = JniMethod("continuousQueryFilterApply", "(JJJ)I", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CONTINUOUS_QUERY_FILTER_RELEASE = JniMethod("continuousQueryFilterRelease", "(JJ)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_DATA_STREAMER_TOPOLOGY_UPDATE = JniMethod("dataStreamerTopologyUpdate", "(JJJI)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_DATA_STREAMER_STREAM_RECEIVER_INVOKE = JniMethod("dataStreamerStreamReceiverInvoke", "(JJLorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;JZ)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_BYTE_RES = JniMethod("futureByteResult", "(JJI)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_BOOL_RES = JniMethod("futureBoolResult", "(JJI)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_SHORT_RES = JniMethod("futureShortResult", "(JJI)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_CHAR_RES = JniMethod("futureCharResult", "(JJI)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_INT_RES = JniMethod("futureIntResult", "(JJI)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_FLOAT_RES = JniMethod("futureFloatResult", "(JJF)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_LONG_RES = JniMethod("futureLongResult", "(JJJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_DOUBLE_RES = JniMethod("futureDoubleResult", "(JJD)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_OBJ_RES = JniMethod("futureObjectResult", "(JJJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_NULL_RES = JniMethod("futureNullResult", "(JJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_FUTURE_ERR = JniMethod("futureError", "(JJJ)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_LIFECYCLE_EVENT = JniMethod("lifecycleEvent", "(JJI)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_CREATE = JniMethod("messagingFilterCreate", "(JJ)J", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_APPLY = JniMethod("messagingFilterApply", "(JJJ)I", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_MESSAGING_FILTER_DESTROY = JniMethod("messagingFilterDestroy", "(JJ)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_CREATE = JniMethod("eventFilterCreate", "(JJ)J", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_APPLY = JniMethod("eventFilterApply", "(JJJ)I", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_EVENT_FILTER_DESTROY = JniMethod("eventFilterDestroy", "(JJ)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_SERVICE_INIT = JniMethod("serviceInit", "(JJ)J", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_SERVICE_EXECUTE = JniMethod("serviceExecute", "(JJJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_SERVICE_CANCEL = JniMethod("serviceCancel", "(JJJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_SERVICE_INVOKE_METHOD = JniMethod("serviceInvokeMethod", "(JJJJ)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_CLUSTER_NODE_FILTER_APPLY = JniMethod("clusterNodeFilterApply", "(JJ)I", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_NODE_INFO = JniMethod("nodeInfo", "(JJ)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_MEMORY_REALLOCATE = JniMethod("memoryReallocate", "(JJI)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_ON_START = JniMethod("onStart", "(JLjava/lang/Object;J)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_ON_STOP = JniMethod("onStop", "(J)V", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_EXTENSION_CALLBACK_IN_LONG_OUT_LONG = JniMethod("extensionCallbackInLongOutLong", "(JIJ)J", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_EXTENSION_CALLBACK_IN_LONG_LONG_OUT_LONG = JniMethod("extensionCallbackInLongLongOutLong", "(JIJJ)J", true);
-
-            JniMethod M_PLATFORM_CALLBACK_UTILS_ON_CLIENT_DISCONNECTED = JniMethod("onClientDisconnected", "(J)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_ON_CLIENT_RECONNECTED = JniMethod("onClientReconnected", "(JZ)V", true);
-
             JniMethod M_PLATFORM_CALLBACK_UTILS_LOGGER_LOG = JniMethod("loggerLog", "(JILjava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V", true);
             JniMethod M_PLATFORM_CALLBACK_UTILS_LOGGER_IS_LEVEL_ENABLED = JniMethod("loggerIsLevelEnabled", "(JI)Z", true);
 
-            JniMethod M_PLATFORM_CALLBACK_UTILS_AFFINITY_FUNCTION_INIT = JniMethod("affinityFunctionInit", "(JJLorg/apache/ignite/internal/processors/platform/PlatformTargetProxy;)J", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_AFFINITY_FUNCTION_PARTITION = JniMethod("affinityFunctionPartition", "(JJJ)I", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_AFFINITY_FUNCTION_ASSIGN_PARTITIONS = JniMethod("affinityFunctionAssignPartitions", "(JJJJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_AFFINITY_FUNCTION_REMOVE_NODE = JniMethod("affinityFunctionRemoveNode", "(JJJ)V", true);
-            JniMethod M_PLATFORM_CALLBACK_UTILS_AFFINITY_FUNCTION_DESTROY = JniMethod("affinityFunctionDestroy", "(JJ)V", true);
-
             JniMethod M_PLATFORM_CALLBACK_UTILS_CONSOLE_WRITE = JniMethod("consoleWrite", "(Ljava/lang/String;Z)V", true);
 
             JniMethod M_PLATFORM_CALLBACK_UTILS_IN_LONG_OUT_LONG = JniMethod("inLongOutLong", "(JIJ)J", true);
@@ -353,7 +250,7 @@ namespace ignite
             JniMethod M_PLATFORM_UTILS_GET_FULL_STACK_TRACE = JniMethod("getFullStackTrace", "(Ljava/lang/Throwable;)Ljava/lang/String;", true);
 
             const char* C_PLATFORM_IGNITION = "org/apache/ignite/internal/processors/platform/PlatformIgnition";
-            JniMethod M_PLATFORM_IGNITION_START = JniMethod("start", "(Ljava/lang/String;Ljava/lang/String;IJJ)Lorg/apache/ignite/internal/processors/platform/PlatformProcessor;", true);
+            JniMethod M_PLATFORM_IGNITION_START = JniMethod("start", "(Ljava/lang/String;Ljava/lang/String;IJJ)V", true);
             JniMethod M_PLATFORM_IGNITION_INSTANCE = JniMethod("instance", "(Ljava/lang/String;)Lorg/apache/ignite/internal/processors/platform/PlatformProcessor;", true);
             JniMethod M_PLATFORM_IGNITION_ENVIRONMENT_POINTER = JniMethod("environmentPointer", "(Ljava/lang/String;)J", true);
             JniMethod M_PLATFORM_IGNITION_STOP = JniMethod("stop", "(Ljava/lang/String;Z)Z", true);
@@ -554,32 +451,6 @@ namespace ignite
 
                 c_PlatformProcessor = FindClass(env, C_PLATFORM_PROCESSOR);
                 m_PlatformProcessor_releaseStart = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_RELEASE_START);
-                m_PlatformProcessor_cache = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_CACHE);
-                m_PlatformProcessor_createCache = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_CREATE_CACHE);
-                m_PlatformProcessor_getOrCreateCache = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_GET_OR_CREATE_CACHE);
-                m_PlatformProcessor_createCacheFromConfig = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_CREATE_CACHE_FROM_CONFIG);
-                m_PlatformProcessor_getOrCreateCacheFromConfig = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_GET_OR_CREATE_CACHE_FROM_CONFIG);
-                m_PlatformProcessor_createNearCache = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_CREATE_NEAR_CACHE);
-                m_PlatformProcessor_getOrCreateNearCache = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_GET_OR_CREATE_NEAR_CACHE);
-                m_PlatformProcessor_destroyCache = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_DESTROY_CACHE);
-                m_PlatformProcessor_affinity = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_AFFINITY);
-                m_PlatformProcessor_dataStreamer = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_DATA_STREAMER);
-                m_PlatformProcessor_transactions = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_TRANSACTIONS);
-                m_PlatformProcessor_projection = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_PROJECTION);
-                m_PlatformProcessor_compute = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_COMPUTE);
-                m_PlatformProcessor_message = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_MESSAGE);
-                m_PlatformProcessor_events = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_EVENTS);
-                m_PlatformProcessor_services = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_SERVICES);
-                m_PlatformProcessor_extensions = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_EXTENSIONS);
-                m_PlatformProcessor_extension = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_EXTENSION);
-                m_PlatformProcessor_atomicLong = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_ATOMIC_LONG);
-                m_PlatformProcessor_atomicSequence = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_ATOMIC_SEQUENCE);
-                m_PlatformProcessor_atomicReference = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_ATOMIC_REFERENCE);
-				m_PlatformProcessor_getIgniteConfiguration = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_GET_IGNITE_CONFIGURATION);
-				m_PlatformProcessor_getCacheNames = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_GET_CACHE_NAMES);
-				m_PlatformProcessor_loggerIsLevelEnabled = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_LOGGER_IS_LEVEL_ENABLED);
-				m_PlatformProcessor_loggerLog = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_LOGGER_LOG);
-				m_PlatformProcessor_binaryProcessor = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_BINARY_PROCESSOR);
 
                 c_PlatformTarget = FindClass(env, C_PLATFORM_TARGET);
                 m_PlatformTarget_inLongOutLong = FindMethod(env, c_PlatformTarget, M_PLATFORM_TARGET_IN_LONG_OUT_LONG);
@@ -871,18 +742,18 @@ namespace ignite
                 }
             }
 
-            jobject JniContext::IgnitionStart(char* cfgPath, char* name, int factoryId, long long dataPtr) {
+            void JniContext::IgnitionStart(char* cfgPath, char* name, int factoryId, long long dataPtr) {
                 return IgnitionStart(cfgPath, name, factoryId, dataPtr, NULL);
             }
 
-            jobject JniContext::IgnitionStart(char* cfgPath, char* name, int factoryId, long long dataPtr, JniErrorInfo* errInfo)
+            void JniContext::IgnitionStart(char* cfgPath, char* name, int factoryId, long long dataPtr, JniErrorInfo* errInfo)
             {
                 JNIEnv* env = Attach();
 
                 jstring cfgPath0 = env->NewStringUTF(cfgPath);
                 jstring name0 = env->NewStringUTF(name);
 
-                jobject interop = env->CallStaticObjectMethod(
+                env->CallStaticVoidMethod(
                     jvm->GetMembers().c_PlatformIgnition,
                     jvm->GetMembers().m_PlatformIgnition_start,
                     cfgPath0,
@@ -893,30 +764,8 @@ namespace ignite
                 );
 
                 ExceptionCheck(env, errInfo);
-
-                return LocalToGlobal(env, interop);
-            }
-
-
-            jobject JniContext::IgnitionInstance(char* name)
-            {
-                return IgnitionInstance(name, NULL);
-            }
-
-            jobject JniContext::IgnitionInstance(char* name, JniErrorInfo* errInfo)
-            {
-                JNIEnv* env = Attach();
-
-                jstring name0 = env->NewStringUTF(name);
-
-                jobject interop = env->CallStaticObjectMethod(jvm->GetMembers().c_PlatformIgnition,
-                    jvm->GetMembers().m_PlatformIgnition_instance, name0);
-
-                ExceptionCheck(env, errInfo);
-
-                return LocalToGlobal(env, interop);
             }
-
+            
             long long JniContext::IgnitionEnvironmentPointer(char* name)
             {
                 return IgnitionEnvironmentPointer(name, NULL);
@@ -970,318 +819,6 @@ namespace ignite
                 ExceptionCheck(env, errInfo);
             }
 
-            void JniContext::ProcessorReleaseStart(jobject obj) {
-                JNIEnv* env = Attach();
-
-                env->CallVoidMethod(obj, jvm->GetMembers().m_PlatformProcessor_releaseStart);
-
-                ExceptionCheck(env);
-            }
-
-            jobject JniContext::ProcessorProjection(jobject obj, JniErrorInfo* errInfo) {
-                JNIEnv* env = Attach();
-
-                jobject prj = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_projection);
-
-                ExceptionCheck(env, errInfo);
-
-                return LocalToGlobal(env, prj);
-            }
-
-            jobject JniContext::ProcessorCache0(jobject obj, const char* name, jmethodID mthd, JniErrorInfo* errInfo)
-            {
-                JNIEnv* env = Attach();
-
-                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
-
-                jobject cache = env->CallObjectMethod(obj, mthd, name0);
-
-                if (name0)
-                    env->DeleteLocalRef(name0);
-
-                ExceptionCheck(env, errInfo);
-
-                return LocalToGlobal(env, cache);
-            }
-
-            jobject JniContext::ProcessorCacheFromConfig0(jobject obj, long long memPtr, jmethodID mthd, JniErrorInfo* errInfo)
-            {
-                JNIEnv* env = Attach();
-
-                jobject cache = env->CallObjectMethod(obj, mthd, memPtr);
-
-                ExceptionCheck(env, errInfo);
-
-                return LocalToGlobal(env, cache);
-            }
-
-            jobject JniContext::ProcessorCache(jobject obj, const char* name) {
-                return ProcessorCache(obj, name, NULL);
-            }
-
-            jobject JniContext::ProcessorCache(jobject obj, const char* name, JniErrorInfo* errInfo) {
-                return ProcessorCache0(obj, name, jvm->GetMembers().m_PlatformProcessor_cache, errInfo);
-            }
-
-            jobject JniContext::ProcessorCreateCache(jobject obj, const char* name) {
-                return ProcessorCreateCache(obj, name, NULL);
-            }
-
-            jobject JniContext::ProcessorCreateCache(jobject obj, const char* name, JniErrorInfo* errInfo)
-            {
-                return ProcessorCache0(obj, name, jvm->GetMembers().m_PlatformProcessor_createCache, errInfo);
-            }
-
-            jobject JniContext::ProcessorGetOrCreateCache(jobject obj, const char* name) {
-                return ProcessorGetOrCreateCache(obj, name, NULL);
-            }
-
-            jobject JniContext::ProcessorGetOrCreateCache(jobject obj, const char* name, JniErrorInfo* errInfo)
-            {
-                return ProcessorCache0(obj, name, jvm->GetMembers().m_PlatformProcessor_getOrCreateCache, errInfo);
-            }
-
-            void JniContext::ProcessorDestroyCache(jobject obj, const char* name) {
-                ProcessorDestroyCache(obj, name, NULL);
-            }
-
-            void JniContext::ProcessorDestroyCache(jobject obj, const char* name, JniErrorInfo* errInfo)
-            {
-                JNIEnv* env = Attach();
-
-                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
-
-                env->CallVoidMethod(obj, jvm->GetMembers().m_PlatformProcessor_destroyCache, name0);
-
-                if (name0)
-                    env->DeleteLocalRef(name0);
-
-                ExceptionCheck(env, errInfo);
-            }
-
-            jobject JniContext::ProcessorCreateCacheFromConfig(jobject obj, long long memPtr) {
-                return ProcessorCreateCacheFromConfig(obj, memPtr, NULL);
-            }
-
-            jobject JniContext::ProcessorCreateCacheFromConfig(jobject obj, long long memPtr, JniErrorInfo* errInfo)
-            {
-                return ProcessorCacheFromConfig0(obj, memPtr, jvm->GetMembers().m_PlatformProcessor_createCacheFromConfig, errInfo);
-            }
-
-            jobject JniContext::ProcessorGetOrCreateCacheFromConfig(jobject obj, long long memPtr) {
-                return ProcessorGetOrCreateCacheFromConfig(obj, memPtr, NULL);
-            }
-
-            jobject JniContext::ProcessorGetOrCreateCacheFromConfig(jobject obj, long long memPtr, JniErrorInfo* errInfo)
-            {
-                return ProcessorCacheFromConfig0(obj, memPtr, jvm->GetMembers().m_PlatformProcessor_getOrCreateCacheFromConfig, errInfo);
-            }
-
-            jobject JniContext::ProcessorCreateNearCache(jobject obj, const char* name, long long memPtr)
-            {
-                return ProcessorGetOrCreateNearCache0(obj, name, memPtr, jvm->GetMembers().m_PlatformProcessor_createNearCache);
-            }
-
-            jobject JniContext::ProcessorGetOrCreateNearCache(jobject obj, const char* name, long long memPtr)
-            {
-                return ProcessorGetOrCreateNearCache0(obj, name, memPtr, jvm->GetMembers().m_PlatformProcessor_getOrCreateNearCache);
-            }
-
-            jobject JniContext::ProcessorGetOrCreateNearCache0(jobject obj, const char* name, long long memPtr, jmethodID methodID)
-            {
-                JNIEnv* env = Attach();
-
-                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
-
-                jobject cache = env->CallObjectMethod(obj, methodID, name0, memPtr);
-
-                if (name0)
-                    env->DeleteLocalRef(name0);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, cache);
-            }
-
-            jobject JniContext::ProcessorAffinity(jobject obj, const char* name) {
-                JNIEnv* env = Attach();
-
-                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
-
-                jobject aff = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_affinity, name0);
-
-                if (name0)
-                    env->DeleteLocalRef(name0);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, aff);
-            }
-
-            jobject JniContext::ProcessorDataStreamer(jobject obj, const char* name, bool keepPortable) {
-                JNIEnv* env = Attach();
-
-                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
-
-                jobject ldr = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_dataStreamer, name0,
-                    keepPortable);
-
-                if (name0)
-                    env->DeleteLocalRef(name0);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, ldr);
-            }
-
-            jobject JniContext::ProcessorTransactions(jobject obj, JniErrorInfo* errInfo) {
-                JNIEnv* env = Attach();
-
-                jobject tx = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_transactions);
-
-                ExceptionCheck(env, errInfo);
-
-                return LocalToGlobal(env, tx);
-            }
-
-            jobject JniContext::ProcessorCompute(jobject obj, jobject prj) {
-                JNIEnv* env = Attach();
-
-                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_compute, prj);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, res);
-            }
-
-            jobject JniContext::ProcessorCompute(jobject obj, jobject prj, JniErrorInfo* errInfo) {
-                JNIEnv* env = Attach();
-
-                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_compute, prj);
-
-                ExceptionCheck(env, errInfo);
-
-                return LocalToGlobal(env, res);
-            }
-
-            jobject JniContext::ProcessorMessage(jobject obj, jobject prj) {
-                JNIEnv* env = Attach();
-
-                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_message, prj);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, res);
-            }
-
-            jobject JniContext::ProcessorEvents(jobject obj, jobject prj) {
-                JNIEnv* env = Attach();
-
-                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_events, prj);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, res);
-            }
-
-            jobject JniContext::ProcessorServices(jobject obj, jobject prj) {
-                JNIEnv* env = Attach();
-
-                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_services, prj);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, res);
-            }
-
-            jobject JniContext::ProcessorExtensions(jobject obj)
-            {
-                JNIEnv* env = Attach();
-
-                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_extensions);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, res);
-            }
-
-            jobject JniContext::ProcessorExtension(jobject obj, int id)
-            {
-                JNIEnv* env = Attach();
-
-                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_extension, id);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, res);
-            }
-
-            jobject JniContext::ProcessorAtomicLong(jobject obj, char* name, long long initVal, bool create)
-            {
-                JNIEnv* env = Attach();
-
-                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
-
-                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_atomicLong, name0, initVal, create);
-
-                if (name0)
-                    env->DeleteLocalRef(name0);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, res);
-            }
-
-            jobject JniContext::ProcessorAtomicSequence(jobject obj, char* name, long long initVal, bool create)
-            {
-                JNIEnv* env = Attach();
-
-                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
-
-                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_atomicSequence, name0, initVal, create);
-
-                if (name0)
-                    env->DeleteLocalRef(name0);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, res);
-            }
-
-            jobject JniContext::ProcessorAtomicReference(jobject obj, char* name, long long memPtr, bool create)
-            {
-                JNIEnv* env = Attach();
-
-                jstring name0 = name != NULL ? env->NewStringUTF(name) : NULL;
-
-                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_atomicReference, name0, memPtr, create);
-
-                if (name0)
-                    env->DeleteLocalRef(name0);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, res);
-            }
-
-            void JniContext::ProcessorGetIgniteConfiguration(jobject obj, long long memPtr)
-            {
-                JNIEnv* env = Attach();
-
-                env->CallVoidMethod(obj, jvm->GetMembers().m_PlatformProcessor_getIgniteConfiguration, memPtr);
-
-                ExceptionCheck(env);
-            }
-
-            void JniContext::ProcessorGetCacheNames(jobject obj, long long memPtr)
-            {
-                JNIEnv* env = Attach();
-
-                env->CallVoidMethod(obj, jvm->GetMembers().m_PlatformProcessor_getCacheNames, memPtr);
-
-                ExceptionCheck(env);
-            }
-
             long long JniContext::TargetInLongOutLong(jobject obj, int opType, long long val, JniErrorInfo* err) {
                 JNIEnv* env = Attach();
 
@@ -1292,51 +829,6 @@ namespace ignite
                 return res;
             }
 
-            bool JniContext::ProcessorLoggerIsLevelEnabled(jobject obj, int level)
-            {
-                JNIEnv* env = Attach();
-
-                jboolean res = env->CallBooleanMethod(obj, jvm->GetMembers().m_PlatformProcessor_loggerIsLevelEnabled, level);
-
-                ExceptionCheck(env);
-
-                return res != 0;
-            }
-
-            void JniContext::ProcessorLoggerLog(jobject obj, int level, char* message, char* category, char* errorInfo)
-            {
-                JNIEnv* env = Attach();
-
-                jstring message0 = message != NULL ? env->NewStringUTF(message) : NULL;
-                jstring category0 = category != NULL ? env->NewStringUTF(category) : NULL;
-                jstring errorInfo0 = errorInfo != NULL ? env->NewStringUTF(errorInfo) : NULL;
-
-
-                env->CallVoidMethod(obj, jvm->GetMembers().m_PlatformProcessor_loggerLog, level, message0, category0, errorInfo0);
-
-                if (message0)
-                    env->DeleteLocalRef(message0);
-
-                if (category0)
-                    env->DeleteLocalRef(category0);
-
-                if (errorInfo0)
-                    env->DeleteLocalRef(errorInfo0);
-
-                ExceptionCheck(env);
-            }
-
-            jobject JniContext::ProcessorBinaryProcessor(jobject obj)
-            {
-                JNIEnv* env = Attach();
-
-                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformProcessor_binaryProcessor);
-
-                ExceptionCheck(env);
-
-                return LocalToGlobal(env, res);
-            }
-
             long long JniContext::TargetInStreamOutLong(jobject obj, int opType, long long memPtr, JniErrorInfo* err) {
                 JNIEnv* env = Attach();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/dotnet/Apache.Ignite.Core/Ignition.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Ignition.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Ignition.cs
index c5d056d..44ebef3 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Ignition.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Ignition.cs
@@ -253,7 +253,9 @@ namespace Apache.Ignite.Core
 
                     var javaLogger = log as JavaLogger;
                     if (javaLogger != null)
-                        javaLogger.SetProcessor(interopProc);
+                    {
+                        javaLogger.SetIgnite(node);
+                    }
 
                     // 6. On-start callback (notify lifecycle components).
                     node.OnStart();
@@ -291,10 +293,14 @@ namespace Apache.Ignite.Core
                 }
                 finally
                 {
+                    var ignite = _startup.Ignite;
+
                     _startup = null;
 
-                    if (interopProc != null)
-                        UU.ProcessorReleaseStart(interopProc);
+                    if (ignite != null)
+                    {
+                        ignite.ProcessorReleaseStart();
+                    }
                 }
             }
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs
index b1bf5eb..e6b2408 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs
@@ -1166,7 +1166,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         {
             if (loc)
             {
-                var target = DoOutOpObject((int) CacheOp.LocIterator, w => w.WriteInt(peekModes));
+                var target = DoOutOpObject((int) CacheOp.LocIterator, (IBinaryStream s) => s.WriteInt(peekModes));
 
                 return new CacheEnumerator<TK, TV>(target, Marshaller, _flagKeepBinary);
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/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 6e07b78..30afe57 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs
@@ -135,6 +135,18 @@ namespace Apache.Ignite.Core.Impl.Cluster
         /** */
         private const int OpGetPersistentStoreMetrics = 30;
 
+        /** */
+        private const int OpGetCompute = 31;
+
+        /** */
+        private const int OpGetMessaging = 32;
+
+        /** */
+        private const int OpGetEvents = 33;
+
+        /** */
+        private const int OpGetServices = 34;
+
         /** Initial Ignite instance. */
         private readonly Ignite _ignite;
         
@@ -147,17 +159,14 @@ namespace Apache.Ignite.Core.Impl.Cluster
         /** Nodes for the given topology version. */
         private volatile IList<IClusterNode> _nodes;
 
-        /** Processor. */
-        private readonly IUnmanagedTarget _proc;
-
         /** Compute. */
-        private readonly Lazy<Compute> _comp;
+        private readonly Lazy<ICompute> _comp;
 
         /** Messaging. */
-        private readonly Lazy<Messaging> _msg;
+        private readonly Lazy<IMessaging> _msg;
 
         /** Events. */
-        private readonly Lazy<Events> _events;
+        private readonly Lazy<IEvents> _events;
 
         /** Services. */
         private readonly Lazy<IServices> _services;
@@ -165,29 +174,20 @@ namespace Apache.Ignite.Core.Impl.Cluster
         /// <summary>
         /// Constructor.
         /// </summary>
-        /// <param name="proc">Processor.</param>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
         /// <param name="ignite">Grid.</param>
         /// <param name="pred">Predicate.</param>
         [SuppressMessage("Microsoft.Performance", "CA1805:DoNotInitializeUnnecessarily")]
-        public ClusterGroupImpl(IUnmanagedTarget proc, IUnmanagedTarget target, Marshaller marsh,
-            Ignite ignite, Func<IClusterNode, bool> pred)
-            : base(target, marsh)
+        public ClusterGroupImpl(IUnmanagedTarget target, Ignite ignite, Func<IClusterNode, bool> pred)
+            : base(target, ignite.Marshaller)
         {
-            _proc = proc;
             _ignite = ignite;
             _pred = pred;
 
-            _comp = new Lazy<Compute>(() => 
-                new Compute(new ComputeImpl(UU.ProcessorCompute(proc, target), marsh, this, false)));
-
-            _msg = new Lazy<Messaging>(() => new Messaging(UU.ProcessorMessage(proc, target), marsh, this));
-
-            _events = new Lazy<Events>(() => new Events(UU.ProcessorEvents(proc, target), marsh, this));
-
-            _services = new Lazy<IServices>(() => 
-                new Services(UU.ProcessorServices(proc, target), marsh, this, false, false));
+            _comp = new Lazy<ICompute>(() => CreateCompute());
+            _msg = new Lazy<IMessaging>(() => CreateMessaging());
+            _events = new Lazy<IEvents>(() => CreateEvents());
+            _services = new Lazy<IServices>(() => CreateServices());
         }
 
         /** <inheritDoc /> */
@@ -202,6 +202,14 @@ namespace Apache.Ignite.Core.Impl.Cluster
             return _comp.Value;
         }
 
+        /// <summary>
+        /// Creates the compute.
+        /// </summary>
+        private ICompute CreateCompute()
+        {
+            return new Compute(new ComputeImpl(DoOutOpObject(OpGetCompute), Marshaller, this, false));
+        }
+
         /** <inheritDoc /> */
         public IClusterGroup ForNodes(IEnumerable<IClusterNode> nodes)
         {
@@ -257,7 +265,7 @@ namespace Apache.Ignite.Core.Impl.Cluster
         {
             var newPred = _pred == null ? p : node => _pred(node) && p(node);
 
-            return new ClusterGroupImpl(_proc, Target, Marshaller, _ignite, newPred);
+            return new ClusterGroupImpl(Target, _ignite, newPred);
         }
 
         /** <inheritDoc /> */
@@ -413,12 +421,28 @@ namespace Apache.Ignite.Core.Impl.Cluster
             return _msg.Value;
         }
 
+        /// <summary>
+        /// Creates the messaging.
+        /// </summary>
+        private IMessaging CreateMessaging()
+        {
+            return new Messaging(DoOutOpObject(OpGetMessaging), Marshaller, this);
+        }
+
         /** <inheritDoc /> */
         public IEvents GetEvents()
         {
             return _events.Value;
         }
 
+        /// <summary>
+        /// Creates the events.
+        /// </summary>
+        private IEvents CreateEvents()
+        {
+            return new Events(DoOutOpObject(OpGetEvents), Marshaller, this);
+        }
+
         /** <inheritDoc /> */
         public IServices GetServices()
         {
@@ -426,6 +450,14 @@ namespace Apache.Ignite.Core.Impl.Cluster
         }
 
         /// <summary>
+        /// Creates the services.
+        /// </summary>
+        private IServices CreateServices()
+        {
+            return new Services(DoOutOpObject(OpGetServices), Marshaller, this, false, false);
+        }
+
+        /// <summary>
         /// Pings a remote node.
         /// </summary>
         /// <param name="nodeId">ID of a node to ping.</param>
@@ -635,7 +667,7 @@ namespace Apache.Ignite.Core.Impl.Cluster
         /// <returns>New cluster group.</returns>
         private IClusterGroup GetClusterGroup(IUnmanagedTarget prj)
         {
-            return new ClusterGroupImpl(_proc, prj, Marshaller, _ignite, _pred);
+            return new ClusterGroupImpl(prj, _ignite, _pred);
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/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 7a028cd..cace7b2 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeImpl.cs
@@ -186,10 +186,10 @@ namespace Apache.Ignite.Core.Impl.Compute
 
             long ptr = Marshaller.Ignite.HandleRegistry.Allocate(holder);
 
-            var futTarget = DoOutOpObject(OpExecNative, w =>
+            var futTarget = DoOutOpObject(OpExecNative, (IBinaryStream s) =>
             {
-                w.WriteLong(ptr);
-                w.WriteLong(_prj.TopologyVersion);
+                s.WriteLong(ptr);
+                s.WriteLong(_prj.TopologyVersion);
             });
 
             var future = holder.Future;

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/DataStreamerImpl.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/DataStreamerImpl.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/DataStreamerImpl.cs
index b9e3030..96e58d4 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/DataStreamerImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/DataStreamerImpl.cs
@@ -547,8 +547,7 @@ namespace Apache.Ignite.Core.Impl.Datastream
                 return result;
             }
 
-            return new DataStreamerImpl<TK1, TV1>(UU.ProcessorDataStreamer(Marshaller.Ignite.InteropProcessor,
-                _cacheName, true), Marshaller, _cacheName, true);
+            return Marshaller.Ignite.GetDataStreamer<TK1, TV1>(_cacheName, true);
         }
 
         /** <inheritDoc /> */

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/StreamReceiverHolder.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/StreamReceiverHolder.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/StreamReceiverHolder.cs
index 953ddb6..c91334d 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/StreamReceiverHolder.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/StreamReceiverHolder.cs
@@ -138,7 +138,7 @@ namespace Apache.Ignite.Core.Impl.Datastream
             for (var i = 0; i < size; i++)
                 entries.Add(new CacheEntry<TK, TV>(reader.ReadObject<TK>(), reader.ReadObject<TV>()));
 
-            receiver.Receive(grid.Cache<TK, TV>(cache, keepBinary), entries);
+            receiver.Receive(grid.GetCache<TK, TV>(cache, keepBinary), entries);
         }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/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 205f6e2..715776e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Ignite.cs
@@ -42,6 +42,7 @@ namespace Apache.Ignite.Core.Impl
     using Apache.Ignite.Core.Impl.Plugin;
     using Apache.Ignite.Core.Impl.Transactions;
     using Apache.Ignite.Core.Impl.Unmanaged;
+    using Apache.Ignite.Core.Interop;
     using Apache.Ignite.Core.Lifecycle;
     using Apache.Ignite.Core.Log;
     using Apache.Ignite.Core.Messaging;
@@ -53,8 +54,37 @@ namespace Apache.Ignite.Core.Impl
     /// <summary>
     /// Native Ignite wrapper.
     /// </summary>
-    internal class Ignite : IIgnite, ICluster
+    internal class Ignite : PlatformTarget, IIgnite, ICluster
     {
+        /// <summary>
+        /// Operation codes for PlatformProcessorImpl calls.
+        /// </summary>
+        private enum Op
+        {
+            GetCache = 1,
+            CreateCache = 2,
+            GetOrCreateCache = 3,
+            CreateCacheFromConfig = 4,
+            GetOrCreateCacheFromConfig = 5,
+            DestroyCache = 6,
+            GetAffinity = 7,
+            GetDataStreamer = 8,
+            GetTransactions = 9,
+            GetClusterGroup = 10,
+            GetExtension = 11,
+            GetAtomicLong = 12,
+            GetAtomicReference = 13,
+            GetAtomicSequence = 14,
+            GetIgniteConfiguration = 15,
+            GetCacheNames = 16,
+            CreateNearCache = 17,
+            GetOrCreateNearCache = 18,
+            LoggerIsLevelEnabled = 19,
+            LoggerLog = 20,
+            GetBinaryProcessor = 21,
+            ReleaseStart = 22
+        }
+
         /** */
         private readonly IgniteConfiguration _cfg;
 
@@ -109,7 +139,7 @@ namespace Apache.Ignite.Core.Impl
         /// <param name="lifecycleHandlers">Lifecycle beans.</param>
         /// <param name="cbs">Callbacks.</param>
         public Ignite(IgniteConfiguration cfg, string name, IUnmanagedTarget proc, Marshaller marsh,
-            IList<LifecycleHandlerHolder> lifecycleHandlers, UnmanagedCallbacks cbs)
+            IList<LifecycleHandlerHolder> lifecycleHandlers, UnmanagedCallbacks cbs) : base(proc, marsh)
         {
             Debug.Assert(cfg != null);
             Debug.Assert(proc != null);
@@ -126,17 +156,17 @@ namespace Apache.Ignite.Core.Impl
 
             marsh.Ignite = this;
 
-            _prj = new ClusterGroupImpl(proc, UU.ProcessorProjection(proc), marsh, this, null);
+            _prj = new ClusterGroupImpl(DoOutOpObject((int) Op.GetClusterGroup), this, null);
 
             _binary = new Binary.Binary(marsh);
 
-            _binaryProc = new BinaryProcessor(UU.ProcessorBinaryProcessor(proc), marsh);
+            _binaryProc = new BinaryProcessor(DoOutOpObject((int) Op.GetBinaryProcessor), marsh);
 
             cbs.Initialize(this);
 
             // Grid is not completely started here, can't initialize interop transactions right away.
             _transactions = new Lazy<TransactionsImpl>(
-                    () => new TransactionsImpl(UU.ProcessorTransactions(proc), marsh, GetLocalNode().Id));
+                () => new TransactionsImpl(DoOutOpObject((int) Op.GetTransactions), marsh, GetLocalNode().Id));
 
             // Set reconnected task to completed state for convenience.
             _clientReconnectTaskCompletionSource.SetResult(false);
@@ -207,7 +237,7 @@ namespace Apache.Ignite.Core.Impl
         /** <inheritdoc /> */
         public IClusterGroup ForNodes(IEnumerable<IClusterNode> nodes)
         {
-            return ((IClusterGroup) _prj).ForNodes(nodes);
+            return _prj.ForNodes(nodes);
         }
 
         /** <inheritdoc /> */
@@ -219,12 +249,6 @@ namespace Apache.Ignite.Core.Impl
         /** <inheritdoc /> */
         public IClusterGroup ForNodeIds(IEnumerable<Guid> ids)
         {
-            return ((IClusterGroup) _prj).ForNodeIds(ids);
-        }
-
-        /** <inheritdoc /> */
-        public IClusterGroup ForNodeIds(ICollection<Guid> ids)
-        {
             return _prj.ForNodeIds(ids);
         }
 
@@ -389,7 +413,8 @@ namespace Apache.Ignite.Core.Impl
         {
             IgniteArgumentCheck.NotNull(name, "name");
 
-            return Cache<TK, TV>(UU.ProcessorCache(_proc, name));
+
+            return GetCache<TK, TV>(DoOutOpObject((int) Op.GetCache, w => w.WriteString(name)));
         }
 
         /** <inheritdoc /> */
@@ -397,7 +422,7 @@ namespace Apache.Ignite.Core.Impl
         {
             IgniteArgumentCheck.NotNull(name, "name");
 
-            return Cache<TK, TV>(UU.ProcessorGetOrCreateCache(_proc, name));
+            return GetCache<TK, TV>(DoOutOpObject((int) Op.GetOrCreateCache, w => w.WriteString(name)));
         }
 
         /** <inheritdoc /> */
@@ -407,31 +432,10 @@ namespace Apache.Ignite.Core.Impl
         }
 
         /** <inheritdoc /> */
-        public ICache<TK, TV> GetOrCreateCache<TK, TV>(CacheConfiguration configuration, 
+        public ICache<TK, TV> GetOrCreateCache<TK, TV>(CacheConfiguration configuration,
             NearCacheConfiguration nearConfiguration)
         {
-            IgniteArgumentCheck.NotNull(configuration, "configuration");
-            IgniteArgumentCheck.NotNull(configuration.Name, "CacheConfiguration.Name");
-            configuration.Validate(Logger);
-
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
-            {
-                var writer = BinaryUtils.Marshaller.StartMarshal(stream);
-
-                configuration.Write(writer);
-
-                if (nearConfiguration != null)
-                {
-                    writer.WriteBoolean(true);
-                    nearConfiguration.Write(writer);
-                }
-                else
-                    writer.WriteBoolean(false);
-
-                stream.SynchronizeOutput();
-
-                return Cache<TK, TV>(UU.ProcessorGetOrCreateCache(_proc, stream.MemoryPointer));
-            }
+            return GetOrCreateCache<TK, TV>(configuration, nearConfiguration, Op.GetOrCreateCacheFromConfig);
         }
 
         /** <inheritdoc /> */
@@ -439,7 +443,9 @@ namespace Apache.Ignite.Core.Impl
         {
             IgniteArgumentCheck.NotNull(name, "name");
 
-            return Cache<TK, TV>(UU.ProcessorCreateCache(_proc, name));
+            var cacheTarget = DoOutOpObject((int) Op.CreateCache, w => w.WriteString(name));
+
+            return GetCache<TK, TV>(cacheTarget);
         }
 
         /** <inheritdoc /> */
@@ -452,29 +458,37 @@ namespace Apache.Ignite.Core.Impl
         public ICache<TK, TV> CreateCache<TK, TV>(CacheConfiguration configuration, 
             NearCacheConfiguration nearConfiguration)
         {
+            return GetOrCreateCache<TK, TV>(configuration, nearConfiguration, Op.CreateCacheFromConfig);
+        }
+
+        /// <summary>
+        /// Gets or creates the cache.
+        /// </summary>
+        private ICache<TK, TV> GetOrCreateCache<TK, TV>(CacheConfiguration configuration, 
+            NearCacheConfiguration nearConfiguration, Op op)
+        {
             IgniteArgumentCheck.NotNull(configuration, "configuration");
             IgniteArgumentCheck.NotNull(configuration.Name, "CacheConfiguration.Name");
             configuration.Validate(Logger);
 
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
+            var cacheTarget = DoOutOpObject((int) op, s =>
             {
-                // Use system marshaller: full footers, always unregistered mode.
-                var writer = BinaryUtils.Marshaller.StartMarshal(stream);
+                var w = BinaryUtils.Marshaller.StartMarshal(s);
 
-                configuration.Write(writer);
+                configuration.Write(w);
 
                 if (nearConfiguration != null)
                 {
-                    writer.WriteBoolean(true);
-                    nearConfiguration.Write(writer);
+                    w.WriteBoolean(true);
+                    nearConfiguration.Write(w);
                 }
                 else
-                    writer.WriteBoolean(false);
-
-                stream.SynchronizeOutput();
+                {
+                    w.WriteBoolean(false);
+                }
+            });
 
-                return Cache<TK, TV>(UU.ProcessorCreateCache(_proc, stream.MemoryPointer));
-            }
+            return GetCache<TK, TV>(cacheTarget);
         }
 
         /** <inheritdoc /> */
@@ -482,7 +496,7 @@ namespace Apache.Ignite.Core.Impl
         {
             IgniteArgumentCheck.NotNull(name, "name");
 
-            UU.ProcessorDestroyCache(_proc, name);
+            DoOutOp((int) Op.DestroyCache, w => w.WriteString(name));
         }
 
         /// <summary>
@@ -493,7 +507,7 @@ namespace Apache.Ignite.Core.Impl
         /// <returns>
         /// New instance of cache wrapping specified native cache.
         /// </returns>
-        public ICache<TK, TV> Cache<TK, TV>(IUnmanagedTarget nativeCache, bool keepBinary = false)
+        public ICache<TK, TV> GetCache<TK, TV>(IUnmanagedTarget nativeCache, bool keepBinary = false)
         {
             return new CacheImpl<TK, TV>(this, nativeCache, _marsh, false, keepBinary, false, false);
         }
@@ -541,8 +555,21 @@ namespace Apache.Ignite.Core.Impl
         {
             IgniteArgumentCheck.NotNull(cacheName, "cacheName");
 
-            return new DataStreamerImpl<TK, TV>(UU.ProcessorDataStreamer(_proc, cacheName, false),
-                _marsh, cacheName, false);
+            return GetDataStreamer<TK, TV>(cacheName, false);
+        }
+
+        /// <summary>
+        /// Gets the data streamer.
+        /// </summary>
+        internal IDataStreamer<TK, TV> GetDataStreamer<TK, TV>(string cacheName, bool keepBinary)
+        {
+            var streamerTarget = DoOutOpObject((int) Op.GetDataStreamer, w =>
+            {
+                w.WriteString(cacheName);
+                w.WriteBoolean(keepBinary);
+            });
+
+            return new DataStreamerImpl<TK, TV>(streamerTarget, _marsh, cacheName, keepBinary);
         }
 
         /** <inheritdoc /> */
@@ -556,11 +583,12 @@ namespace Apache.Ignite.Core.Impl
         {
             IgniteArgumentCheck.NotNull(cacheName, "cacheName");
 
-            return new CacheAffinityImpl(UU.ProcessorAffinity(_proc, cacheName), _marsh, false, this);
+            var aff = DoOutOpObject((int) Op.GetAffinity, w => w.WriteString(cacheName));
+            
+            return new CacheAffinityImpl(aff, _marsh, false, this);
         }
 
         /** <inheritdoc /> */
-
         public ITransactions GetTransactions()
         {
             return _transactions.Value;
@@ -589,7 +617,12 @@ namespace Apache.Ignite.Core.Impl
         {
             IgniteArgumentCheck.NotNullOrEmpty(name, "name");
 
-            var nativeLong = UU.ProcessorAtomicLong(_proc, name, initialValue, create);
+            var nativeLong = DoOutOpObject((int) Op.GetAtomicLong, w =>
+            {
+                w.WriteString(name);
+                w.WriteLong(initialValue);
+                w.WriteBoolean(create);
+            });
 
             if (nativeLong == null)
                 return null;
@@ -602,7 +635,12 @@ namespace Apache.Ignite.Core.Impl
         {
             IgniteArgumentCheck.NotNullOrEmpty(name, "name");
 
-            var nativeSeq = UU.ProcessorAtomicSequence(_proc, name, initialValue, create);
+            var nativeSeq = DoOutOpObject((int) Op.GetAtomicSequence, w =>
+            {
+                w.WriteString(name);
+                w.WriteLong(initialValue);
+                w.WriteBoolean(create);
+            });
 
             if (nativeSeq == null)
                 return null;
@@ -615,81 +653,47 @@ namespace Apache.Ignite.Core.Impl
         {
             IgniteArgumentCheck.NotNullOrEmpty(name, "name");
 
-            var refTarget = GetAtomicReferenceUnmanaged(name, initialValue, create);
-
-            return refTarget == null ? null : new AtomicReference<T>(refTarget, Marshaller, name);
-        }
-
-        /// <summary>
-        /// Gets the unmanaged atomic reference.
-        /// </summary>
-        /// <param name="name">The name.</param>
-        /// <param name="initialValue">The initial value.</param>
-        /// <param name="create">Create flag.</param>
-        /// <returns>Unmanaged atomic reference, or null.</returns>
-        private IUnmanagedTarget GetAtomicReferenceUnmanaged<T>(string name, T initialValue, bool create)
-        {
-            IgniteArgumentCheck.NotNullOrEmpty(name, "name");
-
-            // Do not allocate memory when default is not used.
-            if (!create)
-                return UU.ProcessorAtomicReference(_proc, name, 0, false);
-            
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
+            var refTarget = DoOutOpObject((int) Op.GetAtomicReference, w =>
             {
-                var writer = Marshaller.StartMarshal(stream);
-
-                writer.Write(initialValue);
-
-                Marshaller.FinishMarshal(writer);
+                w.WriteString(name);
+                w.WriteObject(initialValue);
+                w.WriteBoolean(create);
+            });
 
-                var memPtr = stream.SynchronizeOutput();
-
-                return UU.ProcessorAtomicReference(_proc, name, memPtr, true);
-            }
+            return refTarget == null ? null : new AtomicReference<T>(refTarget, Marshaller, name);
         }
 
         /** <inheritdoc /> */
         public IgniteConfiguration GetConfiguration()
         {
-            using (var stream = IgniteManager.Memory.Allocate(1024).GetStream())
-            {
-                UU.ProcessorGetIgniteConfiguration(_proc, stream.MemoryPointer);
-
-                stream.SynchronizeInput();
-
-                return new IgniteConfiguration(BinaryUtils.Marshaller.StartUnmarshal(stream), _cfg);
-            }
+            return DoInOp((int) Op.GetIgniteConfiguration,
+                s => new IgniteConfiguration(BinaryUtils.Marshaller.StartUnmarshal(s), _cfg));
         }
 
         /** <inheritdoc /> */
         public ICache<TK, TV> CreateNearCache<TK, TV>(string name, NearCacheConfiguration configuration)
         {
-            return GetOrCreateNearCache0<TK, TV>(name, configuration, UU.ProcessorCreateNearCache);
+            return GetOrCreateNearCache0<TK, TV>(name, configuration, Op.CreateNearCache);
         }
 
         /** <inheritdoc /> */
         public ICache<TK, TV> GetOrCreateNearCache<TK, TV>(string name, NearCacheConfiguration configuration)
         {
-            return GetOrCreateNearCache0<TK, TV>(name, configuration, UU.ProcessorGetOrCreateNearCache);
+            return GetOrCreateNearCache0<TK, TV>(name, configuration, Op.GetOrCreateNearCache);
         }
 
         /** <inheritdoc /> */
         public ICollection<string> GetCacheNames()
         {
-            using (var stream = IgniteManager.Memory.Allocate(1024).GetStream())
+            return OutStream((int) Op.GetCacheNames, r =>
             {
-                UU.ProcessorGetCacheNames(_proc, stream.MemoryPointer);
-                stream.SynchronizeInput();
-
-                var reader = _marsh.StartUnmarshal(stream);
-                var res = new string[stream.ReadInt()];
+                var res = new string[r.ReadInt()];
 
-                for (int i = 0; i < res.Length; i++)
-                    res[i] = reader.ReadString();
+                for (var i = 0; i < res.Length; i++)
+                    res[i] = r.ReadString();
 
-                return res;
-            }
+                return (ICollection<string>) res;
+            });
         }
 
         /** <inheritdoc /> */
@@ -768,20 +772,17 @@ namespace Apache.Ignite.Core.Impl
         /// Gets or creates near cache.
         /// </summary>
         private ICache<TK, TV> GetOrCreateNearCache0<TK, TV>(string name, NearCacheConfiguration configuration,
-            Func<IUnmanagedTarget, string, long, IUnmanagedTarget> func)
+            Op op)
         {
             IgniteArgumentCheck.NotNull(configuration, "configuration");
 
-            using (var stream = IgniteManager.Memory.Allocate().GetStream())
+            var cacheTarget = DoOutOpObject((int) op, w =>
             {
-                var writer = BinaryUtils.Marshaller.StartMarshal(stream);
+                w.WriteString(name);
+                configuration.Write(w);
+            });
 
-                configuration.Write(writer);
-
-                stream.SynchronizeOutput();
-
-                return Cache<TK, TV>(func(_proc, name, stream.MemoryPointer));
-            }
+            return GetCache<TK, TV>(cacheTarget);
         }
 
         /// <summary>
@@ -794,14 +795,6 @@ namespace Apache.Ignite.Core.Impl
         }
 
         /// <summary>
-        /// Marshaller.
-        /// </summary>
-        internal Marshaller Marshaller
-        {
-            get { return _marsh; }
-        }
-
-        /// <summary>
         /// Gets the binary processor.
         /// </summary>
         internal BinaryProcessor BinaryProcessor
@@ -892,5 +885,43 @@ namespace Apache.Ignite.Core.Impl
         {
             get { return _pluginProcessor; }
         }
+
+        /// <summary>
+        /// Notify processor that it is safe to use.
+        /// </summary>
+        internal void ProcessorReleaseStart()
+        {
+            InLongOutLong((int) Op.ReleaseStart, 0);
+        }
+
+        /// <summary>
+        /// Checks whether log level is enabled in Java logger.
+        /// </summary>
+        internal bool LoggerIsLevelEnabled(LogLevel logLevel)
+        {
+            return InLongOutLong((int) Op.LoggerIsLevelEnabled, (long) logLevel) == True;
+        }
+
+        /// <summary>
+        /// Logs to the Java logger.
+        /// </summary>
+        internal void LoggerLog(LogLevel level, string msg, string category, string err)
+        {
+            InStreamOutLong((int) Op.LoggerLog, w =>
+            {
+                w.WriteInt((int) level);
+                w.WriteString(msg);
+                w.WriteString(category);
+                w.WriteString(err);
+            });
+        }
+
+        /// <summary>
+        /// Gets the platform plugin extension.
+        /// </summary>
+        internal IPlatformTarget GetExtension(int id)
+        {
+            return InStreamOutObject((int) Op.GetExtension, w => w.WriteInt(id));
+        }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Log/JavaLogger.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Log/JavaLogger.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Log/JavaLogger.cs
index 23e7a37..2e47fe8 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Log/JavaLogger.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Log/JavaLogger.cs
@@ -21,7 +21,6 @@ namespace Apache.Ignite.Core.Impl.Log
     using System.Collections.Generic;
     using System.Diagnostics;
     using System.Linq;
-    using Apache.Ignite.Core.Impl.Unmanaged;
     using Apache.Ignite.Core.Log;
 
     /// <summary>
@@ -30,7 +29,7 @@ namespace Apache.Ignite.Core.Impl.Log
     internal class JavaLogger : ILogger
     {
         /** */
-        private IUnmanagedTarget _proc;
+        private Ignite _ignite;
 
         /** */
         private readonly List<LogLevel> _enabledLevels = new List<LogLevel>(5);
@@ -45,19 +44,19 @@ namespace Apache.Ignite.Core.Impl.Log
         /// <summary>
         /// Sets the processor.
         /// </summary>
-        /// <param name="proc">The proc.</param>
-        public void SetProcessor(IUnmanagedTarget proc)
+        /// <param name="ignite">The proc.</param>
+        public void SetIgnite(Ignite ignite)
         {
-            Debug.Assert(proc != null);
+            Debug.Assert(ignite != null);
 
             lock (_syncRoot)
             {
-                _proc = proc;
+                _ignite = ignite;
 
                 // Preload enabled levels.
                 _enabledLevels.AddRange(
-                    new[] { LogLevel.Trace, LogLevel.Debug, LogLevel.Info, LogLevel.Warn, LogLevel.Error }
-                        .Where(x => UnmanagedUtils.ProcessorLoggerIsLevelEnabled(proc, (int)x)));
+                    new[] {LogLevel.Trace, LogLevel.Debug, LogLevel.Info, LogLevel.Warn, LogLevel.Error}
+                        .Where(x => ignite.LoggerIsLevelEnabled(x)));
 
                 foreach (var log in _pendingLogs)
                 {
@@ -82,7 +81,7 @@ namespace Apache.Ignite.Core.Impl.Log
                 var msg = args == null ? message : string.Format(formatProvider, message, args);
                 var err = ex != null ? ex.ToString() : null;
 
-                if (_proc != null)
+                if (_ignite != null)
                     Log(level, msg, category, err);
                 else
                     _pendingLogs.Add(Tuple.Create(level, msg, category, err));
@@ -94,7 +93,7 @@ namespace Apache.Ignite.Core.Impl.Log
         {
             lock (_syncRoot)
             {
-                return _proc == null || _enabledLevels.Contains(level);
+                return _ignite == null || _enabledLevels.Contains(level);
             }
         }
 
@@ -104,7 +103,9 @@ namespace Apache.Ignite.Core.Impl.Log
         private void Log(LogLevel level, string msg, string category, string err)
         {
             if (IsEnabled(level))
-                UnmanagedUtils.ProcessorLoggerLog(_proc, (int)level, msg, category, err);
+            {
+                _ignite.LoggerLog(level, msg, category, err);
+            }
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTarget.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTarget.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTarget.cs
index 8dd8eaf..474af0e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTarget.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTarget.cs
@@ -300,7 +300,7 @@ namespace Apache.Ignite.Core.Impl
         /// </summary>
         /// <param name="type">Operation type.</param>
         /// <param name="action">Action to be performed on the stream.</param>
-        /// <returns></returns>
+        /// <returns>Resulting object.</returns>
         protected IUnmanagedTarget DoOutOpObject(int type, Action<BinaryWriter> action)
         {
             using (var stream = IgniteManager.Memory.Allocate().GetStream())
@@ -319,6 +319,22 @@ namespace Apache.Ignite.Core.Impl
         /// Perform out operation.
         /// </summary>
         /// <param name="type">Operation type.</param>
+        /// <param name="action">Action to be performed on the stream.</param>
+        /// <returns>Resulting object.</returns>
+        protected IUnmanagedTarget DoOutOpObject(int type, Action<IBinaryStream> action)
+        {
+            using (var stream = IgniteManager.Memory.Allocate().GetStream())
+            {
+                action(stream);
+
+                return UU.TargetInStreamOutObject(_target, type, stream.SynchronizeOutput());
+            }
+        }
+
+        /// <summary>
+        /// Perform out operation.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
         /// <returns>Resulting object.</returns>
         protected IUnmanagedTarget DoOutOpObject(int type)
         {

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Plugin/PluginContext.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Plugin/PluginContext.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Plugin/PluginContext.cs
index cc20cb3..eac7556 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Plugin/PluginContext.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Plugin/PluginContext.cs
@@ -20,7 +20,6 @@ namespace Apache.Ignite.Core.Impl.Plugin
     using Apache.Ignite.Core.Common;
     using Apache.Ignite.Core.Impl.Common;
     using Apache.Ignite.Core.Impl.Resource;
-    using Apache.Ignite.Core.Impl.Unmanaged;
     using Apache.Ignite.Core.Interop;
     using Apache.Ignite.Core.Plugin;
 
@@ -65,11 +64,7 @@ namespace Apache.Ignite.Core.Impl.Plugin
         /** <inheritdoc /> */
         public IPlatformTarget GetExtension(int id)
         {
-            var ignite = _pluginProcessor.Ignite;
-
-            var ext = UnmanagedUtils.ProcessorExtension(ignite.InteropProcessor, id);
-
-            return new PlatformTarget(ext, ignite.Marshaller);
+            return _pluginProcessor.Ignite.GetExtension(id);
         }
 
         /** <inheritdoc /> */

http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/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 289589f..1720a79 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/IgniteJniNativeMethods.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/IgniteJniNativeMethods.cs
@@ -30,105 +30,16 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
         public static extern int Reallocate(long memPtr, int cap);
 
         [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteIgnitionStart")]
-        public static extern void* IgnitionStart(void* ctx, sbyte* cfgPath, sbyte* gridName, int factoryId, 
+        public static extern void IgnitionStart(void* ctx, sbyte* cfgPath, sbyte* gridName, int factoryId, 
             long dataPtr);
 
         [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteIgnitionStop")]
         [return: MarshalAs(UnmanagedType.U1)]
         public static extern bool IgnitionStop(void* ctx, sbyte* gridName, [MarshalAs(UnmanagedType.U1)] bool cancel);
 
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteIgnitionStopAll")]
-        public static extern void IgnitionStopAll(void* ctx, [MarshalAs(UnmanagedType.U1)] bool cancel);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorReleaseStart")]
-        public static extern void ProcessorReleaseStart(void* ctx, void* obj);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorProjection")]
-        public static extern void* ProcessorProjection(void* ctx, void* obj);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorCache")]
-        public static extern void* ProcessorCache(void* ctx, void* obj, sbyte* name);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorCreateCache")]
-        public static extern void* ProcessorCreateCache(void* ctx, void* obj, sbyte* name);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorCreateCacheFromConfig")]
-        public static extern void* ProcessorCreateCacheFromConfig(void* ctx, void* obj, long memPtr);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorGetOrCreateCache")]
-        public static extern void* ProcessorGetOrCreateCache(void* ctx, void* obj, sbyte* name);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorGetOrCreateCacheFromConfig")]
-        public static extern void* ProcessorGetOrCreateCacheFromConfig(void* ctx, void* obj, long memPtr);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorCreateNearCache")]
-        public static extern void* ProcessorCreateNearCache(void* ctx, void* obj, sbyte* name, long memPtr);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorGetOrCreateNearCache")]
-        public static extern void* ProcessorGetOrCreateNearCache(void* ctx, void* obj, sbyte* name, long memPtr);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorDestroyCache")]
-        public static extern void ProcessorDestroyCache(void* ctx, void* obj, sbyte* name);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorAffinity")]
-        public static extern void* ProcessorAffinity(void* ctx, void* obj, sbyte* name);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorDataStreamer")]
-        public static extern void* ProcessorDataStreamer(void* ctx, void* obj, sbyte* name, 
-            [MarshalAs(UnmanagedType.U1)] bool keepBinary);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorTransactions")]
-        public static extern void* ProcessorTransactions(void* ctx, void* obj);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorCompute")]
-        public static extern void* ProcessorCompute(void* ctx, void* obj, void* prj);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorMessage")]
-        public static extern void* ProcessorMessage(void* ctx, void* obj, void* prj);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorEvents")]
-        public static extern void* ProcessorEvents(void* ctx, void* obj, void* prj);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorServices")]
-        public static extern void* ProcessorServices(void* ctx, void* obj, void* prj);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorExtensions")]
-        public static extern void* ProcessorExtensions(void* ctx, void* obj);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorExtension")]
-        public static extern void* ProcessorExtension(void* ctx, void* obj, int id);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorAtomicLong")]
-        public static extern void* ProcessorAtomicLong(void* ctx, void* obj, sbyte* name, long initVal,
-            [MarshalAs(UnmanagedType.U1)] bool create);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorAtomicSequence")]
-        public static extern void* ProcessorAtomicSequence(void* ctx, void* obj, sbyte* name, long initVal,
-            [MarshalAs(UnmanagedType.U1)] bool create);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorAtomicReference")]
-        public static extern void* ProcessorAtomicReference(void* ctx, void* obj, sbyte* name, long memPtr,
-            [MarshalAs(UnmanagedType.U1)] bool create);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorGetIgniteConfiguration")]
-        public static extern void ProcessorGetIgniteConfiguration(void* ctx, void* obj, long memPtr);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorGetCacheNames")]
-        public static extern void ProcessorGetCacheNames(void* ctx, void* obj, long memPtr);
-
         [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteTargetInLongOutLong")]
         public static extern long TargetInLongOutLong(void* ctx, void* target, int opType, long val);
 
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorLoggerIsLevelEnabled")]
-        [return: MarshalAs(UnmanagedType.U1)]
-        public static extern bool ProcessorLoggerIsLevelEnabled(void* ctx, void* obj, int level);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorLoggerLog")]
-        public static extern void ProcessorLoggerLog(void* ctx, void* obj, int level, sbyte* messsage, sbyte* category, sbyte* errorInfo);
-
-        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteProcessorBinaryProcessor")]
-        public static extern void* ProcessorBinaryProcessor(void* ctx, void* obj);
-
         [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteTargetInStreamOutLong")]
         public static extern long TargetInStreamOutLong(void* ctx, void* target, int opType, long memPtr);
 


[39/50] [abbrv] ignite git commit: ignite-5682 Added stale version check for GridDhtPartFullMessage not related to exchange.

Posted by yz...@apache.org.
ignite-5682 Added stale version check for GridDhtPartFullMessage not related to exchange.


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

Branch: refs/heads/ignite-5658
Commit: eb9d06d9ff89388318cc3a857276c154675bc6f1
Parents: 3a3650f
Author: Dmitry Pavlov <dp...@gmail.com>
Authored: Thu Jul 27 14:51:25 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Jul 27 14:51:25 2017 +0300

----------------------------------------------------------------------
 .../cache/CacheAffinitySharedManager.java       |  5 +-
 .../processors/cache/GridCacheIoManager.java    |  2 +-
 .../GridCachePartitionExchangeManager.java      | 44 ++++++++++-----
 .../dht/GridClientPartitionTopology.java        | 12 +++-
 .../dht/GridDhtPartitionTopology.java           |  9 ++-
 .../dht/GridDhtPartitionTopologyImpl.java       | 34 +++++++-----
 .../preloader/GridDhtPartitionExchangeId.java   |  2 +-
 .../GridDhtPartitionsExchangeFuture.java        | 36 ++++++++----
 .../preloader/GridDhtPartitionsFullMessage.java |  4 +-
 ...cingDelayedPartitionMapExchangeSelfTest.java | 58 ++++++++++++++++----
 .../junits/common/GridCommonAbstractTest.java   |  6 +-
 11 files changed, 151 insertions(+), 61 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/eb9d06d9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
index 0f46a90..5a7f634 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
@@ -442,7 +442,8 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
                                 grp.topology().update(topVer,
                                     clientTop.partitionMap(true),
                                     clientTop.updateCounters(false),
-                                    Collections.<Integer>emptySet());
+                                    Collections.<Integer>emptySet(),
+                                    null);
                             }
 
                             grpHolder = new CacheGroupHolder1(grp, grpHolder.affinity());
@@ -504,7 +505,7 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
 
                 grp.topology().updateTopologyVersion(topFut, discoCache, -1, false);
 
-                grp.topology().update(topVer, partMap, null, Collections.<Integer>emptySet());
+                grp.topology().update(topVer, partMap, null, Collections.<Integer>emptySet(), null);
 
                 topFut.validate(grp, discoCache.allNodes());
             }

http://git-wip-us.apache.org/repos/asf/ignite/blob/eb9d06d9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
index 9f1873e..981c6e2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheIoManager.java
@@ -533,7 +533,7 @@ public class GridCacheIoManager extends GridCacheSharedManagerAdapter {
     }
 
     /**
-     * @param nodeId Node ID.
+     * @param nodeId Sender Node ID.
      * @param cacheMsg Cache message.
      * @param c Handler closure.
      * @param plc Message policy.

http://git-wip-us.apache.org/repos/asf/ignite/blob/eb9d06d9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
index d4fe93f..6a7258f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCachePartitionExchangeManager.java
@@ -129,7 +129,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
     private static final int EXCHANGE_HISTORY_SIZE =
         IgniteSystemProperties.getInteger(IgniteSystemProperties.IGNITE_EXCHANGE_HISTORY_SIZE, 1_000);
 
-    /** Atomic reference for pending timeout object. */
+    /** Atomic reference for pending partition resend timeout object. */
     private AtomicReference<ResendTimeoutObject> pendingResend = new AtomicReference<>();
 
     /** Partition resend timeout after eviction. */
@@ -150,7 +150,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
     private final ConcurrentMap<Integer, GridClientPartitionTopology> clientTops = new ConcurrentHashMap8<>();
 
     /** */
-    private volatile GridDhtPartitionsExchangeFuture lastInitializedFut;
+    @Nullable private volatile GridDhtPartitionsExchangeFuture lastInitializedFut;
 
     /** */
     private final AtomicReference<GridDhtTopologyFuture> lastFinishedFut = new AtomicReference<>();
@@ -877,6 +877,8 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
 
     /**
      * Partition refresh callback.
+     * For coordinator causes {@link GridDhtPartitionsFullMessage FullMessages} send,
+     * for non coordinator -  {@link GridDhtPartitionsSingleMessage SingleMessages} send
      */
     private void refreshPartitions() {
         ClusterNode oldest = cctx.discovery().oldestAliveCacheServerNode(AffinityTopologyVersion.NONE);
@@ -914,7 +916,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
             if (log.isDebugEnabled())
                 log.debug("Refreshing partitions from oldest node: " + cctx.localNodeId());
 
-            sendAllPartitions(rmts);
+            sendAllPartitions(rmts, rmtTopVer);
         }
         else {
             if (log.isDebugEnabled())
@@ -927,10 +929,14 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
 
     /**
      * @param nodes Nodes.
+     * @param msgTopVer Topology version. Will be added to full message.
      */
-    private void sendAllPartitions(Collection<ClusterNode> nodes) {
+    private void sendAllPartitions(Collection<ClusterNode> nodes,
+        AffinityTopologyVersion msgTopVer) {
         GridDhtPartitionsFullMessage m = createPartitionsFullMessage(true, null, null, null, null);
 
+        m.topologyVersion(msgTopVer);
+
         if (log.isDebugEnabled())
             log.debug("Sending all partitions [nodeIds=" + U.nodeIds(nodes) + ", msg=" + m + ']');
 
@@ -956,6 +962,8 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
      *     finishUnmarshall methods are called).
      * @param exchId Non-null exchange ID if message is created for exchange.
      * @param lastVer Last version.
+     * @param partHistSuppliers
+     * @param partsToReload
      * @return Message.
      */
     public GridDhtPartitionsFullMessage createPartitionsFullMessage(
@@ -1064,8 +1072,8 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
     }
 
     /**
-     * @param node Node.
-     * @param id ID.
+     * @param node Destination cluster node.
+     * @param id Exchange ID.
      */
     private void sendLocalPartitions(ClusterNode node, @Nullable GridDhtPartitionExchangeId id) {
         GridDhtPartitionsSingleMessage m = createPartitionsSingleMessage(node,
@@ -1091,7 +1099,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
 
     /**
      * @param targetNode Target node.
-     * @param exchangeId ID.
+     * @param exchangeId Exchange ID.
      * @param clientOnlyExchange Client exchange flag.
      * @param sndCounters {@code True} if need send partition update counters.
      * @return Message.
@@ -1297,7 +1305,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
     }
 
     /**
-     * @param node Node.
+     * @param node Sender cluster node.
      * @param msg Message.
      */
     private void processFullPartitionUpdate(ClusterNode node, GridDhtPartitionsFullMessage msg) {
@@ -1323,8 +1331,13 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
                     else if (!grp.isLocal())
                         top = grp.topology();
 
-                    if (top != null)
-                        updated |= top.update(null, entry.getValue(), null, msg.partsToReload(cctx.localNodeId(), grpId));
+                    if (top != null) {
+                        updated |= top.update(null,
+                            entry.getValue(),
+                            null,
+                            msg.partsToReload(cctx.localNodeId(), grpId),
+                            msg.topologyVersion());
+                    }
                 }
 
                 if (!cctx.kernalContext().clientNode() && updated)
@@ -1352,7 +1365,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
     }
 
     /**
-     * @param node Node ID.
+     * @param node Sender cluster node.
      * @param msg Message.
      */
     private void processSinglePartitionUpdate(final ClusterNode node, final GridDhtPartitionsSingleMessage msg) {
@@ -1418,7 +1431,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
     }
 
     /**
-     * @param node Node ID.
+     * @param node Sender cluster node.
      * @param msg Message.
      */
     private void processSinglePartitionRequest(ClusterNode node, GridDhtPartitionsSingleRequest msg) {
@@ -2250,7 +2263,10 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
         /** */
         private static final long serialVersionUID = 0L;
 
-        /** {@inheritDoc} */
+        /**
+         * @param nodeId Sender node ID.
+         * @param msg Message.
+         */
         @Override public void apply(UUID nodeId, M msg) {
             ClusterNode node = cctx.node(nodeId);
 
@@ -2268,7 +2284,7 @@ public class GridCachePartitionExchangeManager<K, V> extends GridCacheSharedMana
         }
 
         /**
-         * @param node Node.
+         * @param node Sender cluster node.
          * @param msg Message.
          */
         protected abstract void onMessage(ClusterNode node, M msg);

http://git-wip-us.apache.org/repos/asf/ignite/blob/eb9d06d9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
index 7343dba..4b9826e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
@@ -594,8 +594,8 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
         @Nullable AffinityTopologyVersion exchangeVer,
         GridDhtPartitionFullMap partMap,
         Map<Integer, T2<Long, Long>> cntrMap,
-        Set<Integer> partsToReload
-    ) {
+        Set<Integer> partsToReload,
+        @Nullable AffinityTopologyVersion msgTopVer) {
         if (log.isDebugEnabled())
             log.debug("Updating full partition map [exchVer=" + exchangeVer + ", parts=" + fullMapString() + ']');
 
@@ -610,6 +610,14 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
                 return false;
             }
 
+            if (msgTopVer != null && lastExchangeVer != null && lastExchangeVer.compareTo(msgTopVer) > 0) {
+                if (log.isDebugEnabled())
+                    log.debug("Stale topology version for full partition map update message (will ignore) " +
+                        "[lastExchId=" + lastExchangeVer + ", topVersion=" + msgTopVer + ']');
+
+                return false;
+            }
+
             boolean fullMapUpdated = (node2part == null);
 
             if (node2part != null) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/eb9d06d9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
index d9e04a6..81d92e0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
@@ -243,16 +243,21 @@ public interface GridDhtPartitionTopology {
     public void onRemoved(GridDhtCacheEntry e);
 
     /**
-     * @param exchangeVer Exchange version.
+     * @param exchangeVer Topology version from exchange. Value should be greater than previously passed. Null value
+     *      means full map received is not related to exchange
      * @param partMap Update partition map.
      * @param cntrMap Partition update counters.
+     * @param partsToReload
+     * @param msgTopVer Topology version from incoming message. This value is not null only for case message is not
+     *      related to exchange. Value should be not less than previous 'Topology version from exchange'.
      * @return {@code True} if local state was changed.
      */
     public boolean update(
         @Nullable AffinityTopologyVersion exchangeVer,
         GridDhtPartitionFullMap partMap,
         @Nullable Map<Integer, T2<Long, Long>> cntrMap,
-        Set<Integer> partsToReload);
+        Set<Integer> partsToReload,
+        @Nullable AffinityTopologyVersion msgTopVer);
 
     /**
      * @param exchId Exchange ID.

http://git-wip-us.apache.org/repos/asf/ignite/blob/eb9d06d9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
index 842501e..a8e13a0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
@@ -440,7 +440,7 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
 
                     if (exchId.isLeft() && exchFut.serverNodeDiscoveryEvent())
                         removeNode(exchId.nodeId());
-    
+
                     ClusterNode oldest = discoCache.oldestAliveServerNodeWithCache();
 
                     if (log.isDebugEnabled()) {
@@ -1099,9 +1099,9 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
     @Override public boolean update(
         @Nullable AffinityTopologyVersion exchangeVer,
         GridDhtPartitionFullMap partMap,
-        @Nullable Map<Integer, T2<Long, Long>> cntrMap,
-        Set<Integer> partsToReload
-    ) {
+        @Nullable Map<Integer, T2<Long, Long>> incomeCntrMap,
+        Set<Integer> partsToReload,
+        @Nullable AffinityTopologyVersion msgTopVer) {
         if (log.isDebugEnabled())
             log.debug("Updating full partition map [exchVer=" + exchangeVer + ", parts=" + fullMapString() + ']');
 
@@ -1113,12 +1113,12 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
             if (stopping)
                 return false;
 
-            if (cntrMap != null) {
+            if (incomeCntrMap != null) {
                 // update local map partition counters
-                for (Map.Entry<Integer, T2<Long, Long>> e : cntrMap.entrySet()) {
-                    T2<Long, Long> cntr = this.cntrMap.get(e.getKey());
+                for (Map.Entry<Integer, T2<Long, Long>> e : incomeCntrMap.entrySet()) {
+                    T2<Long, Long> existCntr = this.cntrMap.get(e.getKey());
 
-                    if (cntr == null || cntr.get2() < e.getValue().get2())
+                    if (existCntr == null || existCntr.get2() < e.getValue().get2())
                         this.cntrMap.put(e.getKey(), e.getValue());
                 }
 
@@ -1129,7 +1129,7 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
                     if (part == null)
                         continue;
 
-                    T2<Long, Long> cntr = cntrMap.get(part.id());
+                    T2<Long, Long> cntr = incomeCntrMap.get(part.id());
 
                     if (cntr != null)
                         part.updateCounter(cntr.get2());
@@ -1144,6 +1144,14 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
                 return false;
             }
 
+            if (msgTopVer != null && lastExchangeVer != null && lastExchangeVer.compareTo(msgTopVer) > 0) {
+                if (log.isDebugEnabled())
+                    log.debug("Stale version for full partition map update message (will ignore) [lastExch=" +
+                        lastExchangeVer + ", topVersion=" + msgTopVer + ']');
+
+                return false;
+            }
+
             boolean fullMapUpdated = (node2part == null);
 
             if (node2part != null) {
@@ -1244,8 +1252,8 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
 
                         assert locPart != null;
 
-                        if (cntrMap != null) {
-                            T2<Long, Long> cntr = cntrMap.get(p);
+                        if (incomeCntrMap != null) {
+                            T2<Long, Long> cntr = incomeCntrMap.get(p);
 
                             if (cntr != null && cntr.get2() > locPart.updateCounter())
                                 locPart.updateCounter(cntr.get2());
@@ -1271,8 +1279,8 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
                             changed = true;
                         }
 
-                        if (cntrMap != null) {
-                            T2<Long, Long> cntr = cntrMap.get(p);
+                        if (incomeCntrMap != null) {
+                            T2<Long, Long> cntr = incomeCntrMap.get(p);
 
                             if (cntr != null && cntr.get2() > locPart.updateCounter())
                                 locPart.updateCounter(cntr.get2());

http://git-wip-us.apache.org/repos/asf/ignite/blob/eb9d06d9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionExchangeId.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionExchangeId.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionExchangeId.java
index 0a49415..1a4dabf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionExchangeId.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionExchangeId.java
@@ -51,7 +51,7 @@ public class GridDhtPartitionExchangeId implements Message, Comparable<GridDhtPa
     @GridToStringExclude
     private UUID nodeId;
 
-    /** Event. */
+    /** Event type. */
     @GridToStringExclude
     private int evt;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/eb9d06d9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
index cdb4bb7..71e41b0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
@@ -127,7 +127,7 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     @GridToStringExclude
     private final Set<UUID> remaining = new HashSet<>();
 
-    /** */
+    /** Guarded by this */
     @GridToStringExclude
     private int pendingSingleUpdates;
 
@@ -154,7 +154,7 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     @GridToStringExclude
     private final CountDownLatch evtLatch = new CountDownLatch(1);
 
-    /** */
+    /** Exchange future init method completes this future. */
     private GridFutureAdapter<Boolean> initFut;
 
     /** */
@@ -196,7 +196,10 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     /** Init timestamp. Used to track the amount of time spent to complete the future. */
     private long initTs;
 
-    /** */
+    /**
+     * Centralized affinity assignment required. Activated for node left of failed. For this mode crd will send full
+     * partitions maps to nodes using discovery (ring) instead of communication.
+     */
     private boolean centralizedAff;
 
     /** Change global state exception. */
@@ -613,7 +616,8 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
                     top.update(topologyVersion(),
                         clientTop.partitionMap(true),
                         clientTop.updateCounters(false),
-                        Collections.<Integer>emptySet());
+                        Collections.<Integer>emptySet(),
+                        null);
                 }
             }
 
@@ -1092,7 +1096,7 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     }
 
     /**
-     * @param node Node.
+     * @param node Target Node.
      * @throws IgniteCheckedException If failed.
      */
     private void sendLocalPartitions(ClusterNode node) throws IgniteCheckedException {
@@ -1191,7 +1195,7 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     }
 
     /**
-     * @param oldestNode Oldest node.
+     * @param oldestNode Oldest node. Target node to send message to.
      */
     private void sendPartitions(ClusterNode oldestNode) {
         try {
@@ -1368,6 +1372,9 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     }
 
     /**
+     * Processing of received single message. Actual processing in future may be delayed if init method was not
+     * completed, see {@link #initDone()}
+     *
      * @param node Sender node.
      * @param msg Single partition info.
      */
@@ -1409,11 +1416,14 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     }
 
     /**
+     * Note this method performs heavy updatePartitionSingleMap operation, this operation is moved out from the
+     * synchronized block. Only count of such updates {@link #pendingSingleUpdates} is managed under critical section.
+     *
      * @param node Sender node.
-     * @param msg Message.
+     * @param msg Partition single message.
      */
     private void processMessage(ClusterNode node, GridDhtPartitionsSingleMessage msg) {
-        boolean allReceived = false;
+        boolean allReceived = false; // Received all expected messages.
         boolean updateSingleMap = false;
 
         synchronized (this) {
@@ -1895,7 +1905,7 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
 
     /**
      * @param node Sender node.
-     * @param msg Message.
+     * @param msg Message with full partition info.
      */
     private void processMessage(ClusterNode node, GridDhtPartitionsFullMessage msg) {
         assert exchId.equals(msg.exchangeId()) : msg;
@@ -1953,7 +1963,8 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
                 grp.topology().update(topologyVersion(),
                     entry.getValue(),
                     cntrMap,
-                    msg.partsToReload(cctx.localNodeId(), grpId));
+                    msg.partsToReload(cctx.localNodeId(), grpId),
+                    null);
             }
             else {
                 ClusterNode oldest = cctx.discovery().oldestAliveCacheServerNode(AffinityTopologyVersion.NONE);
@@ -1962,7 +1973,8 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
                     cctx.exchange().clientTopology(grpId, this).update(topologyVersion(),
                         entry.getValue(),
                         cntrMap,
-                        Collections.<Integer>emptySet());
+                        Collections.<Integer>emptySet(),
+                        null);
                 }
             }
         }
@@ -2054,7 +2066,7 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     }
 
     /**
-     *
+     * Moves exchange future to state 'init done' using {@link #initFut}.
      */
     private void initDone() {
         while (!isDone()) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/eb9d06d9/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
index 75609b8..acc4dbe 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsFullMessage.java
@@ -109,7 +109,9 @@ public class GridDhtPartitionsFullMessage extends GridDhtPartitionsAbstractMessa
     /**
      * @param id Exchange ID.
      * @param lastVer Last version.
-     * @param topVer Topology version.
+     * @param topVer Topology version. For messages not related to exchange may be {@link AffinityTopologyVersion#NONE}.
+     * @param partHistSuppliers
+     * @param partsToReload
      */
     public GridDhtPartitionsFullMessage(@Nullable GridDhtPartitionExchangeId id,
         @Nullable GridCacheVersion lastVer,

http://git-wip-us.apache.org/repos/asf/ignite/blob/eb9d06d9/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/rebalancing/GridCacheRabalancingDelayedPartitionMapExchangeSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/rebalancing/GridCacheRabalancingDelayedPartitionMapExchangeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/rebalancing/GridCacheRabalancingDelayedPartitionMapExchangeSelfTest.java
index dc141db..f307b6a 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/rebalancing/GridCacheRabalancingDelayedPartitionMapExchangeSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/rebalancing/GridCacheRabalancingDelayedPartitionMapExchangeSelfTest.java
@@ -18,14 +18,17 @@
 package org.apache.ignite.internal.processors.cache.distributed.rebalancing;
 
 import java.util.UUID;
+import java.util.concurrent.atomic.AtomicBoolean;
 import org.apache.ignite.IgniteException;
 import org.apache.ignite.cache.CacheMode;
 import org.apache.ignite.cache.CacheRebalanceMode;
 import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.IgniteKernal;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.managers.communication.GridIoMessage;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsAbstractMessage;
 import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionsFullMessage;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteInClosure;
@@ -45,12 +48,19 @@ public class GridCacheRabalancingDelayedPartitionMapExchangeSelfTest extends Gri
     /** */
     protected static TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
 
-    /** */
+    /** Map of destination node ID to runnable with logic for real message sending.
+     * To apply real message sending use run method */
     private final ConcurrentHashMap8<UUID, Runnable> rs = new ConcurrentHashMap8<>();
 
-    /** */
+    /**
+     * Flag to redirect {@link GridDhtPartitionsFullMessage}s from real communication channel to {@link #rs} map.
+     * Applied only to messages not related to particular exchange
+     */
     private volatile boolean record = false;
 
+    /** */
+    private AtomicBoolean replay = new AtomicBoolean();
+
     /** {@inheritDoc} */
     @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
         IgniteConfiguration iCfg = super.getConfiguration(igniteInstanceName);
@@ -74,13 +84,26 @@ public class GridCacheRabalancingDelayedPartitionMapExchangeSelfTest extends Gri
             final IgniteInClosure<IgniteException> ackC) throws IgniteSpiException {
             final Object msg0 = ((GridIoMessage)msg).message();
 
+            if (log.isDebugEnabled())
+                log.debug("Message [thread=" + Thread.currentThread().getName() + ", msg=" + msg0 + ']');
+
             if (msg0 instanceof GridDhtPartitionsFullMessage && record &&
-                ((GridDhtPartitionsFullMessage)msg0).exchangeId() == null) {
-                rs.putIfAbsent(node.id(), new Runnable() {
+                ((GridDhtPartitionsAbstractMessage)msg0).exchangeId() == null) {
+                if (log.isDebugEnabled())
+                    log.debug("Record message [toNode=" + node.id() + ", msg=" + msg + "]");
+
+                assert !replay.get() : "Record of message is not allowed after replay";
+
+                Runnable prevValue = rs.putIfAbsent(node.id(), new Runnable() {
                     @Override public void run() {
+                        if (log.isDebugEnabled())
+                            log.debug("Replay: " + msg);
+
                         DelayableCommunicationSpi.super.sendMessage(node, msg, ackC);
                     }
                 });
+
+                assert prevValue == null : "Duplicate message registered to [" + node.id() + "]";
             }
             else
                 try {
@@ -94,10 +117,10 @@ public class GridCacheRabalancingDelayedPartitionMapExchangeSelfTest extends Gri
     }
 
     /**
-     * @throws Exception e.
+     * @throws Exception e if failed.
      */
     public void test() throws Exception {
-        IgniteKernal ignite = (IgniteKernal)startGrid(0);
+        IgniteEx ignite = startGrid(0);
 
         CacheConfiguration<Integer, Integer> cfg = new CacheConfiguration<>(DEFAULT_CACHE_NAME);
 
@@ -144,10 +167,7 @@ public class GridCacheRabalancingDelayedPartitionMapExchangeSelfTest extends Gri
 
         awaitPartitionMapExchange();
 
-        for (Runnable r : rs.values())
-            r.run();
-
-        U.sleep(10000); // Enough time to process delayed GridDhtPartitionsFullMessages.
+        replayMessages();
 
         stopGrid(3); // Forces exchange at all nodes and cause assertion failure in case obsolete partition map accepted.
 
@@ -167,6 +187,22 @@ public class GridCacheRabalancingDelayedPartitionMapExchangeSelfTest extends Gri
         assert grid(2).context().cache().context().exchange().readyAffinityVersion().topologyVersion() > topVer2;
     }
 
+    /**
+     * Replays all saved messages from map, actual sent is performed.
+     *
+     * @throws IgniteInterruptedCheckedException If interrupted.
+     */
+    private void replayMessages() throws IgniteInterruptedCheckedException {
+        record = false;
+
+        for (Runnable r : rs.values())
+            r.run(); // Causes real messages sending.
+
+        assertTrue(replay.compareAndSet(false, true));
+
+        U.sleep(10000); // Enough time to process delayed GridDhtPartitionsFullMessages.
+    }
+
     /** {@inheritDoc} */
     @Override protected void afterTest() throws Exception {
         super.afterTest();

http://git-wip-us.apache.org/repos/asf/ignite/blob/eb9d06d9/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
index dc7e89d..c2cf41c 100755
--- a/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/testframework/junits/common/GridCommonAbstractTest.java
@@ -520,7 +520,8 @@ public abstract class GridCommonAbstractTest extends GridAbstractTest {
     /**
      * @param waitEvicts If {@code true} will wait for evictions finished.
      * @param waitNode2PartUpdate If {@code true} will wait for nodes node2part info update finished.
-     * @param nodes Optional nodes.
+     * @param nodes Optional nodes. If {@code null} method will wait for all nodes, for non null collection nodes will
+     *      be filtered
      * @throws InterruptedException If interrupted.
      */
     @SuppressWarnings("BusyWait")
@@ -542,7 +543,8 @@ public abstract class GridCommonAbstractTest extends GridAbstractTest {
     /**
      * @param waitEvicts If {@code true} will wait for evictions finished.
      * @param waitNode2PartUpdate If {@code true} will wait for nodes node2part info update finished.
-     * @param nodes Optional nodes.
+     * @param nodes Optional nodes. If {@code null} method will wait for all nodes, for non null collection nodes will
+     *      be filtered
      * @param printPartState If {@code true} will print partition state if evictions not happened.
      * @throws InterruptedException If interrupted.
      */


[46/50] [abbrv] ignite git commit: IGNITE-5769 Abstract away .NET->Java calls

Posted by yz...@apache.org.
IGNITE-5769 Abstract away .NET->Java calls

This closes #2352


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

Branch: refs/heads/ignite-5658
Commit: 89bba2fa2c423d5713c8412ba0069b869005694c
Parents: 47fea40
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Fri Jul 28 10:06:16 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Fri Jul 28 10:06:16 2017 +0300

----------------------------------------------------------------------
 .../platform/PlatformTargetProxy.java           |   11 +
 .../platform/PlatformTargetProxyImpl.java       |   79 +-
 .../plugin/PlatformTestPluginTarget.java        |    7 +-
 .../cpp/jni/include/ignite/jni/exports.h        |    1 +
 .../platforms/cpp/jni/include/ignite/jni/java.h |    5 +-
 modules/platforms/cpp/jni/project/vs/module.def |    1 +
 modules/platforms/cpp/jni/src/exports.cpp       |    4 +
 modules/platforms/cpp/jni/src/java.cpp          |   19 +-
 .../Plugin/PluginTest.cs                        |   13 +-
 .../Apache.Ignite.Core.Tests/TestUtils.cs       |    7 +-
 .../Apache.Ignite.Core.csproj                   |    5 +-
 .../dotnet/Apache.Ignite.Core/Ignition.cs       |    9 +-
 .../Impl/Binary/BinaryProcessor.cs              |    6 +-
 .../Impl/Binary/BinaryWriterExtensions.cs       |  107 ++
 .../Cache/Affinity/PlatformAffinityFunction.cs  |    7 +-
 .../Impl/Cache/CacheAffinityImpl.cs             |   18 +-
 .../Impl/Cache/CacheEnumerator.cs               |    8 +-
 .../Apache.Ignite.Core/Impl/Cache/CacheImpl.cs  |  113 +-
 .../Impl/Cache/Query/AbstractQueryCursor.cs     |   12 +-
 .../Continuous/ContinuousQueryHandleImpl.cs     |   12 +-
 .../Impl/Cache/Query/FieldsQueryCursor.cs       |    6 +-
 .../Impl/Cache/Query/QueryCursor.cs             |    5 +-
 .../Impl/Cluster/ClusterGroupImpl.cs            |   76 +-
 .../Impl/Common/DelegateTypeDescriptor.cs       |    9 +-
 .../Impl/Common/Listenable.cs                   |    8 +-
 .../Impl/Compute/ComputeImpl.cs                 |   12 +-
 .../Impl/DataStructures/AtomicLong.cs           |    9 +-
 .../Impl/DataStructures/AtomicReference.cs      |    8 +-
 .../Impl/DataStructures/AtomicSequence.cs       |    9 +-
 .../Impl/Datastream/DataStreamerImpl.cs         |    8 +-
 .../Impl/Datastream/StreamReceiverHolder.cs     |   13 +-
 .../Apache.Ignite.Core/Impl/Events/Events.cs    |   11 +-
 .../Impl/IPlatformTargetInternal.cs             |  102 ++
 .../dotnet/Apache.Ignite.Core/Impl/Ignite.cs    |   48 +-
 .../Impl/Messaging/Messaging.cs                 |   10 +-
 .../Impl/PlatformDisposableTargetAdapter.cs     |   75 ++
 .../Impl/PlatformJniTarget.cs                   |  536 +++++++++
 .../Apache.Ignite.Core/Impl/PlatformTarget.cs   | 1086 ------------------
 .../Impl/PlatformTargetAdapter.cs               |  534 +++++++++
 .../Impl/Services/Services.cs                   |   19 +-
 .../Impl/Transactions/TransactionsImpl.cs       |   29 +-
 .../Impl/Unmanaged/IgniteJniNativeMethods.cs    |    3 +
 .../Impl/Unmanaged/UnmanagedCallbacks.cs        |   10 +-
 .../Impl/Unmanaged/UnmanagedUtils.cs            |    7 +
 .../Interop/IPlatformTarget.cs                  |   15 +
 45 files changed, 1690 insertions(+), 1402 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformTargetProxy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformTargetProxy.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformTargetProxy.java
index 1ee57cb..29de311 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformTargetProxy.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformTargetProxy.java
@@ -105,6 +105,17 @@ public interface PlatformTargetProxy {
     void inStreamAsync(int type, long memPtr) throws Exception;
 
     /**
+     * Asynchronous operation accepting memory stream and returning PlatformListenableTarget.
+     * Supports cancellable async operations.
+     *
+     * @param type Operation type.
+     * @param memPtr Memory pointer.
+     * @return Result.
+     * @throws Exception If case of failure.
+     */
+    Object inStreamOutObjectAsync(int type, long memPtr) throws Exception;
+
+    /**
      * Returns the underlying target.
      *
      * @return Underlying target.

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformTargetProxyImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformTargetProxyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformTargetProxyImpl.java
index 44044b1..b472275 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformTargetProxyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/PlatformTargetProxyImpl.java
@@ -23,6 +23,8 @@ import org.apache.ignite.internal.binary.BinaryRawWriterEx;
 import org.apache.ignite.internal.processors.platform.memory.PlatformMemory;
 import org.apache.ignite.internal.processors.platform.memory.PlatformOutputStream;
 import org.apache.ignite.internal.processors.platform.utils.PlatformFutureUtils;
+import org.apache.ignite.internal.processors.platform.utils.PlatformListenable;
+import org.apache.ignite.internal.processors.platform.utils.PlatformListenableTarget;
 import org.apache.ignite.lang.IgniteFuture;
 
 /**
@@ -109,37 +111,16 @@ public class PlatformTargetProxyImpl implements PlatformTargetProxy {
 
     /** {@inheritDoc} */
     @Override public void inStreamAsync(int type, long memPtr) throws Exception {
-        try (PlatformMemory mem = platformCtx.memory().get(memPtr)) {
-            BinaryRawReaderEx reader = platformCtx.reader(mem);
-
-            long futId = reader.readLong();
-            int futTyp = reader.readInt();
-
-            final PlatformAsyncResult res = target.processInStreamAsync(type, reader);
-
-            if (res == null)
-                throw new IgniteException("PlatformTarget.processInStreamAsync should not return null.");
-
-            IgniteFuture fut = res.future();
+        inStreamOutListenableAsync(type, memPtr);
+    }
 
-            if (fut == null)
-                throw new IgniteException("PlatformAsyncResult.future() should not return null.");
+    /** {@inheritDoc} */
+    @Override public Object inStreamOutObjectAsync(int type, long memPtr) throws Exception {
+        PlatformListenable listenable = inStreamOutListenableAsync(type, memPtr);
 
-            PlatformFutureUtils.listen(platformCtx, fut, futId, futTyp, new PlatformFutureUtils.Writer() {
-                /** {@inheritDoc} */
-                @Override public void write(BinaryRawWriterEx writer, Object obj, Throwable err) {
-                    res.write(writer, obj);
-                }
+        PlatformListenableTarget target = new PlatformListenableTarget(listenable, platformCtx);
 
-                /** {@inheritDoc} */
-                @Override public boolean canWrite(Object obj, Throwable err) {
-                    return err == null;
-                }
-            }, target);
-        }
-        catch (Exception e) {
-            throw target.convertException(e);
-        }
+        return wrapProxy(target);
     }
 
     /** {@inheritDoc} */
@@ -234,4 +215,46 @@ public class PlatformTargetProxyImpl implements PlatformTargetProxy {
     private PlatformTarget unwrapProxy(Object obj) {
         return obj == null ? null : ((PlatformTargetProxyImpl)obj).target;
     }
+
+    /**
+     * Performs asyncronous operation.
+     *
+     * @param type Type.
+     * @param memPtr Stream pointer.
+     * @return Listenable.
+     * @throws Exception On error.
+     */
+    private PlatformListenable inStreamOutListenableAsync(int type, long memPtr) throws Exception {
+        try (PlatformMemory mem = platformCtx.memory().get(memPtr)) {
+            BinaryRawReaderEx reader = platformCtx.reader(mem);
+
+            long futId = reader.readLong();
+            int futTyp = reader.readInt();
+
+            final PlatformAsyncResult res = target.processInStreamAsync(type, reader);
+
+            if (res == null)
+                throw new IgniteException("PlatformTarget.processInStreamAsync should not return null.");
+
+            IgniteFuture fut = res.future();
+
+            if (fut == null)
+                throw new IgniteException("PlatformAsyncResult.future() should not return null.");
+
+            return PlatformFutureUtils.listen(platformCtx, fut, futId, futTyp, new PlatformFutureUtils.Writer() {
+                /** {@inheritDoc} */
+                @Override public void write(BinaryRawWriterEx writer, Object obj, Throwable err) {
+                    res.write(writer, obj);
+                }
+
+                /** {@inheritDoc} */
+                @Override public boolean canWrite(Object obj, Throwable err) {
+                    return err == null;
+                }
+            }, target);
+        }
+        catch (Exception e) {
+            throw target.convertException(e);
+        }
+    }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/core/src/test/java/org/apache/ignite/platform/plugin/PlatformTestPluginTarget.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/platform/plugin/PlatformTestPluginTarget.java b/modules/core/src/test/java/org/apache/ignite/platform/plugin/PlatformTestPluginTarget.java
index 7e69425..8c1cbe9 100644
--- a/modules/core/src/test/java/org/apache/ignite/platform/plugin/PlatformTestPluginTarget.java
+++ b/modules/core/src/test/java/org/apache/ignite/platform/plugin/PlatformTestPluginTarget.java
@@ -146,7 +146,12 @@ class PlatformTestPluginTarget implements PlatformTarget {
             case 1: {
                 // Async upper case.
                 final String val = reader.readString();
-                final GridFutureAdapter<String> fa = new GridFutureAdapter<>();
+
+                final GridFutureAdapter<String> fa = new GridFutureAdapter<String>() {
+                    @Override public boolean cancel() throws IgniteCheckedException {
+                        return onCancelled();
+                    }
+                };
 
                 new Thread(new Runnable() {
                     @Override public void run() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 ea0c32a..0580d19 100644
--- a/modules/platforms/cpp/jni/include/ignite/jni/exports.h
+++ b/modules/platforms/cpp/jni/include/ignite/jni/exports.h
@@ -38,6 +38,7 @@ extern "C" {
     void IGNITE_CALL IgniteTargetOutStream(gcj::JniContext* ctx, void* obj, int opType, long long memPtr);
     void* IGNITE_CALL IgniteTargetOutObject(gcj::JniContext* ctx, void* obj, int opType);
     void IGNITE_CALL IgniteTargetInStreamAsync(gcj::JniContext* ctx, void* obj, int opType, long long memPtr);
+    void* IGNITE_CALL IgniteTargetInStreamOutObjectAsync(gcj::JniContext* ctx, void* obj, int opType, long long memPtr);
 
     void* IGNITE_CALL IgniteAcquire(gcj::JniContext* ctx, void* obj);
     void IGNITE_CALL IgniteRelease(void* obj);

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 c170a5b..c713e81 100644
--- a/modules/platforms/cpp/jni/include/ignite/jni/java.h
+++ b/modules/platforms/cpp/jni/include/ignite/jni/java.h
@@ -173,9 +173,6 @@ namespace ignite
                 jmethodID m_PlatformIgnition_stop;
                 jmethodID m_PlatformIgnition_stopAll;
 
-                jclass c_PlatformProcessor;
-                jmethodID m_PlatformProcessor_releaseStart;
-
                 jclass c_PlatformTarget;
                 jmethodID m_PlatformTarget_inLongOutLong;
                 jmethodID m_PlatformTarget_inStreamOutLong;
@@ -183,6 +180,7 @@ namespace ignite
                 jmethodID m_PlatformTarget_outStream;
                 jmethodID m_PlatformTarget_outObject;
                 jmethodID m_PlatformTarget_inStreamAsync;
+                jmethodID m_PlatformTarget_inStreamOutObjectAsync;
                 jmethodID m_PlatformTarget_inStreamOutStream;
                 jmethodID m_PlatformTarget_inObjectStreamOutObjectStream;
 
@@ -325,6 +323,7 @@ namespace ignite
                 void TargetOutStream(jobject obj, int opType, long long memPtr, JniErrorInfo* errInfo = NULL);
                 jobject TargetOutObject(jobject obj, int opType, JniErrorInfo* errInfo = NULL);
                 void TargetInStreamAsync(jobject obj, int type, long long memPtr, JniErrorInfo* errInfo = NULL);
+                jobject TargetInStreamOutObjectAsync(jobject obj, int type, long long memPtr, JniErrorInfo* errInfo = NULL);
 
                 jobject CacheOutOpQueryCursor(jobject obj, int type, long long memPtr, JniErrorInfo* errInfo = NULL);
                 jobject CacheOutOpContinuousQuery(jobject obj, int type, long long memPtr, JniErrorInfo* errInfo = NULL);

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 53e7e42..1407f82 100644
--- a/modules/platforms/cpp/jni/project/vs/module.def
+++ b/modules/platforms/cpp/jni/project/vs/module.def
@@ -12,6 +12,7 @@ IgniteTargetInStreamOutStream @20
 IgniteTargetInObjectStreamOutObjectStream @21
 IgniteTargetInLongOutLong @24
 IgniteTargetInStreamAsync @25
+IgniteTargetInStreamOutObjectAsync @26
 IgniteAcquire @80
 IgniteRelease @81
 IgniteThrowToJava @82 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 9b7defd..aeb68ab 100644
--- a/modules/platforms/cpp/jni/src/exports.cpp
+++ b/modules/platforms/cpp/jni/src/exports.cpp
@@ -74,6 +74,10 @@ extern "C" {
         ctx->TargetInStreamAsync(static_cast<jobject>(obj), opType, memPtr);
     }
 
+    void* IGNITE_CALL IgniteTargetInStreamOutObjectAsync(gcj::JniContext* ctx, void* obj, int opType, long long memPtr) {
+        return ctx->TargetInStreamOutObjectAsync(static_cast<jobject>(obj), opType, memPtr);
+    }
+
     void* IGNITE_CALL IgniteAcquire(gcj::JniContext* ctx, void* obj) {
         return ctx->Acquire(static_cast<jobject>(obj));
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 7eadec0..ac4ba63 100644
--- a/modules/platforms/cpp/jni/src/java.cpp
+++ b/modules/platforms/cpp/jni/src/java.cpp
@@ -221,9 +221,6 @@ namespace ignite
 
             const char* C_PLATFORM_NO_CALLBACK_EXCEPTION = "org/apache/ignite/internal/processors/platform/PlatformNoCallbackException";
 
-            const char* C_PLATFORM_PROCESSOR = "org/apache/ignite/internal/processors/platform/PlatformProcessor";
-            JniMethod M_PLATFORM_PROCESSOR_RELEASE_START = JniMethod("releaseStart", "()V", false);
-
             const char* C_PLATFORM_TARGET = "org/apache/ignite/internal/processors/platform/PlatformTargetProxy";
             JniMethod M_PLATFORM_TARGET_IN_LONG_OUT_LONG = JniMethod("inLongOutLong", "(IJ)J", false);
             JniMethod M_PLATFORM_TARGET_IN_STREAM_OUT_LONG = JniMethod("inStreamOutLong", "(IJ)J", false);
@@ -233,6 +230,7 @@ namespace ignite
             JniMethod M_PLATFORM_TARGET_OUT_STREAM = JniMethod("outStream", "(IJ)V", false);
             JniMethod M_PLATFORM_TARGET_OUT_OBJECT = JniMethod("outObject", "(I)Ljava/lang/Object;", false);
             JniMethod M_PLATFORM_TARGET_IN_STREAM_ASYNC = JniMethod("inStreamAsync", "(IJ)V", false);
+            JniMethod M_PLATFORM_TARGET_IN_STREAM_OUT_OBJECT_ASYNC = JniMethod("inStreamOutObjectAsync", "(IJ)Ljava/lang/Object;", false);
 
             const char* C_PLATFORM_CALLBACK_UTILS = "org/apache/ignite/internal/processors/platform/callback/PlatformCallbackUtils";
 
@@ -449,9 +447,6 @@ namespace ignite
                 m_PlatformIgnition_stop = FindMethod(env, c_PlatformIgnition, M_PLATFORM_IGNITION_STOP);
                 m_PlatformIgnition_stopAll = FindMethod(env, c_PlatformIgnition, M_PLATFORM_IGNITION_STOP_ALL);
 
-                c_PlatformProcessor = FindClass(env, C_PLATFORM_PROCESSOR);
-                m_PlatformProcessor_releaseStart = FindMethod(env, c_PlatformProcessor, M_PLATFORM_PROCESSOR_RELEASE_START);
-
                 c_PlatformTarget = FindClass(env, C_PLATFORM_TARGET);
                 m_PlatformTarget_inLongOutLong = FindMethod(env, c_PlatformTarget, M_PLATFORM_TARGET_IN_LONG_OUT_LONG);
                 m_PlatformTarget_inStreamOutLong = FindMethod(env, c_PlatformTarget, M_PLATFORM_TARGET_IN_STREAM_OUT_LONG);
@@ -461,6 +456,7 @@ namespace ignite
                 m_PlatformTarget_inStreamOutStream = FindMethod(env, c_PlatformTarget, M_PLATFORM_TARGET_IN_STREAM_OUT_STREAM);
                 m_PlatformTarget_inObjectStreamOutObjectStream = FindMethod(env, c_PlatformTarget, M_PLATFORM_TARGET_IN_OBJECT_STREAM_OUT_OBJECT_STREAM);
                 m_PlatformTarget_inStreamAsync = FindMethod(env, c_PlatformTarget, M_PLATFORM_TARGET_IN_STREAM_ASYNC);
+                m_PlatformTarget_inStreamOutObjectAsync = FindMethod(env, c_PlatformTarget, M_PLATFORM_TARGET_IN_STREAM_OUT_OBJECT_ASYNC);
 
                 c_PlatformUtils = FindClass(env, C_PLATFORM_UTILS);
                 m_PlatformUtils_reallocate = FindMethod(env, c_PlatformUtils, M_PLATFORM_UTILS_REALLOC);
@@ -473,7 +469,6 @@ namespace ignite
             void JniMembers::Destroy(JNIEnv* env) {
                 DeleteClass(env, c_IgniteException);
                 DeleteClass(env, c_PlatformIgnition);
-                DeleteClass(env, c_PlatformProcessor);
                 DeleteClass(env, c_PlatformTarget);
                 DeleteClass(env, c_PlatformUtils);
             }
@@ -894,6 +889,16 @@ namespace ignite
                 ExceptionCheck(env, err);
             }
 
+            jobject JniContext::TargetInStreamOutObjectAsync(jobject obj, int opType, long long memPtr, JniErrorInfo* err) {
+                JNIEnv* env = Attach();
+
+                jobject res = env->CallObjectMethod(obj, jvm->GetMembers().m_PlatformTarget_inStreamOutObjectAsync, opType, memPtr);
+
+                ExceptionCheck(env, err);
+
+                return LocalToGlobal(env, res);
+            }
+
             jobject JniContext::CacheOutOpQueryCursor(jobject obj, int type, long long memPtr, JniErrorInfo* err) {
                 JNIEnv* env = Attach();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Plugin/PluginTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Plugin/PluginTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Plugin/PluginTest.cs
index 00b1cca..1cb2fae 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Plugin/PluginTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Plugin/PluginTest.cs
@@ -21,6 +21,8 @@ namespace Apache.Ignite.Core.Tests.Plugin
     using System.Collections.Generic;
     using System.IO;
     using System.Linq;
+    using System.Threading;
+    using System.Threading.Tasks;
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Common;
     using Apache.Ignite.Core.Interop;
@@ -142,13 +144,22 @@ namespace Apache.Ignite.Core.Tests.Plugin
             Assert.IsTrue(task.IsCompleted);
             Assert.AreEqual("FOO", asyncRes);
 
+            // Async operation with cancellation.
+            var cts = new CancellationTokenSource();
+            task = target.DoOutOpAsync(1, w => w.WriteString("foo"), r => r.ReadString(), cts.Token);
+            Assert.IsFalse(task.IsCompleted);
+            cts.Cancel();
+            Assert.IsTrue(task.IsCanceled);
+            var aex = Assert.Throws<AggregateException>(() => { asyncRes = task.Result; });
+            Assert.IsInstanceOf<TaskCanceledException>(aex.GetBaseException());
+
             // Async operation with exception in entry point.
             Assert.Throws<TestIgnitePluginException>(() => target.DoOutOpAsync<object>(2, null, null));
 
             // Async operation with exception in future.
             var errTask = target.DoOutOpAsync<object>(3, null, null);
             Assert.IsFalse(errTask.IsCompleted);
-            var aex = Assert.Throws<AggregateException>(() => errTask.Wait());
+            aex = Assert.Throws<AggregateException>(() => errTask.Wait());
             Assert.IsInstanceOf<IgniteException>(aex.InnerExceptions.Single());
 
             // Throws custom mapped exception.

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs
index 6e0a497..4b171b0 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/TestUtils.cs
@@ -365,12 +365,11 @@ namespace Apache.Ignite.Core.Tests
             };
 
             var proc = System.Diagnostics.Process.Start(procStart);
-
             Assert.IsNotNull(proc);
 
-            Console.WriteLine(proc.StandardOutput.ReadToEnd());
-            Console.WriteLine(proc.StandardError.ReadToEnd());
-            Assert.IsTrue(proc.WaitForExit(15000));
+            IgniteProcess.AttachProcessConsoleReader(proc);
+
+            Assert.IsTrue(proc.WaitForExit(19000));
             Assert.AreEqual(0, proc.ExitCode);
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 76132c3..c444ed0 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Apache.Ignite.Core.csproj
@@ -99,7 +99,10 @@
     <Compile Include="Cache\IMemoryMetrics.cs" />
     <Compile Include="Common\ExceptionFactory.cs" />
     <Compile Include="Configuration\Package-Info.cs" />
+    <Compile Include="Impl\IPlatformTargetInternal.cs" />
     <Compile Include="Impl\PersistentStore\PersistentStoreMetrics.cs" />
+    <Compile Include="Impl\PlatformDisposableTargetAdapter.cs" />
+    <Compile Include="Impl\PlatformJniTarget.cs" />
     <Compile Include="PersistentStore\IPersistentStoreMetrics.cs" />
     <Compile Include="PersistentStore\Package-Info.cs" />
     <Compile Include="PersistentStore\PersistentStoreConfiguration.cs" />
@@ -385,7 +388,7 @@
     <Compile Include="Impl\Ignite.cs" />
     <Compile Include="Impl\IgniteManager.cs" />
     <Compile Include="Impl\Log\JavaLogger.cs" />
-    <Compile Include="Impl\PlatformTarget.cs" />
+    <Compile Include="Impl\PlatformTargetAdapter.cs" />
     <Compile Include="Impl\IgniteUtils.cs" />
     <Compile Include="Impl\Handle\Handle.cs" />
     <Compile Include="Impl\Handle\HandleRegistry.cs" />

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Ignition.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Ignition.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Ignition.cs
index 44ebef3..568eea7 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Ignition.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Ignition.cs
@@ -239,7 +239,7 @@ namespace Apache.Ignite.Core
                 // 3. Create startup object which will guide us through the rest of the process.
                 _startup = new Startup(cfg, cbs);
 
-                IUnmanagedTarget interopProc = null;
+                PlatformJniTarget interopProc = null;
 
                 try
                 {
@@ -249,7 +249,7 @@ namespace Apache.Ignite.Core
 
                     // 5. At this point start routine is finished. We expect STARTUP object to have all necessary data.
                     var node = _startup.Ignite;
-                    interopProc = node.InteropProcessor;
+                    interopProc = (PlatformJniTarget)node.InteropProcessor;
 
                     var javaLogger = log as JavaLogger;
                     if (javaLogger != null)
@@ -279,7 +279,7 @@ namespace Apache.Ignite.Core
 
                     // 2. Stop Ignite node if it was started.
                     if (interopProc != null)
-                        UU.IgnitionStop(interopProc.Context, gridName, true);
+                        UU.IgnitionStop(interopProc.Target.Context, gridName, true);
 
                     // 3. Throw error further (use startup error if exists because it is more precise).
                     if (_startup.Error != null)
@@ -466,7 +466,8 @@ namespace Apache.Ignite.Core
                 if (Nodes.ContainsKey(new NodeKey(name)))
                     throw new IgniteException("Ignite with the same name already started: " + name);
 
-                _startup.Ignite = new Ignite(_startup.Configuration, _startup.Name, interopProc, _startup.Marshaller, 
+                _startup.Ignite = new Ignite(_startup.Configuration, _startup.Name,
+                    new PlatformJniTarget(interopProc, _startup.Marshaller), _startup.Marshaller,
                     _startup.LifecycleHandlers, _startup.Callbacks);
             }
             catch (Exception e)

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryProcessor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryProcessor.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryProcessor.cs
index b8937c9..69056b3 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryProcessor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryProcessor.cs
@@ -21,12 +21,11 @@ namespace Apache.Ignite.Core.Impl.Binary
     using System.Diagnostics;
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Impl.Binary.Metadata;
-    using Apache.Ignite.Core.Impl.Unmanaged;
 
     /// <summary>
     /// Binary metadata processor, delegates to PlatformBinaryProcessor in Java.
     /// </summary>
-    internal class BinaryProcessor : PlatformTarget
+    internal class BinaryProcessor : PlatformTargetAdapter
     {
         /// <summary>
         /// Op codes.
@@ -46,8 +45,7 @@ namespace Apache.Ignite.Core.Impl.Binary
         /// Initializes a new instance of the <see cref="BinaryProcessor"/> class.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
-        public BinaryProcessor(IUnmanagedTarget target, Marshaller marsh) : base(target, marsh)
+        public BinaryProcessor(IPlatformTargetInternal target) : base(target)
         {
             // No-op.
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriterExtensions.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriterExtensions.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriterExtensions.cs
index 64bfa35..3dc8a96 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriterExtensions.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Binary/BinaryWriterExtensions.cs
@@ -18,6 +18,8 @@
 namespace Apache.Ignite.Core.Impl.Binary
 {
     using System;
+    using System.Collections.Generic;
+    using System.IO;
     using Apache.Ignite.Core.Binary;
 
     /// <summary>
@@ -75,5 +77,110 @@ namespace Apache.Ignite.Core.Impl.Binary
                 writer.WriteBoolean(false);
         }
 
+        /// <summary>
+        /// Write collection.
+        /// </summary>
+        /// <param name="writer">Writer.</param>
+        /// <param name="vals">Values.</param>
+        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <returns>The same writer for chaining.</returns>
+        private static void WriteCollection<T1, T2>(this BinaryWriter writer, ICollection<T1> vals, 
+            Func<T1, T2> selector)
+        {
+            writer.WriteInt(vals.Count);
+
+            if (selector == null)
+            {
+                foreach (var val in vals)
+                    writer.Write(val);
+            }
+            else
+            {
+                foreach (var val in vals)
+                    writer.Write(selector(val));
+            }
+        }
+
+        /// <summary>
+        /// Write enumerable.
+        /// </summary>
+        /// <param name="writer">Writer.</param>
+        /// <param name="vals">Values.</param>
+        /// <returns>The same writer for chaining.</returns>
+        public static void WriteEnumerable<T>(this BinaryWriter writer, IEnumerable<T> vals)
+        {
+            WriteEnumerable<T, T>(writer, vals, null);
+        }
+
+        /// <summary>
+        /// Write enumerable.
+        /// </summary>
+        /// <param name="writer">Writer.</param>
+        /// <param name="vals">Values.</param>
+        /// <param name="selector">A transform function to apply to each element.</param>
+        /// <returns>The same writer for chaining.</returns>
+        public static void WriteEnumerable<T1, T2>(this BinaryWriter writer, IEnumerable<T1> vals, 
+            Func<T1, T2> selector)
+        {
+            var col = vals as ICollection<T1>;
+
+            if (col != null)
+            {
+                WriteCollection(writer, col, selector);
+                return;
+            }
+
+            var stream = writer.Stream;
+
+            var pos = stream.Position;
+
+            stream.Seek(4, SeekOrigin.Current);
+
+            var size = 0;
+
+            if (selector == null)
+            {
+                foreach (var val in vals)
+                {
+                    writer.Write(val);
+
+                    size++;
+                }
+            }
+            else
+            {
+                foreach (var val in vals)
+                {
+                    writer.Write(selector(val));
+
+                    size++;
+                }
+            }
+
+            stream.WriteInt(pos, size);
+        }
+
+        /// <summary>
+        /// Write dictionary.
+        /// </summary>
+        /// <param name="writer">Writer.</param>
+        /// <param name="vals">Values.</param>
+        public static void WriteDictionary<T1, T2>(this BinaryWriter writer, IEnumerable<KeyValuePair<T1, T2>> vals)
+        {
+            var pos = writer.Stream.Position;
+            writer.WriteInt(0);  // Reserve count.
+
+            int cnt = 0;
+
+            foreach (var pair in vals)
+            {
+                writer.Write(pair.Key);
+                writer.Write(pair.Value);
+
+                cnt++;
+            }
+
+            writer.Stream.WriteInt(pos, cnt);
+        }
     }
 }
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Affinity/PlatformAffinityFunction.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Affinity/PlatformAffinityFunction.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Affinity/PlatformAffinityFunction.cs
index d335804..08c31a6 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Affinity/PlatformAffinityFunction.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Affinity/PlatformAffinityFunction.cs
@@ -21,13 +21,11 @@ namespace Apache.Ignite.Core.Impl.Cache.Affinity
     using System.Collections.Generic;
     using Apache.Ignite.Core.Cache.Affinity;
     using Apache.Ignite.Core.Cluster;
-    using Apache.Ignite.Core.Impl.Binary;
-    using Apache.Ignite.Core.Impl.Unmanaged;
 
     /// <summary>
     /// Affinity function that delegates to Java.
     /// </summary>
-    internal class PlatformAffinityFunction : PlatformTarget, IAffinityFunction
+    internal class PlatformAffinityFunction : PlatformTargetAdapter, IAffinityFunction
     {
         /** Opcodes. */
         private enum  Op
@@ -41,8 +39,7 @@ namespace Apache.Ignite.Core.Impl.Cache.Affinity
         /// Initializes a new instance of the <see cref="PlatformAffinityFunction"/> class.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
-        public PlatformAffinityFunction(IUnmanagedTarget target, Marshaller marsh) : base(target, marsh)
+        public PlatformAffinityFunction(IPlatformTargetInternal target) : base(target)
         {
             // No-op.
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheAffinityImpl.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheAffinityImpl.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheAffinityImpl.cs
index f09a119..a2bba29 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheAffinityImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheAffinityImpl.cs
@@ -19,19 +19,16 @@ namespace Apache.Ignite.Core.Impl.Cache
 {
     using System;
     using System.Collections.Generic;
-    using System.Diagnostics;
     using Apache.Ignite.Core.Cache;
     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.Impl.Unmanaged;
-    using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils;
 
     /// <summary>
     /// Cache affinity implementation.
     /// </summary>
-    internal class CacheAffinityImpl : PlatformTarget, ICacheAffinity
+    internal class CacheAffinityImpl : PlatformTargetAdapter, ICacheAffinity
     {
         /** */
         private const int OpAffinityKey = 1;
@@ -88,17 +85,12 @@ namespace Apache.Ignite.Core.Impl.Cache
         /// Initializes a new instance of the <see cref="CacheAffinityImpl" /> class.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
         /// <param name="keepBinary">Keep binary flag.</param>
-        /// <param name="ignite">Grid.</param>
-        public CacheAffinityImpl(IUnmanagedTarget target, Marshaller marsh, bool keepBinary, 
-            Ignite ignite) : base(target, marsh)
+        public CacheAffinityImpl(IPlatformTargetInternal target, bool keepBinary) : base(target)
         {
             _keepBinary = keepBinary;
 
-            Debug.Assert(ignite != null);
-            
-            _ignite = ignite;
+            _ignite = target.Marshaller.Ignite;
         }
 
         /** <inheritDoc /> */
@@ -182,7 +174,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         {
             IgniteArgumentCheck.NotNull(keys, "keys");
 
-            return DoOutInOp(OpMapKeysToNodes, w => WriteEnumerable(w, keys),
+            return DoOutInOp(OpMapKeysToNodes, w => w.WriteEnumerable(keys),
                 reader => ReadDictionary(reader, ReadNode, r => (IList<TK>) r.ReadCollectionAsList<TK>()));
         }
 
@@ -214,7 +206,7 @@ namespace Apache.Ignite.Core.Impl.Cache
             IgniteArgumentCheck.NotNull(parts, "parts");
 
             return DoOutInOp(OpMapPartitionsToNodes,
-                w => WriteEnumerable(w, parts),
+                w => w.WriteEnumerable(parts),
                 reader => ReadDictionary(reader, r => r.ReadInt(), ReadNode));
         }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEnumerator.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEnumerator.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEnumerator.cs
index e2b8350..2860bb6 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEnumerator.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheEnumerator.cs
@@ -21,14 +21,12 @@ namespace Apache.Ignite.Core.Impl.Cache
     using System.Collections;
     using System.Collections.Generic;
     using Apache.Ignite.Core.Cache;
-    using Apache.Ignite.Core.Impl.Binary;
     using Apache.Ignite.Core.Impl.Binary.IO;
-    using Apache.Ignite.Core.Impl.Unmanaged;
 
     /// <summary>
     /// Real cache enumerator communicating with Java.
     /// </summary>
-    internal class CacheEnumerator<TK, TV> : PlatformDisposableTarget, IEnumerator<ICacheEntry<TK, TV>>
+    internal class CacheEnumerator<TK, TV> : PlatformDisposableTargetAdapter, IEnumerator<ICacheEntry<TK, TV>>
     {
         /** Operation: next value. */
         private const int OpNext = 1;
@@ -43,10 +41,8 @@ namespace Apache.Ignite.Core.Impl.Cache
         /// Constructor.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
         /// <param name="keepBinary">Keep binary flag.</param>
-        public CacheEnumerator(IUnmanagedTarget target, Marshaller marsh, bool keepBinary) : 
-            base(target, marsh)
+        public CacheEnumerator(IPlatformTargetInternal target, bool keepBinary) : base(target)
         {
             _keepBinary = keepBinary;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs
index e6b2408..5789c8f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/CacheImpl.cs
@@ -20,7 +20,6 @@ namespace Apache.Ignite.Core.Impl.Cache
     using System;
     using System.Collections;
     using System.Collections.Generic;
-    using System.Diagnostics;
     using System.Diagnostics.CodeAnalysis;
     using System.Threading.Tasks;
     using Apache.Ignite.Core.Binary;
@@ -38,13 +37,12 @@ namespace Apache.Ignite.Core.Impl.Cache
     using Apache.Ignite.Core.Impl.Cluster;
     using Apache.Ignite.Core.Impl.Common;
     using Apache.Ignite.Core.Impl.Transactions;
-    using Apache.Ignite.Core.Impl.Unmanaged;
 
     /// <summary>
     /// Native cache wrapper.
     /// </summary>
     [SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")]
-    internal class CacheImpl<TK, TV> : PlatformTarget, ICache<TK, TV>, ICacheInternal, ICacheLockInternal
+    internal class CacheImpl<TK, TV> : PlatformTargetAdapter, ICache<TK, TV>, ICacheInternal, ICacheLockInternal
     {
         /** Ignite instance. */
         private readonly Ignite _ignite;
@@ -64,31 +62,32 @@ namespace Apache.Ignite.Core.Impl.Cache
         /** Transaction manager. */
         private readonly CacheTransactionManager _txManager;
 
+        /** Pre-allocated delegate. */
+        private readonly Func<IBinaryStream, Exception> _readException;
+
         /// <summary>
         /// Constructor.
         /// </summary>
-        /// <param name="grid">Grid.</param>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
         /// <param name="flagSkipStore">Skip store flag.</param>
         /// <param name="flagKeepBinary">Keep binary flag.</param>
         /// <param name="flagNoRetries">No-retries mode flag.</param>
         /// <param name="flagPartitionRecover">Partition recover mode flag.</param>
-        public CacheImpl(Ignite grid, IUnmanagedTarget target, Marshaller marsh,
+        public CacheImpl(IPlatformTargetInternal target,
             bool flagSkipStore, bool flagKeepBinary, bool flagNoRetries, bool flagPartitionRecover)
-            : base(target, marsh)
+            : base(target)
         {
-            Debug.Assert(grid != null);
-
-            _ignite = grid;
+            _ignite = target.Marshaller.Ignite;
             _flagSkipStore = flagSkipStore;
             _flagKeepBinary = flagKeepBinary;
             _flagNoRetries = flagNoRetries;
             _flagPartitionRecover = flagPartitionRecover;
 
             _txManager = GetConfiguration().AtomicityMode == CacheAtomicityMode.Transactional
-                ? new CacheTransactionManager(grid.GetTransactions())
+                ? new CacheTransactionManager(_ignite.GetTransactions())
                 : null;
+
+            _readException = stream => ReadException(Marshaller.StartUnmarshal(stream));
         }
 
         /** <inheritDoc /> */
@@ -172,7 +171,7 @@ namespace Apache.Ignite.Core.Impl.Cache
             if (_flagSkipStore)
                 return this;
 
-            return new CacheImpl<TK, TV>(_ignite, DoOutOpObject((int) CacheOp.WithSkipStore), Marshaller,
+            return new CacheImpl<TK, TV>(DoOutOpObject((int) CacheOp.WithSkipStore),
                 true, _flagKeepBinary, true, _flagPartitionRecover);
         }
 
@@ -196,7 +195,7 @@ namespace Apache.Ignite.Core.Impl.Cache
                 return result;
             }
 
-            return new CacheImpl<TK1, TV1>(_ignite, DoOutOpObject((int) CacheOp.WithKeepBinary), Marshaller,
+            return new CacheImpl<TK1, TV1>(DoOutOpObject((int) CacheOp.WithKeepBinary),
                 _flagSkipStore, true, _flagNoRetries, _flagPartitionRecover);
         }
 
@@ -207,7 +206,7 @@ namespace Apache.Ignite.Core.Impl.Cache
 
             var cache0 = DoOutOpObject((int)CacheOp.WithExpiryPolicy, w => ExpiryPolicySerializer.WritePolicy(w, plc));
 
-            return new CacheImpl<TK, TV>(_ignite, cache0, Marshaller, _flagSkipStore, _flagKeepBinary, 
+            return new CacheImpl<TK, TV>(cache0, _flagSkipStore, _flagKeepBinary, 
                 _flagNoRetries, _flagPartitionRecover);
         }
 
@@ -220,7 +219,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         /** <inheritDoc /> */
         public void LoadCache(ICacheEntryFilter<TK, TV> p, params object[] args)
         {
-            DoOutInOpX((int) CacheOp.LoadCache, writer => WriteLoadCacheData(writer, p, args), ReadException);
+            DoOutInOpX((int) CacheOp.LoadCache, writer => WriteLoadCacheData(writer, p, args), _readException);
         }
 
         /** <inheritDoc /> */
@@ -232,7 +231,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         /** <inheritDoc /> */
         public void LocalLoadCache(ICacheEntryFilter<TK, TV> p, params object[] args)
         {
-            DoOutInOpX((int) CacheOp.LocLoadCache, writer => WriteLoadCacheData(writer, p, args), ReadException);
+            DoOutInOpX((int) CacheOp.LocLoadCache, writer => WriteLoadCacheData(writer, p, args), _readException);
         }
 
         /** <inheritDoc /> */
@@ -281,7 +280,7 @@ namespace Apache.Ignite.Core.Impl.Cache
             return DoOutOpAsync(CacheOp.LoadAll, writer =>
             {
                 writer.WriteBoolean(replaceExistingValues);
-                WriteEnumerable(writer, keys);
+                writer.WriteEnumerable(keys);
             });
         }
 
@@ -306,7 +305,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         {
             IgniteArgumentCheck.NotNull(keys, "keys");
 
-            return DoOutOp(CacheOp.ContainsKeys, writer => WriteEnumerable(writer, keys));
+            return DoOutOp(CacheOp.ContainsKeys, writer => writer.WriteEnumerable(keys));
         }
 
         /** <inheritDoc /> */
@@ -314,7 +313,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         {
             IgniteArgumentCheck.NotNull(keys, "keys");
 
-            return DoOutOpAsync<bool>(CacheOp.ContainsKeysAsync, writer => WriteEnumerable(writer, keys));
+            return DoOutOpAsync<bool>(CacheOp.ContainsKeysAsync, writer => writer.WriteEnumerable(keys));
         }
 
         /** <inheritDoc /> */
@@ -342,7 +341,7 @@ namespace Apache.Ignite.Core.Impl.Cache
                     w.WriteInt(EncodePeekModes(modes));
                 },
                 (s, r) => r == True ? new CacheResult<TV>(Unmarshal<TV>(s)) : new CacheResult<TV>(),
-                ReadException);
+                _readException);
 
             value = res.Success ? res.Value : default(TV);
 
@@ -375,7 +374,7 @@ namespace Apache.Ignite.Core.Impl.Cache
                         throw GetKeyNotFoundException();
 
                     return Unmarshal<TV>(stream);
-                }, ReadException);
+                }, _readException);
         }
 
         /** <inheritDoc /> */
@@ -418,9 +417,9 @@ namespace Apache.Ignite.Core.Impl.Cache
             IgniteArgumentCheck.NotNull(keys, "keys");
 
             return DoOutInOpX((int) CacheOp.GetAll,
-                writer => WriteEnumerable(writer, keys),
+                writer => writer.WriteEnumerable(keys),
                 (s, r) => r == True ? ReadGetAllDictionary(Marshaller.StartUnmarshal(s, _flagKeepBinary)) : null,
-                ReadException);
+                _readException);
         }
 
         /** <inheritDoc /> */
@@ -428,7 +427,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         {
             IgniteArgumentCheck.NotNull(keys, "keys");
 
-            return DoOutOpAsync(CacheOp.GetAllAsync, w => WriteEnumerable(w, keys), r => ReadGetAllDictionary(r));
+            return DoOutOpAsync(CacheOp.GetAllAsync, w => w.WriteEnumerable(keys), r => ReadGetAllDictionary(r));
         }
 
         /** <inheritdoc /> */
@@ -631,7 +630,7 @@ namespace Apache.Ignite.Core.Impl.Cache
 
             StartTx();
 
-            DoOutOp(CacheOp.PutAll, writer => WriteDictionary(writer, vals));
+            DoOutOp(CacheOp.PutAll, writer => writer.WriteDictionary(vals));
         }
 
         /** <inheritDoc /> */
@@ -641,7 +640,7 @@ namespace Apache.Ignite.Core.Impl.Cache
 
             StartTx();
 
-            return DoOutOpAsync(CacheOp.PutAllAsync, writer => WriteDictionary(writer, vals));
+            return DoOutOpAsync(CacheOp.PutAllAsync, writer => writer.WriteDictionary(vals));
         }
 
         /** <inheritdoc /> */
@@ -649,7 +648,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         {
             IgniteArgumentCheck.NotNull(keys, "keys");
 
-            DoOutOp(CacheOp.LocEvict, writer => WriteEnumerable(writer, keys));
+            DoOutOp(CacheOp.LocEvict, writer => writer.WriteEnumerable(keys));
         }
 
         /** <inheritdoc /> */
@@ -685,7 +684,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         {
             IgniteArgumentCheck.NotNull(keys, "keys");
 
-            DoOutOp(CacheOp.ClearAll, writer => WriteEnumerable(writer, keys));
+            DoOutOp(CacheOp.ClearAll, writer => writer.WriteEnumerable(keys));
         }
 
         /** <inheritDoc /> */
@@ -693,7 +692,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         {
             IgniteArgumentCheck.NotNull(keys, "keys");
 
-            return DoOutOpAsync(CacheOp.ClearAllAsync, writer => WriteEnumerable(writer, keys));
+            return DoOutOpAsync(CacheOp.ClearAllAsync, writer => writer.WriteEnumerable(keys));
         }
 
         /** <inheritdoc /> */
@@ -709,7 +708,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         {
             IgniteArgumentCheck.NotNull(keys, "keys");
 
-            DoOutOp(CacheOp.LocalClearAll, writer => WriteEnumerable(writer, keys));
+            DoOutOp(CacheOp.LocalClearAll, writer => writer.WriteEnumerable(keys));
         }
 
         /** <inheritdoc /> */
@@ -761,7 +760,7 @@ namespace Apache.Ignite.Core.Impl.Cache
 
             StartTx();
 
-            DoOutOp(CacheOp.RemoveAll, writer => WriteEnumerable(writer, keys));
+            DoOutOp(CacheOp.RemoveAll, writer => writer.WriteEnumerable(keys));
         }
 
         /** <inheritDoc /> */
@@ -771,7 +770,7 @@ namespace Apache.Ignite.Core.Impl.Cache
 
             StartTx();
 
-            return DoOutOpAsync(CacheOp.RemoveAllAsync, writer => WriteEnumerable(writer, keys));
+            return DoOutOpAsync(CacheOp.RemoveAllAsync, writer => writer.WriteEnumerable(keys));
         }
 
         /** <inheritDoc /> */
@@ -843,7 +842,7 @@ namespace Apache.Ignite.Core.Impl.Cache
                     writer.Write(holder);
                 },
                 (input, res) => res == True ? Unmarshal<TRes>(input) : default(TRes),
-                ReadException);
+                _readException);
         }
 
         /** <inheritDoc /> */
@@ -891,10 +890,12 @@ namespace Apache.Ignite.Core.Impl.Cache
             return DoOutInOpX((int) CacheOp.InvokeAll,
                 writer =>
                 {
-                    WriteEnumerable(writer, keys);
+                    writer.WriteEnumerable(keys);
                     writer.Write(holder);
                 },
-                (input, res) => res == True ? ReadInvokeAllResults<TRes>(Marshaller.StartUnmarshal(input, IsKeepBinary)): null, ReadException);
+                (input, res) => res == True
+                    ? ReadInvokeAllResults<TRes>(Marshaller.StartUnmarshal(input, IsKeepBinary))
+                    : null, _readException);
         }
 
         /** <inheritDoc /> */
@@ -912,7 +913,7 @@ namespace Apache.Ignite.Core.Impl.Cache
             return DoOutOpAsync(CacheOp.InvokeAllAsync,
                 writer =>
                 {
-                    WriteEnumerable(writer, keys);
+                    writer.WriteEnumerable(keys);
                     writer.Write(holder);
                 },
                 input => ReadInvokeAllResults<TRes>(input));
@@ -931,7 +932,7 @@ namespace Apache.Ignite.Core.Impl.Cache
                 },
                 (input, res) => res == True
                     ? readFunc(Marshaller.StartUnmarshal(input))
-                    : default(T), ReadException);
+                    : default(T), _readException);
         }
 
         /** <inheritdoc /> */
@@ -940,7 +941,7 @@ namespace Apache.Ignite.Core.Impl.Cache
             IgniteArgumentCheck.NotNull(key, "key");
 
             return DoOutInOpX((int) CacheOp.Lock, w => w.Write(key),
-                (stream, res) => new CacheLock(stream.ReadInt(), this), ReadException);
+                (stream, res) => new CacheLock(stream.ReadInt(), this), _readException);
         }
 
         /** <inheritdoc /> */
@@ -948,8 +949,8 @@ namespace Apache.Ignite.Core.Impl.Cache
         {
             IgniteArgumentCheck.NotNull(keys, "keys");
 
-            return DoOutInOpX((int) CacheOp.LockAll, w => WriteEnumerable(w, keys),
-                (stream, res) => new CacheLock(stream.ReadInt(), this), ReadException);
+            return DoOutInOpX((int) CacheOp.LockAll, w => w.WriteEnumerable(keys),
+                (stream, res) => new CacheLock(stream.ReadInt(), this), _readException);
         }
 
         /** <inheritdoc /> */
@@ -1011,7 +1012,7 @@ namespace Apache.Ignite.Core.Impl.Cache
             if (_flagNoRetries)
                 return this;
 
-            return new CacheImpl<TK, TV>(_ignite, DoOutOpObject((int) CacheOp.WithNoRetries), Marshaller,
+            return new CacheImpl<TK, TV>(DoOutOpObject((int) CacheOp.WithNoRetries),
                 _flagSkipStore, _flagKeepBinary, true, _flagPartitionRecover);
         }
 
@@ -1021,7 +1022,7 @@ namespace Apache.Ignite.Core.Impl.Cache
             if (_flagPartitionRecover)
                 return this;
 
-            return new CacheImpl<TK, TV>(_ignite, DoOutOpObject((int) CacheOp.WithPartitionRecover), Marshaller,
+            return new CacheImpl<TK, TV>(DoOutOpObject((int) CacheOp.WithPartitionRecover),
                 _flagSkipStore, _flagKeepBinary, _flagNoRetries, true);
         }
 
@@ -1092,7 +1093,7 @@ namespace Apache.Ignite.Core.Impl.Cache
                 writer.WriteString(qry.Schema); // Schema
             });
         
-            return new FieldsQueryCursor<T>(cursor, Marshaller, _flagKeepBinary, readerFunc);
+            return new FieldsQueryCursor<T>(cursor, _flagKeepBinary, readerFunc);
         }
 
         /** <inheritDoc /> */
@@ -1102,7 +1103,7 @@ namespace Apache.Ignite.Core.Impl.Cache
 
             var cursor = DoOutOpObject((int) qry.OpId, writer => qry.Write(writer, IsKeepBinary));
 
-            return new QueryCursor<TK, TV>(cursor, Marshaller, _flagKeepBinary);
+            return new QueryCursor<TK, TV>(cursor, _flagKeepBinary);
         }
                 
         /** <inheritdoc /> */
@@ -1168,10 +1169,10 @@ namespace Apache.Ignite.Core.Impl.Cache
             {
                 var target = DoOutOpObject((int) CacheOp.LocIterator, (IBinaryStream s) => s.WriteInt(peekModes));
 
-                return new CacheEnumerator<TK, TV>(target, Marshaller, _flagKeepBinary);
+                return new CacheEnumerator<TK, TV>(target, _flagKeepBinary);
             }
 
-            return new CacheEnumerator<TK, TV>(DoOutOpObject((int) CacheOp.Iterator), Marshaller, _flagKeepBinary);
+            return new CacheEnumerator<TK, TV>(DoOutOpObject((int) CacheOp.Iterator), _flagKeepBinary);
         }
 
         #endregion
@@ -1228,14 +1229,6 @@ namespace Apache.Ignite.Core.Impl.Cache
         }
 
         /// <summary>
-        /// Reads the exception.
-        /// </summary>
-        private Exception ReadException(IBinaryStream stream)
-        {
-            return ReadException(Marshaller.StartUnmarshal(stream));
-        }
-
-        /// <summary>
         /// Reads the exception, either in binary wrapper form, or as a pair of strings.
         /// </summary>
         /// <param name="reader">The stream.</param>
@@ -1315,7 +1308,7 @@ namespace Apache.Ignite.Core.Impl.Cache
             return DoOutInOpX((int) op, w =>
             {
                 w.Write(x);
-            }, ReadException);
+            }, _readException);
         }
 
         /// <summary>
@@ -1327,7 +1320,7 @@ namespace Apache.Ignite.Core.Impl.Cache
             {
                 w.Write(x);
                 w.Write(y);
-            }, ReadException);
+            }, _readException);
         }
 
         /// <summary>
@@ -1340,7 +1333,7 @@ namespace Apache.Ignite.Core.Impl.Cache
                 w.Write(x);
                 w.Write(y);
                 w.Write(z);
-            }, ReadException);
+            }, _readException);
         }
 
         /// <summary>
@@ -1348,7 +1341,7 @@ namespace Apache.Ignite.Core.Impl.Cache
         /// </summary>
         private bool DoOutOp(CacheOp op, Action<BinaryWriter> write)
         {
-            return DoOutInOpX((int) op, write, ReadException);
+            return DoOutInOpX((int) op, write, _readException);
         }
 
         /// <summary>
@@ -1359,7 +1352,7 @@ namespace Apache.Ignite.Core.Impl.Cache
             return DoOutInOpX((int)cacheOp,
                 w => w.Write(x),
                 (stream, res) => res == True ? new CacheResult<TV>(Unmarshal<TV>(stream)) : new CacheResult<TV>(),
-                ReadException);
+                _readException);
         }
 
         /// <summary>
@@ -1374,7 +1367,7 @@ namespace Apache.Ignite.Core.Impl.Cache
                     w.Write(y);
                 },
                 (stream, res) => res == True ? new CacheResult<TV>(Unmarshal<TV>(stream)) : new CacheResult<TV>(),
-                ReadException);
+                _readException);
         }
 
         /** <inheritdoc /> */

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/AbstractQueryCursor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/AbstractQueryCursor.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/AbstractQueryCursor.cs
index 95c6a36..8e4985e 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/AbstractQueryCursor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/AbstractQueryCursor.cs
@@ -23,13 +23,11 @@ namespace Apache.Ignite.Core.Impl.Cache.Query
     using Apache.Ignite.Core.Cache.Query;
     using Apache.Ignite.Core.Impl.Binary;
     using Apache.Ignite.Core.Impl.Binary.IO;
-    using Apache.Ignite.Core.Impl.Unmanaged;
-    using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils;
 
     /// <summary>
     /// Abstract query cursor implementation.
     /// </summary>
-    internal abstract class AbstractQueryCursor<T> : PlatformDisposableTarget, IQueryCursor<T>, IEnumerator<T>
+    internal abstract class AbstractQueryCursor<T> : PlatformDisposableTargetAdapter, IQueryCursor<T>, IEnumerator<T>
     {
         /** */
         private const int OpGetAll = 1;
@@ -65,10 +63,8 @@ namespace Apache.Ignite.Core.Impl.Cache.Query
         /// Constructor.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
         /// <param name="keepBinary">Keep binary flag.</param>
-        protected AbstractQueryCursor(IUnmanagedTarget target, Marshaller marsh, bool keepBinary) : 
-            base(target, marsh)
+        protected AbstractQueryCursor(IPlatformTargetInternal target, bool keepBinary) : base(target)
         {
             _keepBinary = keepBinary;
         }
@@ -88,7 +84,7 @@ namespace Apache.Ignite.Core.Impl.Cache.Query
                 throw new InvalidOperationException("Failed to get all entries because GetAll() " + 
                     "method has already been called.");
 
-            var res = DoInOp<IList<T>>(OpGetAll, ConvertGetAll);
+            var res = DoInOp(OpGetAll, ConvertGetAll);
 
             _getAllCalled = true;
 
@@ -216,7 +212,7 @@ namespace Apache.Ignite.Core.Impl.Cache.Query
         /// </summary>
         private void RequestBatch()
         {
-            _batch = DoInOp<T[]>(OpGetBatch, ConvertGetBatch);
+            _batch = DoInOp(OpGetBatch, ConvertGetBatch);
 
             _batchPos = 0;
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/Continuous/ContinuousQueryHandleImpl.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/Continuous/ContinuousQueryHandleImpl.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/Continuous/ContinuousQueryHandleImpl.cs
index 6139d8b..ff5c434 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/Continuous/ContinuousQueryHandleImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/Continuous/ContinuousQueryHandleImpl.cs
@@ -28,8 +28,6 @@ namespace Apache.Ignite.Core.Impl.Cache.Query.Continuous
     using Apache.Ignite.Core.Impl.Binary.IO;
     using Apache.Ignite.Core.Impl.Common;
     using Apache.Ignite.Core.Impl.Resource;
-    using Apache.Ignite.Core.Impl.Unmanaged;
-    using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils;
     using CQU = ContinuousQueryUtils;
 
     /// <summary>
@@ -67,7 +65,7 @@ namespace Apache.Ignite.Core.Impl.Cache.Query.Continuous
         private readonly long _hnd;
 
         /** Native query. */
-        private readonly IUnmanagedTarget _nativeQry;
+        private readonly IPlatformTargetInternal _nativeQry;
 
         /** Initial query cursor. */
         private volatile IQueryCursor<ICacheEntry<TK, TV>> _initialQueryCursor;
@@ -84,7 +82,7 @@ namespace Apache.Ignite.Core.Impl.Cache.Query.Continuous
         /// <param name="createTargetCb">The initialization callback.</param>
         /// <param name="initialQry">The initial query.</param>
         public ContinuousQueryHandleImpl(ContinuousQuery<TK, TV> qry, Marshaller marsh, bool keepBinary,
-            Func<Action<BinaryWriter>, IUnmanagedTarget> createTargetCb, QueryBase initialQry)
+            Func<Action<BinaryWriter>, IPlatformTargetInternal> createTargetCb, QueryBase initialQry)
         {
             _marsh = marsh;
             _keepBinary = keepBinary;
@@ -138,10 +136,10 @@ namespace Apache.Ignite.Core.Impl.Cache.Query.Continuous
                 });
 
                 // 4. Initial query.
-                var nativeInitialQryCur = UU.TargetOutObject(_nativeQry, 0);
+                var nativeInitialQryCur = _nativeQry.OutObjectInternal(0);
                 _initialQueryCursor = nativeInitialQryCur == null
                     ? null
-                    : new QueryCursor<TK, TV>(nativeInitialQryCur, _marsh, _keepBinary);
+                    : new QueryCursor<TK, TV>(nativeInitialQryCur, _keepBinary);
             }
             catch (Exception)
             {
@@ -225,7 +223,7 @@ namespace Apache.Ignite.Core.Impl.Cache.Query.Continuous
 
                 try
                 {
-                    UU.TargetInLongOutLong(_nativeQry, 0, 0);
+                    _nativeQry.InLongOutLong(0, 0);
                 }
                 finally
                 {

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/FieldsQueryCursor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/FieldsQueryCursor.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/FieldsQueryCursor.cs
index d928418..9d021dc 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/FieldsQueryCursor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/FieldsQueryCursor.cs
@@ -22,7 +22,6 @@ namespace Apache.Ignite.Core.Impl.Cache.Query
     using System.Diagnostics.CodeAnalysis;
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Impl.Binary;
-    using Apache.Ignite.Core.Impl.Unmanaged;
 
     /// <summary>
     /// Cursor for entry-based queries.
@@ -36,12 +35,11 @@ namespace Apache.Ignite.Core.Impl.Cache.Query
         /// Constructor.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaler.</param>
         /// <param name="keepBinary">Keep poratble flag.</param>
         /// <param name="readerFunc">The reader function.</param>
-        public FieldsQueryCursor(IUnmanagedTarget target, Marshaller marsh, bool keepBinary, 
+        public FieldsQueryCursor(IPlatformTargetInternal target, bool keepBinary, 
             Func<IBinaryRawReader, int, T> readerFunc)
-            : base(target, marsh, keepBinary)
+            : base(target, keepBinary)
         {
             Debug.Assert(readerFunc != null);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/QueryCursor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/QueryCursor.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/QueryCursor.cs
index 5a46915..bc3cdb6 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/QueryCursor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cache/Query/QueryCursor.cs
@@ -20,7 +20,6 @@ namespace Apache.Ignite.Core.Impl.Cache.Query
     using System.Diagnostics.CodeAnalysis;
     using Apache.Ignite.Core.Cache;
     using Apache.Ignite.Core.Impl.Binary;
-    using Apache.Ignite.Core.Impl.Unmanaged;
 
     /// <summary>
     /// Cursor for entry-based queries.
@@ -31,10 +30,8 @@ namespace Apache.Ignite.Core.Impl.Cache.Query
         /// Constructor.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaler.</param>
         /// <param name="keepBinary">Keep poratble flag.</param>
-        public QueryCursor(IUnmanagedTarget target, Marshaller marsh,
-            bool keepBinary) : base(target, marsh, keepBinary)
+        public QueryCursor(IPlatformTargetInternal target, bool keepBinary) : base(target, keepBinary)
         {
             // No-op.
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 30afe57..678fb03 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Cluster/ClusterGroupImpl.cs
@@ -37,16 +37,14 @@ namespace Apache.Ignite.Core.Impl.Cluster
     using Apache.Ignite.Core.Impl.Messaging;
     using Apache.Ignite.Core.Impl.PersistentStore;
     using Apache.Ignite.Core.Impl.Services;
-    using Apache.Ignite.Core.Impl.Unmanaged;
     using Apache.Ignite.Core.Messaging;
     using Apache.Ignite.Core.PersistentStore;
     using Apache.Ignite.Core.Services;
-    using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils;
 
     /// <summary>
     /// Ignite projection implementation.
     /// </summary>
-    internal class ClusterGroupImpl : PlatformTarget, IClusterGroup
+    internal class ClusterGroupImpl : PlatformTargetAdapter, IClusterGroup
     {
         /** Attribute: platform. */
         private const string AttrPlatform = "org.apache.ignite.platform";
@@ -175,13 +173,12 @@ namespace Apache.Ignite.Core.Impl.Cluster
         /// Constructor.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="ignite">Grid.</param>
         /// <param name="pred">Predicate.</param>
         [SuppressMessage("Microsoft.Performance", "CA1805:DoNotInitializeUnnecessarily")]
-        public ClusterGroupImpl(IUnmanagedTarget target, Ignite ignite, Func<IClusterNode, bool> pred)
-            : base(target, ignite.Marshaller)
+        public ClusterGroupImpl(IPlatformTargetInternal target, Func<IClusterNode, bool> pred)
+            : base(target)
         {
-            _ignite = ignite;
+            _ignite = target.Marshaller.Ignite;
             _pred = pred;
 
             _comp = new Lazy<ICompute>(() => CreateCompute());
@@ -207,7 +204,7 @@ namespace Apache.Ignite.Core.Impl.Cluster
         /// </summary>
         private ICompute CreateCompute()
         {
-            return new Compute(new ComputeImpl(DoOutOpObject(OpGetCompute), Marshaller, this, false));
+            return new Compute(new ComputeImpl(DoOutOpObject(OpGetCompute), this, false));
         }
 
         /** <inheritDoc /> */
@@ -252,10 +249,7 @@ namespace Apache.Ignite.Core.Impl.Cluster
         {
             Debug.Assert(items != null);
 
-            IUnmanagedTarget prj = DoOutOpObject(OpForNodeIds, writer =>
-            {
-                WriteEnumerable(writer, items, func);
-            });
+            var prj = DoOutOpObject(OpForNodeIds, writer => writer.WriteEnumerable(items, func));
             
             return GetClusterGroup(prj);
         }
@@ -265,7 +259,7 @@ namespace Apache.Ignite.Core.Impl.Cluster
         {
             var newPred = _pred == null ? p : node => _pred(node) && p(node);
 
-            return new ClusterGroupImpl(Target, _ignite, newPred);
+            return new ClusterGroupImpl(Target, newPred);
         }
 
         /** <inheritDoc /> */
@@ -278,7 +272,7 @@ namespace Apache.Ignite.Core.Impl.Cluster
                 writer.WriteString(name);
                 writer.WriteString(val);
             };
-            IUnmanagedTarget prj = DoOutOpObject(OpForAttribute, action);
+            var prj = DoOutOpObject(OpForAttribute, action);
 
             return GetClusterGroup(prj);
         }
@@ -293,7 +287,7 @@ namespace Apache.Ignite.Core.Impl.Cluster
         /// </returns>
         private IClusterGroup ForCacheNodes(string name, int op)
         {
-            IUnmanagedTarget prj = DoOutOpObject(op, writer =>
+            var prj = DoOutOpObject(op, writer =>
             {
                 writer.WriteString(name);
             });
@@ -336,7 +330,7 @@ namespace Apache.Ignite.Core.Impl.Cluster
         {
             IgniteArgumentCheck.NotNull(node, "node");
 
-            IUnmanagedTarget prj = DoOutOpObject(OpForHost, writer =>
+            var prj = DoOutOpObject(OpForHost, writer =>
             {
                 writer.WriteGuid(node.Id);
             });    
@@ -404,15 +398,14 @@ namespace Apache.Ignite.Core.Impl.Cluster
                     return reader.ReadBoolean() ? new ClusterMetricsImpl(reader) : null;
                 });
             }
-            return DoOutInOp(OpMetricsFiltered, writer =>
-            {
-                WriteEnumerable(writer, GetNodes().Select(node => node.Id));
-            }, stream =>
-            {
-                IBinaryRawReader reader = Marshaller.StartUnmarshal(stream, false);
+            return DoOutInOp(OpMetricsFiltered,
+                writer => writer.WriteEnumerable(GetNodes().Select(node => node.Id)),
+                stream =>
+                {
+                    IBinaryRawReader reader = Marshaller.StartUnmarshal(stream, false);
 
-                return reader.ReadBoolean() ? new ClusterMetricsImpl(reader) : null;
-            });
+                    return reader.ReadBoolean() ? new ClusterMetricsImpl(reader) : null;
+                });
         }
 
         /** <inheritDoc /> */
@@ -426,7 +419,7 @@ namespace Apache.Ignite.Core.Impl.Cluster
         /// </summary>
         private IMessaging CreateMessaging()
         {
-            return new Messaging(DoOutOpObject(OpGetMessaging), Marshaller, this);
+            return new Messaging(DoOutOpObject(OpGetMessaging), this);
         }
 
         /** <inheritDoc /> */
@@ -440,7 +433,7 @@ namespace Apache.Ignite.Core.Impl.Cluster
         /// </summary>
         private IEvents CreateEvents()
         {
-            return new Events(DoOutOpObject(OpGetEvents), Marshaller, this);
+            return new Events(DoOutOpObject(OpGetEvents), this);
         }
 
         /** <inheritDoc /> */
@@ -454,7 +447,7 @@ namespace Apache.Ignite.Core.Impl.Cluster
         /// </summary>
         private IServices CreateServices()
         {
-            return new Services(DoOutOpObject(OpGetServices), Marshaller, this, false, false);
+            return new Services(DoOutOpObject(OpGetServices), this, false, false);
         }
 
         /// <summary>
@@ -665,9 +658,9 @@ namespace Apache.Ignite.Core.Impl.Cluster
         /// </summary>
         /// <param name="prj">Native projection.</param>
         /// <returns>New cluster group.</returns>
-        private IClusterGroup GetClusterGroup(IUnmanagedTarget prj)
+        private IClusterGroup GetClusterGroup(IPlatformTargetInternal prj)
         {
-            return new ClusterGroupImpl(prj, _ignite, _pred);
+            return new ClusterGroupImpl(prj, _pred);
         }
 
         /// <summary>
@@ -678,29 +671,30 @@ namespace Apache.Ignite.Core.Impl.Cluster
         {
             long oldTopVer = Interlocked.Read(ref _topVer);
 
-            List<IClusterNode> newNodes = null;
-
-            DoOutInOp(OpNodes, writer =>
+            var res = Target.InStreamOutStream(OpNodes, writer =>
             {
                 writer.WriteLong(oldTopVer);
-            }, input =>
+            }, reader =>
             {
-                BinaryReader reader = Marshaller.StartUnmarshal(input);
-
                 if (reader.ReadBoolean())
                 {
                     // Topology has been updated.
                     long newTopVer = reader.ReadLong();
+                    var newNodes = IgniteUtils.ReadNodes((BinaryReader) reader, _pred);
 
-                    newNodes = IgniteUtils.ReadNodes(reader, _pred);
-
-                    UpdateTopology(newTopVer, newNodes);
+                    return Tuple.Create(newTopVer, newNodes);
                 }
+
+                return null;
             });
 
-            if (newNodes != null)
-                return newNodes;
-            
+            if (res != null)
+            {
+                UpdateTopology(res.Item1, res.Item2);
+
+                return res.Item2;
+            }
+
             // No topology changes.
             Debug.Assert(_nodes != null, "At least one topology update should have occurred.");
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/DelegateTypeDescriptor.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/DelegateTypeDescriptor.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/DelegateTypeDescriptor.cs
index 4cd0678..cc12caa 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/DelegateTypeDescriptor.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/DelegateTypeDescriptor.cs
@@ -28,7 +28,6 @@ namespace Apache.Ignite.Core.Impl.Common
     using Apache.Ignite.Core.Impl.Cache;
     using Apache.Ignite.Core.Impl.Cache.Query.Continuous;
     using Apache.Ignite.Core.Impl.Datastream;
-    using Apache.Ignite.Core.Impl.Unmanaged;
     using Apache.Ignite.Core.Messaging;
 
     /// <summary>
@@ -66,7 +65,7 @@ namespace Apache.Ignite.Core.Impl.Common
         private readonly Action<object> _computeJobCancel;
 
         /** */
-        private readonly Action<object, Ignite, IUnmanagedTarget, IBinaryStream, bool> _streamReceiver;
+        private readonly Action<object, Ignite, IPlatformTargetInternal, IBinaryStream, bool> _streamReceiver;
 
         /** */
         private readonly Func<object, object> _streamTransformerCtor;
@@ -163,7 +162,7 @@ namespace Apache.Ignite.Core.Impl.Common
         /// </summary>
         /// <param name="type">Type.</param>
         /// <returns>Precompiled invocator delegate.</returns>
-        public static Action<object, Ignite, IUnmanagedTarget, IBinaryStream, bool> GetStreamReceiver(Type type)
+        public static Action<object, Ignite, IPlatformTargetInternal, IBinaryStream, bool> GetStreamReceiver(Type type)
         {
             return Get(type)._streamReceiver;
         }
@@ -313,12 +312,12 @@ namespace Apache.Ignite.Core.Impl.Common
                             .MakeGenericMethod(iface.GetGenericArguments());
 
                     _streamReceiver = DelegateConverter
-                        .CompileFunc<Action<object, Ignite, IUnmanagedTarget, IBinaryStream, bool>>(
+                        .CompileFunc<Action<object, Ignite, IPlatformTargetInternal, IBinaryStream, bool>>(
                             typeof (StreamReceiverHolder),
                             method,
                             new[]
                             {
-                                iface, typeof (Ignite), typeof (IUnmanagedTarget), typeof (IBinaryStream),
+                                iface, typeof (Ignite), typeof (IPlatformTargetInternal), typeof (IBinaryStream),
                                 typeof (bool)
                             },
                             new[] {true, false, false, false, false, false});

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/Listenable.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/Listenable.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/Listenable.cs
index 6da98ab..8566d0b 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/Listenable.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Common/Listenable.cs
@@ -17,13 +17,10 @@
 
 namespace Apache.Ignite.Core.Impl.Common
 {
-    using Apache.Ignite.Core.Impl.Binary;
-    using Apache.Ignite.Core.Impl.Unmanaged;
-
     /// <summary>
     /// Platform listenable.
     /// </summary>
-    internal class Listenable : PlatformTarget
+    internal class Listenable : PlatformTargetAdapter
     {
         /** */
         private const int OpCancel = 1;
@@ -32,8 +29,7 @@ namespace Apache.Ignite.Core.Impl.Common
         /// Initializes a new instance of the <see cref="Listenable"/> class.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
-        public Listenable(IUnmanagedTarget target, Marshaller marsh) : base(target, marsh)
+        public Listenable(IPlatformTargetInternal target) : base(target)
         {
             // No-op.
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 cace7b2..06f9ad4 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Compute/ComputeImpl.cs
@@ -34,13 +34,12 @@ namespace Apache.Ignite.Core.Impl.Compute
     using Apache.Ignite.Core.Impl.Cluster;
     using Apache.Ignite.Core.Impl.Common;
     using Apache.Ignite.Core.Impl.Compute.Closure;
-    using Apache.Ignite.Core.Impl.Unmanaged;
 
     /// <summary>
     /// Compute implementation.
     /// </summary>
     [SuppressMessage("Microsoft.Design", "CA1001:TypesThatOwnDisposableFieldsShouldBeDisposable")]
-    internal class ComputeImpl : PlatformTarget
+    internal class ComputeImpl : PlatformTargetAdapter
     {
         /** */
         private const int OpAffinity = 1;
@@ -76,11 +75,10 @@ namespace Apache.Ignite.Core.Impl.Compute
         /// Constructor.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
         /// <param name="prj">Projection.</param>
         /// <param name="keepBinary">Binary flag.</param>
-        public ComputeImpl(IUnmanagedTarget target, Marshaller marsh, ClusterGroupImpl prj, bool keepBinary)
-            : base(target, marsh)
+        public ComputeImpl(IPlatformTargetInternal target, ClusterGroupImpl prj, bool keepBinary)
+            : base(target)
         {
             _prj = prj;
 
@@ -194,7 +192,7 @@ namespace Apache.Ignite.Core.Impl.Compute
 
             var future = holder.Future;
 
-            future.SetTarget(new Listenable(futTarget, Marshaller));
+            future.SetTarget(new Listenable(futTarget));
 
             return future;
         }
@@ -551,7 +549,7 @@ namespace Apache.Ignite.Core.Impl.Compute
                             writeAction(writer);
                     });
 
-                    holder.Future.SetTarget(new Listenable(futTarget, Marshaller));
+                    holder.Future.SetTarget(new Listenable(futTarget));
                 }
                 catch (Exception e)
                 {

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicLong.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicLong.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicLong.cs
index 0c4bf84..f797408 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicLong.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicLong.cs
@@ -19,16 +19,12 @@ namespace Apache.Ignite.Core.Impl.DataStructures
 {
     using System.Diagnostics;
     using Apache.Ignite.Core.DataStructures;
-    using Apache.Ignite.Core.Impl.Binary;
     using Apache.Ignite.Core.Impl.Binary.IO;
-    using Apache.Ignite.Core.Impl.Unmanaged;
-
-    using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils;
 
     /// <summary>
     /// Atomic long wrapper.
     /// </summary>
-    internal sealed class AtomicLong : PlatformTarget, IAtomicLong
+    internal sealed class AtomicLong : PlatformTargetAdapter, IAtomicLong
     {
         /** */
         private readonly string _name;
@@ -50,9 +46,8 @@ namespace Apache.Ignite.Core.Impl.DataStructures
         /// Initializes a new instance of the <see cref="AtomicLong"/> class.
         /// </summary>
         /// <param name="target">The target.</param>
-        /// <param name="marsh">The marshaller.</param>
         /// <param name="name">The name.</param>
-        public AtomicLong(IUnmanagedTarget target, Marshaller marsh, string name) : base(target, marsh)
+        public AtomicLong(IPlatformTargetInternal target, string name) : base(target)
         {
             Debug.Assert(!string.IsNullOrEmpty(name));
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicReference.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicReference.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicReference.cs
index 4ca4b24..76515a2 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicReference.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicReference.cs
@@ -19,13 +19,11 @@ namespace Apache.Ignite.Core.Impl.DataStructures
 {
     using System.Diagnostics;
     using Apache.Ignite.Core.DataStructures;
-    using Apache.Ignite.Core.Impl.Binary;
-    using Apache.Ignite.Core.Impl.Unmanaged;
 
     /// <summary>
     /// Atomic reference.
     /// </summary>
-    internal class AtomicReference<T> : PlatformTarget, IAtomicReference<T>
+    internal class AtomicReference<T> : PlatformTargetAdapter, IAtomicReference<T>
     {
         /** Opcodes. */
         private enum Op
@@ -41,8 +39,8 @@ namespace Apache.Ignite.Core.Impl.DataStructures
         private readonly string _name;
 
         /** <inheritDoc /> */
-        public AtomicReference(IUnmanagedTarget target, Marshaller marsh, string name)
-            : base(target, marsh)
+        public AtomicReference(IPlatformTargetInternal target, string name)
+            : base(target)
         {
             Debug.Assert(!string.IsNullOrEmpty(name));
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicSequence.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicSequence.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicSequence.cs
index f7fc6b7..dd079ef 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicSequence.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/DataStructures/AtomicSequence.cs
@@ -19,13 +19,11 @@ namespace Apache.Ignite.Core.Impl.DataStructures
 {
     using System.Diagnostics;
     using Apache.Ignite.Core.DataStructures;
-    using Apache.Ignite.Core.Impl.Binary;
-    using Apache.Ignite.Core.Impl.Unmanaged;
 
     /// <summary>
     /// Atomic long wrapper.
     /// </summary>
-    internal sealed class AtomicSequence: PlatformTarget, IAtomicSequence
+    internal sealed class AtomicSequence: PlatformTargetAdapter, IAtomicSequence
     {
         /** */
         private readonly string _name;
@@ -46,10 +44,9 @@ namespace Apache.Ignite.Core.Impl.DataStructures
         /// Initializes a new instance of the <see cref="Apache.Ignite.Core.Impl.DataStructures.AtomicLong"/> class.
         /// </summary>
         /// <param name="target">The target.</param>
-        /// <param name="marsh">The marshaller.</param>
         /// <param name="name">The name.</param>
-        public AtomicSequence(IUnmanagedTarget target, Marshaller marsh, string name)
-            : base(target, marsh)
+        public AtomicSequence(IPlatformTargetInternal target, string name)
+            : base(target)
         {
             Debug.Assert(!string.IsNullOrEmpty(name));
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/DataStreamerImpl.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/DataStreamerImpl.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/DataStreamerImpl.cs
index 96e58d4..fb2df01 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/DataStreamerImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Datastream/DataStreamerImpl.cs
@@ -26,8 +26,6 @@ namespace Apache.Ignite.Core.Impl.Datastream
     using Apache.Ignite.Core.Datastream;
     using Apache.Ignite.Core.Impl.Binary;
     using Apache.Ignite.Core.Impl.Common;
-    using Apache.Ignite.Core.Impl.Unmanaged;
-    using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils;
 
     /// <summary>
     /// Data streamer internal interface to get rid of generics.
@@ -45,7 +43,7 @@ namespace Apache.Ignite.Core.Impl.Datastream
     /// <summary>
     /// Data streamer implementation.
     /// </summary>
-    internal class DataStreamerImpl<TK, TV> : PlatformDisposableTarget, IDataStreamer, IDataStreamer<TK, TV>
+    internal class DataStreamerImpl<TK, TV> : PlatformDisposableTargetAdapter, IDataStreamer, IDataStreamer<TK, TV>
     {
 
 #pragma warning disable 0420
@@ -141,8 +139,8 @@ namespace Apache.Ignite.Core.Impl.Datastream
         /// <param name="marsh">Marshaller.</param>
         /// <param name="cacheName">Cache name.</param>
         /// <param name="keepBinary">Binary flag.</param>
-        public DataStreamerImpl(IUnmanagedTarget target, Marshaller marsh, string cacheName, bool keepBinary)
-            : base(target, marsh)
+        public DataStreamerImpl(IPlatformTargetInternal target, Marshaller marsh, string cacheName, bool keepBinary)
+            : base(target)
         {
             _cacheName = cacheName;
             _keepBinary = keepBinary;


[48/50] [abbrv] ignite git commit: IGNITE-5864 .NET: Add missing namespace to LINQPad ComputeExample

Posted by yz...@apache.org.
IGNITE-5864 .NET: Add missing namespace to LINQPad ComputeExample


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

Branch: refs/heads/ignite-5658
Commit: ab899cf2e383190b71cc8d7940f2880f8b6ee670
Parents: b698bbf
Author: Pavel Tupitsyn <pt...@apache.org>
Authored: Fri Jul 28 11:38:35 2017 +0300
Committer: Pavel Tupitsyn <pt...@apache.org>
Committed: Fri Jul 28 11:38:35 2017 +0300

----------------------------------------------------------------------
 .../dotnet/Apache.Ignite.Core/NuGet/LINQPad/ComputeExample.linq     | 1 +
 1 file changed, 1 insertion(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/ab899cf2/modules/platforms/dotnet/Apache.Ignite.Core/NuGet/LINQPad/ComputeExample.linq
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/NuGet/LINQPad/ComputeExample.linq b/modules/platforms/dotnet/Apache.Ignite.Core/NuGet/LINQPad/ComputeExample.linq
index 75823d1..98e3d29 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/NuGet/LINQPad/ComputeExample.linq
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/NuGet/LINQPad/ComputeExample.linq
@@ -5,6 +5,7 @@
   <Namespace>Apache.Ignite.Core.Cache.Configuration</Namespace>
   <Namespace>Apache.Ignite.Core.Cache.Query</Namespace>
   <Namespace>Apache.Ignite.Core.Compute</Namespace>
+  <Namespace>Apache.Ignite.Core.Deployment</Namespace>
 </Query>
 
 /*


[40/50] [abbrv] ignite git commit: Minor (added more clear method IgniteTxHandler.prepareNearTxLocal).

Posted by yz...@apache.org.
Minor (added more clear method IgniteTxHandler.prepareNearTxLocal).


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

Branch: refs/heads/ignite-5658
Commit: e9a0d694867467400e295fe71dba4244d8b54ecd
Parents: eb9d06d
Author: sboikov <sb...@gridgain.com>
Authored: Thu Jul 27 15:25:06 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Jul 27 15:25:06 2017 +0300

----------------------------------------------------------------------
 ...arOptimisticSerializableTxPrepareFuture.java |  2 +-
 .../near/GridNearOptimisticTxPrepareFuture.java |  2 +-
 .../GridNearPessimisticTxPrepareFuture.java     |  2 +-
 .../cache/transactions/IgniteTxHandler.java     | 59 +++++++++++---------
 4 files changed, 35 insertions(+), 30 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/e9a0d694/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
index 72ddc67..d7b47de 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticSerializableTxPrepareFuture.java
@@ -574,7 +574,7 @@ public class GridNearOptimisticSerializableTxPrepareFuture extends GridNearOptim
         final MiniFuture fut,
         final boolean nearEntries) {
         IgniteInternalFuture<GridNearTxPrepareResponse> prepFut = nearEntries ?
-            cctx.tm().txHandler().prepareNearTx(cctx.localNodeId(), req, true) :
+            cctx.tm().txHandler().prepareNearTxLocal(req) :
             cctx.tm().txHandler().prepareColocatedTx(tx, req);
 
         prepFut.listen(new CI1<IgniteInternalFuture<GridNearTxPrepareResponse>>() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/e9a0d694/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
index edddf7d..df0d28e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearOptimisticTxPrepareFuture.java
@@ -564,7 +564,7 @@ public class GridNearOptimisticTxPrepareFuture extends GridNearOptimisticTxPrepa
                     assert !(m.hasColocatedCacheEntries() && m.hasNearCacheEntries()) : m;
 
                     IgniteInternalFuture<GridNearTxPrepareResponse> prepFut =
-                        m.hasNearCacheEntries() ? cctx.tm().txHandler().prepareNearTx(n.id(), req, true)
+                        m.hasNearCacheEntries() ? cctx.tm().txHandler().prepareNearTxLocal(req)
                         : cctx.tm().txHandler().prepareColocatedTx(tx, req);
 
                     prepFut.listen(new CI1<IgniteInternalFuture<GridNearTxPrepareResponse>>() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/e9a0d694/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
index e934319..2bcdade 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearPessimisticTxPrepareFuture.java
@@ -237,7 +237,7 @@ public class GridNearPessimisticTxPrepareFuture extends GridNearTxPrepareFutureA
         add(fut);
 
         IgniteInternalFuture<GridNearTxPrepareResponse> prepFut = nearEntries ?
-            cctx.tm().txHandler().prepareNearTx(cctx.localNodeId(), req, true) :
+            cctx.tm().txHandler().prepareNearTxLocal(req) :
             cctx.tm().txHandler().prepareColocatedTx(tx, req);
 
         prepFut.listen(new CI1<IgniteInternalFuture<GridNearTxPrepareResponse>>() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/e9a0d694/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
index 34a9fc1..2ed8ed7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxHandler.java
@@ -118,7 +118,19 @@ public class IgniteTxHandler {
                 ", node=" + nearNodeId + ']');
         }
 
-        IgniteInternalFuture<GridNearTxPrepareResponse> fut = prepareNearTx(nearNodeId, req, false);
+        ClusterNode nearNode = ctx.node(nearNodeId);
+
+        if (nearNode == null) {
+            if (txPrepareMsgLog.isDebugEnabled()) {
+                txPrepareMsgLog.debug("Received near prepare from node that left grid (will ignore) [" +
+                    "txId=" + req.version() +
+                    ", node=" + nearNodeId + ']');
+            }
+
+            return;
+        }
+
+        IgniteInternalFuture<GridNearTxPrepareResponse> fut = prepareNearTx(nearNode, req);
 
         assert req.txState() != null || fut == null || fut.error() != null ||
             (ctx.tm().tx(req.version()) == null && ctx.tm().nearTx(req.version()) == null);
@@ -278,32 +290,25 @@ public class IgniteTxHandler {
     }
 
     /**
-     * @param nearNodeId Near node ID that initiated transaction.
-     * @param req Near prepare request.
-     * @param locReq Local request flag.
+     * @param req Request.
      * @return Prepare future.
      */
-    public IgniteInternalFuture<GridNearTxPrepareResponse> prepareNearTx(
-        final UUID nearNodeId,
-        final GridNearTxPrepareRequest req,
-        boolean locReq
-    ) {
+    public IgniteInternalFuture<GridNearTxPrepareResponse> prepareNearTxLocal(final GridNearTxPrepareRequest req) {
         // Make sure not to provide Near entries to DHT cache.
-        if (locReq)
-            req.cloneEntries();
-
-        ClusterNode nearNode = ctx.node(nearNodeId);
+        req.cloneEntries();
 
-        if (nearNode == null) {
-            if (txPrepareMsgLog.isDebugEnabled()) {
-                txPrepareMsgLog.debug("Received near prepare from node that left grid (will ignore) [" +
-                    "txId=" + req.version() +
-                    ", node=" + nearNodeId + ']');
-            }
-
-            return null;
-        }
+        return prepareNearTx(ctx.localNode(), req);
+    }
 
+    /**
+     * @param nearNode Node that initiated transaction.
+     * @param req Near prepare request.
+     * @return Prepare future.
+     */
+    private IgniteInternalFuture<GridNearTxPrepareResponse> prepareNearTx(
+        final ClusterNode nearNode,
+        final GridNearTxPrepareRequest req
+    ) {
         IgniteTxEntry firstEntry;
 
         try {
@@ -350,7 +355,7 @@ public class IgniteTxHandler {
                     if (txPrepareMsgLog.isDebugEnabled()) {
                         txPrepareMsgLog.debug("Topology version mismatch for near prepare, need remap transaction [" +
                             "txId=" + req.version() +
-                            ", node=" + nearNodeId +
+                            ", node=" + nearNode.id() +
                             ", reqTopVer=" + req.topologyVersion() +
                             ", locTopVer=" + top.topologyVersion() +
                             ", req=" + req + ']');
@@ -370,24 +375,24 @@ public class IgniteTxHandler {
                         req.deployInfo() != null);
 
                     try {
-                        ctx.io().send(nearNodeId, res, req.policy());
+                        ctx.io().send(nearNode, res, req.policy());
 
                         if (txPrepareMsgLog.isDebugEnabled()) {
                             txPrepareMsgLog.debug("Sent remap response for near prepare [txId=" + req.version() +
-                                ", node=" + nearNodeId + ']');
+                                ", node=" + nearNode.id() + ']');
                         }
                     }
                     catch (ClusterTopologyCheckedException ignored) {
                         if (txPrepareMsgLog.isDebugEnabled()) {
                             txPrepareMsgLog.debug("Failed to send remap response for near prepare, node failed [" +
                                 "txId=" + req.version() +
-                                ", node=" + nearNodeId + ']');
+                                ", node=" + nearNode.id() + ']');
                         }
                     }
                     catch (IgniteCheckedException e) {
                         U.error(txPrepareMsgLog, "Failed to send remap response for near prepare " +
                             "[txId=" + req.version() +
-                            ", node=" + nearNodeId +
+                            ", node=" + nearNode.id() +
                             ", req=" + req + ']', e);
                     }
 


[12/50] [abbrv] ignite git commit: IGNITE-5752 Fixed updateSequence updating in GridDhtPartitionMap. - Fixes #2297.

Posted by yz...@apache.org.
IGNITE-5752 Fixed updateSequence updating in GridDhtPartitionMap. - Fixes #2297.

Signed-off-by: Alexey Goncharuk <al...@gmail.com>


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

Branch: refs/heads/ignite-5658
Commit: 199b954345f179851718acd131188506668cd4f3
Parents: 02a1bdc
Author: Pavel Kovalenko <jo...@gmail.com>
Authored: Fri Jul 21 16:29:15 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Fri Jul 21 16:29:15 2017 +0300

----------------------------------------------------------------------
 .../cache/distributed/dht/preloader/GridDhtPartitionMap.java  | 7 +++++--
 1 file changed, 5 insertions(+), 2 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/199b9543/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionMap.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionMap.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionMap.java
index cfd4400..735ca1e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionMap.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionMap.java
@@ -24,7 +24,6 @@ import java.io.ObjectOutput;
 import java.util.Map;
 import java.util.Set;
 import java.util.UUID;
-
 import org.apache.ignite.configuration.CacheConfiguration;
 import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState;
@@ -202,9 +201,13 @@ public class GridDhtPartitionMap implements Comparable<GridDhtPartitionMap>, Ext
      * @return Old update sequence value.
      */
     public long updateSequence(long updateSeq, AffinityTopologyVersion topVer) {
+        assert topVer.compareTo(top) >= 0 : "Invalid topology version [cur=" + top + ", new=" + topVer + "]";
+
         long old = this.updateSeq;
 
-        assert updateSeq >= old : "Invalid update sequence [cur=" + old + ", new=" + updateSeq + ']';
+        // Overwrite update sequence without checking in case of greater topology version
+        if (topVer.compareTo(top) == 0)
+            assert updateSeq >= old : "Invalid update sequence [cur=" + old + ", new=" + updateSeq + ']';
 
         this.updateSeq = updateSeq;
 


[42/50] [abbrv] ignite git commit: IGNITE-2190 ScanQuery without a filter triggers object's deserialization on the server side

Posted by yz...@apache.org.
IGNITE-2190 ScanQuery without a filter triggers object's deserialization on the server side


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

Branch: refs/heads/ignite-5658
Commit: 2941392213d2d3d9632a30d1726502d31a12e938
Parents: 7a6af69
Author: Nikolay Izhikov <NI...@gmail.com>
Authored: Thu Jul 27 19:00:08 2017 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Thu Jul 27 19:00:08 2017 +0300

----------------------------------------------------------------------
 .../eventstorage/GridEventStorageManager.java   | 14 +++++++++
 .../cache/query/GridCacheQueryManager.java      | 24 ++++++++++++----
 .../IgniteCacheBinaryObjectsScanSelfTest.java   |  9 +++++-
 ...acheBinaryObjectsScanWithEventsSelfTest.java | 30 ++++++++++++++++++++
 .../IgniteBinaryCacheQueryTestSuite.java        |  2 ++
 5 files changed, 73 insertions(+), 6 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/29413922/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageManager.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageManager.java
index 944420f..2b9a5ee 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/eventstorage/GridEventStorageManager.java
@@ -534,6 +534,20 @@ public class GridEventStorageManager extends GridManagerAdapter<EventStorageSpi>
     }
 
     /**
+     * Checks whether this event type has any listener.
+     *
+     * @param type Event type to check.
+     * @return Whether or not this event type has any listener.
+     */
+    public boolean hasListener(int type) {
+        assert type > 0 : "Invalid event type: " + type;
+
+        Listeners listeners = lsnrs.get(type);
+
+        return (listeners != null) && (!F.isEmpty(listeners.highPriorityLsnrs) || !F.isEmpty(listeners.lsnrs));
+    }
+
+    /**
      * Checks whether all provided events are user-recordable.
      * <p>
      * Note that this method supports only predefined Ignite events.

http://git-wip-us.apache.org/repos/asf/ignite/blob/29413922/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
index 0f47b7f..f107038 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
@@ -103,6 +103,7 @@ import org.apache.ignite.internal.util.typedef.T3;
 import org.apache.ignite.internal.util.typedef.X;
 import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.internal.util.typedef.internal.LT;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiPredicate;
@@ -118,6 +119,7 @@ import org.apache.ignite.spi.indexing.IndexingSpi;
 import org.jetbrains.annotations.Nullable;
 import org.jsr166.ConcurrentHashMap8;
 
+import static org.apache.ignite.IgniteSystemProperties.IGNITE_QUIET;
 import static org.apache.ignite.cache.CacheMode.LOCAL;
 import static org.apache.ignite.events.EventType.EVT_CACHE_QUERY_EXECUTED;
 import static org.apache.ignite.events.EventType.EVT_CACHE_QUERY_OBJECT_READ;
@@ -1015,7 +1017,7 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte
                         metrics.addGetTimeNanos(System.nanoTime() - start);
                     }
 
-                    if (readEvt) {
+                    if (readEvt && cctx.gridEvents().hasListener(EVT_CACHE_QUERY_OBJECT_READ)) {
                         cctx.gridEvents().record(new CacheQueryReadEvent<K, V>(
                             cctx.localNode(),
                             "SQL fields query result set row read.",
@@ -1135,6 +1137,8 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte
 
             boolean rmvIter = true;
 
+            GridCacheQueryAdapter<?> qry = qryInfo.query();
+
             try {
                 // Preparing query closures.
                 IgniteClosure<Cache.Entry<K, V>, Object> trans =
@@ -1145,8 +1149,6 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte
                 injectResources(trans);
                 injectResources(rdc);
 
-                GridCacheQueryAdapter<?> qry = qryInfo.query();
-
                 int pageSize = qry.pageSize();
 
                 boolean incBackups = qry.includeBackups();
@@ -1245,7 +1247,7 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte
                     K key0 = null;
                     V val0 = null;
 
-                    if (readEvt) {
+                    if (readEvt && cctx.gridEvents().hasListener(EVT_CACHE_QUERY_OBJECT_READ)) {
                         key0 = (K)cctx.unwrapBinaryIfNeeded(key, qry.keepBinary());
                         val0 = (V)cctx.unwrapBinaryIfNeeded(val, qry.keepBinary());
 
@@ -1372,6 +1374,18 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte
                 }
             }
             catch (Throwable e) {
+                if (X.hasCause(e, ClassNotFoundException.class) && !qry.keepBinary() && cctx.binaryMarshaller() &&
+                    !cctx.localNode().isClient() && !log.isQuiet()) {
+                    LT.warn(log, "Suggestion for the cause of ClassNotFoundException");
+                    LT.warn(log, "To disable, set -D" + IGNITE_QUIET + "=true");
+                    LT.warn(log, "  ^-- Ignite configured to use BinaryMarshaller but keepBinary is false for " +
+                        "request");
+                    LT.warn(log, "  ^-- Server node need to load definition of data classes. " +
+                        "It can be reason of ClassNotFoundException(consider IgniteCache.withKeepBinary to fix)");
+                    LT.warn(log, "Refer this page for detailed information: " +
+                        "https://apacheignite.readme.io/docs/binary-marshaller");
+                }
+
                 if (!X.hasCause(e, GridDhtUnreservedPartitionException.class))
                     U.error(log, "Failed to run query [qry=" + qryInfo + ", node=" + cctx.nodeId() + "]", e);
 
@@ -1471,7 +1485,7 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte
                         metrics.addGetTimeNanos(System.nanoTime() - start);
                     }
 
-                    if (readEvt) {
+                    if (readEvt && cctx.gridEvents().hasListener(EVT_CACHE_QUERY_OBJECT_READ)) {
                         cctx.gridEvents().record(new CacheQueryReadEvent<>(
                             cctx.localNode(),
                             "Scan query entry read.",

http://git-wip-us.apache.org/repos/asf/ignite/blob/29413922/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanSelfTest.java
index e0da1f6..f18aebe 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanSelfTest.java
@@ -75,7 +75,7 @@ public class IgniteCacheBinaryObjectsScanSelfTest extends GridCommonAbstractTest
         discoSpi.setIpFinder(IP_FINDER);
 
         cfg.setDiscoverySpi(discoSpi);
-        cfg.setIncludeEventTypes(new int[0]);
+        cfg.setIncludeEventTypes(getIncludeEventTypes());
 
         cfg.setMarshaller(null);
         cfg.setPeerClassLoadingEnabled(false);
@@ -90,6 +90,13 @@ public class IgniteCacheBinaryObjectsScanSelfTest extends GridCommonAbstractTest
     }
 
     /**
+     * @return EventTypes to record.
+     */
+    protected int[] getIncludeEventTypes() {
+        return new int[0];
+    }
+
+    /**
      * @param ldr Class loader.
      * @throws Exception If failed.
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/29413922/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanWithEventsSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanWithEventsSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanWithEventsSelfTest.java
new file mode 100644
index 0000000..5746a34
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheBinaryObjectsScanWithEventsSelfTest.java
@@ -0,0 +1,30 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.events.EventType;
+
+/**
+ *
+ */
+public class IgniteCacheBinaryObjectsScanWithEventsSelfTest extends IgniteCacheBinaryObjectsScanSelfTest {
+    /** {@inheritDoc} */
+    @Override protected int[] getIncludeEventTypes() {
+        return EventType.EVTS_ALL;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/29413922/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java
index 1cfb345..8164fe0 100644
--- a/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java
+++ b/modules/indexing/src/test/java/org/apache/ignite/testsuites/IgniteBinaryCacheQueryTestSuite.java
@@ -21,6 +21,7 @@ import junit.framework.TestSuite;
 import org.apache.ignite.internal.processors.cache.BinarySerializationQuerySelfTest;
 import org.apache.ignite.internal.processors.cache.BinarySerializationQueryWithReflectiveSerializerSelfTest;
 import org.apache.ignite.internal.processors.cache.IgniteCacheBinaryObjectsScanSelfTest;
+import org.apache.ignite.internal.processors.cache.IgniteCacheBinaryObjectsScanWithEventsSelfTest;
 
 /**
  * Cache query suite with binary marshaller.
@@ -37,6 +38,7 @@ public class IgniteBinaryCacheQueryTestSuite extends TestSuite {
         suite.addTestSuite(BinarySerializationQuerySelfTest.class);
         suite.addTestSuite(BinarySerializationQueryWithReflectiveSerializerSelfTest.class);
         suite.addTestSuite(IgniteCacheBinaryObjectsScanSelfTest.class);
+        suite.addTestSuite(IgniteCacheBinaryObjectsScanWithEventsSelfTest.class);
 
         //Should be adjusted. Not ready to be used with BinaryMarshaller.
         //suite.addTestSuite(GridCacheBinarySwapScanQuerySelfTest.class);


[50/50] [abbrv] ignite git commit: ignite-5658 moved to stripes + cleanup

Posted by yz...@apache.org.
ignite-5658 moved to stripes + cleanup


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

Branch: refs/heads/ignite-5658
Commit: 55f51b54f2ff4a256dda2709d05b6f56a17e8a41
Parents: d849764
Author: Yakov Zhdanov <yz...@gridgain.com>
Authored: Fri Jul 28 15:06:56 2017 +0300
Committer: Yakov Zhdanov <yz...@gridgain.com>
Committed: Fri Jul 28 15:06:56 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/IgniteDataStreamer.java   | 14 +++-
 .../ignite/internal/jdbc2/JdbcConnection.java   |  2 +-
 .../datastreamer/DataStreamerImpl.java          | 82 ++++++++------------
 .../DataStreamProcessorSelfTest.java            | 17 ++--
 4 files changed, 49 insertions(+), 66 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/55f51b54/modules/core/src/main/java/org/apache/ignite/IgniteDataStreamer.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/IgniteDataStreamer.java b/modules/core/src/main/java/org/apache/ignite/IgniteDataStreamer.java
index e2473dc..0e84e36 100644
--- a/modules/core/src/main/java/org/apache/ignite/IgniteDataStreamer.java
+++ b/modules/core/src/main/java/org/apache/ignite/IgniteDataStreamer.java
@@ -72,7 +72,7 @@ import org.jetbrains.annotations.Nullable;
  *      this setting limits maximum allowed number of parallel buffered stream messages that
  *      are being processed on remote nodes. If this number is exceeded, then
  *      {@link #addData(Object, Object)} method will block to control memory utilization.
- *      Default is defined by {@link #DFLT_MAX_PARALLEL_OPS} value.
+ *      Default is equal to CPU count on remote node multiply by {@link #DFLT_PARALLEL_OPS_MULTIPLIER}.
  *  </li>
  *  <li>
  *      {@link #autoFlushFrequency(long)} - automatic flush frequency in milliseconds. Essentially,
@@ -100,8 +100,8 @@ import org.jetbrains.annotations.Nullable;
  * </ul>
  */
 public interface IgniteDataStreamer<K, V> extends AutoCloseable {
-    /** Default max concurrent put operations count. */
-    public static final int DFLT_MAX_PARALLEL_OPS = 16;
+    /** Default concurrent put operations multiplier for CPU count. */
+    public static final int DFLT_PARALLEL_OPS_MULTIPLIER = 20;
 
     /** Default per node buffer size. */
     public static final int DFLT_PER_NODE_BUFFER_SIZE = 1024;
@@ -193,6 +193,10 @@ public interface IgniteDataStreamer<K, V> extends AutoCloseable {
 
     /**
      * Gets maximum number of parallel stream operations for a single node.
+     * <p>
+     * If not provided (is equal to {@code 0}), then default value is equal to CPU count
+     * on remote node multiply by {@link #DFLT_PARALLEL_OPS_MULTIPLIER}
+     * or equal provided value if this property is set.
      *
      * @return Maximum number of parallel stream operations for a single node.
      */
@@ -203,7 +207,9 @@ public interface IgniteDataStreamer<K, V> extends AutoCloseable {
      * <p>
      * This method should be called prior to {@link #addData(Object, Object)} call.
      * <p>
-     * If not provided, default value is {@link #DFLT_MAX_PARALLEL_OPS}.
+     * If not provided (is equal to {@code 0}), then default value is equal to CPU count
+     * on remote node multiply by {@link #DFLT_PARALLEL_OPS_MULTIPLIER}
+     * or equal provided value if this property is set.
      *
      * @param parallelOps Maximum number of parallel stream operations for a single node.
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/55f51b54/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java
index 1bf51f2..eb443c6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/jdbc2/JdbcConnection.java
@@ -186,7 +186,7 @@ public class JdbcConnection implements Connection {
         streamNodeBufSize = Integer.parseInt(props.getProperty(PROP_STREAMING_PER_NODE_BUF_SIZE,
             String.valueOf(IgniteDataStreamer.DFLT_PER_NODE_BUFFER_SIZE)));
         streamNodeParOps = Integer.parseInt(props.getProperty(PROP_STREAMING_PER_NODE_PAR_OPS,
-            String.valueOf(IgniteDataStreamer.DFLT_MAX_PARALLEL_OPS)));
+            String.valueOf(IgniteDataStreamer.DFLT_PARALLEL_OPS_MULTIPLIER)));
 
         String nodeIdProp = props.getProperty(PROP_NODE_ID);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/55f51b54/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerImpl.java
index 5d1b0a3..6e9fbb5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastreamer/DataStreamerImpl.java
@@ -17,6 +17,7 @@
 
 package org.apache.ignite.internal.processors.datastreamer;
 
+import java.lang.reflect.Array;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -62,6 +63,7 @@ import org.apache.ignite.internal.IgniteInternalFuture;
 import org.apache.ignite.internal.IgniteInterruptedCheckedException;
 import org.apache.ignite.internal.cluster.ClusterTopologyCheckedException;
 import org.apache.ignite.internal.cluster.ClusterTopologyServerNotFoundException;
+import org.apache.ignite.internal.managers.communication.GridIoMessage;
 import org.apache.ignite.internal.managers.communication.GridIoPolicy;
 import org.apache.ignite.internal.managers.communication.GridMessageListener;
 import org.apache.ignite.internal.managers.deployment.GridDeployment;
@@ -153,7 +155,7 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
     private int bufSize = DFLT_PER_NODE_BUFFER_SIZE;
 
     /** */
-    private int parallelOps = DFLT_MAX_PARALLEL_OPS;
+    private int parallelOps;
 
     /** */
     private long timeout = DFLT_UNLIMIT_TIMEOUT;
@@ -828,6 +830,10 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
 
                         if (old != null)
                             buf = old;
+                        else if (log.isInfoEnabled())
+                            log.info("Created buffer for node [nodeId=" + nodeId +
+                                ", parallelOps=" + buf.perNodeParallelOps +
+                                ", stripes=" + buf.stripes.length + ']');
                     }
 
                     final Collection<DataStreamerEntry> entriesForNode = e.getValue();
@@ -1311,15 +1317,8 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
         /** Active futures. */
         private final Collection<IgniteInternalFuture<Object>> locFuts;
 
-//        /** Buffered entries. */
-//        private List<DataStreamerEntry> entries;
         /** Buffered entries. */
-        private final ConcurrentMap<Integer, PerPartitionBuffer> entriesMap =
-            new ConcurrentHashMap8<>();
-
-//        /** */
-//        @GridToStringExclude
-//        private GridFutureAdapter<Object> curFut;
+        private final PerStripeBuffer[] stripes;
 
         /** Local node flag. */
         private final boolean isLocNode;
@@ -1333,16 +1332,17 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
         /** */
         private final Semaphore sem;
 
-//        /** Batch topology. */
-//        private AffinityTopologyVersion batchTopVer;
+        /** */
+        private final int perNodeParallelOps;
 
         /** Closure to signal on task finish. */
         @GridToStringExclude
-        private final IgniteInClosure<IgniteInternalFuture<Object>> signalC = new IgniteInClosure<IgniteInternalFuture<Object>>() {
-            @Override public void apply(IgniteInternalFuture<Object> t) {
-                signalTaskFinished(t);
-            }
-        };
+        private final IgniteInClosure<IgniteInternalFuture<Object>> signalC =
+            new IgniteInClosure<IgniteInternalFuture<Object>>() {
+                @Override public void apply(IgniteInternalFuture<Object> t) {
+                    signalTaskFinished(t);
+                }
+            };
 
         /**
          * @param node Node.
@@ -1358,25 +1358,17 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
             // Cache local node flag.
             isLocNode = node.equals(ctx.discovery().localNode());
 
-//            entries = newEntries();
-//            curFut = new GridFutureAdapter<>();
-//            curFut.listen(signalC);
+            perNodeParallelOps = parallelOps != 0 ?
+                parallelOps :
+                node.metrics().getTotalCpus() * DFLT_PARALLEL_OPS_MULTIPLIER;
 
-            sem = new Semaphore(parallelOps);
-        }
+            sem = new Semaphore(perNodeParallelOps);
 
-//        /**
-//         * @param remap Remapping flag.
-//         */
-//        private void renewBatch(boolean remap) {
-//            entries = newEntries();
-//            curFut = new GridFutureAdapter<>();
-//
-//            batchTopVer = null;
-//
-//            if (!remap)
-//                curFut.listen(signalC);
-//        }
+            stripes = (PerStripeBuffer[])Array.newInstance(PerStripeBuffer.class, node.metrics().getTotalCpus());
+
+            for (int i = 0; i < stripes.length; i++)
+                stripes[i] = new PerStripeBuffer(i, signalC);
+        }
 
         /**
          * @param newEntries Infos.
@@ -1401,15 +1393,7 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
                 // Init buffer.
                 int part = entry.getKey().partition();
 
-                PerPartitionBuffer b = entriesMap.get(part);
-
-                if (b == null) {
-                    PerPartitionBuffer old =
-                        entriesMap.putIfAbsent(part, b = new PerPartitionBuffer(part, signalC));
-
-                    if (old != null)
-                        b = old;
-                }
+                PerStripeBuffer b = stripes[part % stripes.length];
 
                 synchronized (b) {
                     curFut0 = b.curFut;
@@ -1468,7 +1452,7 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
         @Nullable IgniteInternalFuture<?> flush() throws IgniteInterruptedCheckedException {
             acquireRemapSemaphore();
 
-            for (PerPartitionBuffer b : entriesMap.values()) {
+            for (PerStripeBuffer b : stripes) {
                 AffinityTopologyVersion batchTopVer = null;
                 List<DataStreamerEntry> entries0 = null;
                 GridFutureAdapter<Object> curFut0 = null;
@@ -1729,11 +1713,11 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
                     dep != null ? dep.classLoaderId() : null,
                     dep == null,
                     topVer,
-                    rcvr == ISOLATED_UPDATER ? partId : -1);
+                    rcvr == ISOLATED_UPDATER ? partId : GridIoMessage.STRIPE_DISABLED_PART);
 
                 try {
                     ctx.io().sendToGridTopic(node, TOPIC_DATASTREAM, req,
-                        partId == -1 ? plc : GridIoPolicy.SYSTEM_POOL);
+                        req.partition() == GridIoMessage.STRIPE_DISABLED_PART ? plc : GridIoPolicy.SYSTEM_POOL);
 
                     if (log.isDebugEnabled())
                         log.debug("Sent request to node [nodeId=" + node.id() + ", req=" + req + ']');
@@ -1779,7 +1763,7 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
             // Make sure to complete current future.
             GridFutureAdapter<Object> curFut0;
 
-            for (PerPartitionBuffer b : entriesMap.values()) {
+            for (PerStripeBuffer b : stripes) {
                 synchronized (b) {
                     curFut0 = b.curFut;
                 }
@@ -2118,7 +2102,7 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
     /**
      *
      */
-    private class PerPartitionBuffer {
+    private class PerStripeBuffer {
         /** */
         private final int partId;
 
@@ -2138,7 +2122,7 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
          * @param partId Partition ID.
          * @param c Signal closure.
          */
-        public PerPartitionBuffer(
+        public PerStripeBuffer(
             int partId,
             IgniteInClosure<? super IgniteInternalFuture<Object>> c
         ) {
@@ -2167,7 +2151,7 @@ public class DataStreamerImpl<K, V> implements IgniteDataStreamer<K, V>, Delayed
 
         /** {@inheritDoc} */
         @Override public String toString() {
-            return S.toString(PerPartitionBuffer.class, this, super.toString());
+            return S.toString(PerStripeBuffer.class, this, super.toString());
         }
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/55f51b54/modules/core/src/test/java/org/apache/ignite/internal/processors/datastreamer/DataStreamProcessorSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/datastreamer/DataStreamProcessorSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/datastreamer/DataStreamProcessorSelfTest.java
index ec5e6d0..b8ca255 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/datastreamer/DataStreamProcessorSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/datastreamer/DataStreamProcessorSelfTest.java
@@ -962,8 +962,7 @@ public class DataStreamProcessorSelfTest extends GridCommonAbstractTest {
 
             final IgniteCache<String, String> cache = ignite.cache(DEFAULT_CACHE_NAME);
 
-            IgniteDataStreamer<String, String> ldr = ignite.dataStreamer(DEFAULT_CACHE_NAME);
-            try {
+            try (IgniteDataStreamer<String, String> ldr = ignite.dataStreamer(DEFAULT_CACHE_NAME)) {
                 ldr.receiver(new StreamReceiver<String, String>() {
                     @Override public void receive(IgniteCache<String, String> cache,
                         Collection<Map.Entry<String, String>> entries) throws IgniteException {
@@ -972,6 +971,7 @@ public class DataStreamProcessorSelfTest extends GridCommonAbstractTest {
                         cache.put("key", threadName);
                     }
                 });
+
                 ldr.addData("key", "value");
 
                 ldr.tryFlush();
@@ -982,9 +982,6 @@ public class DataStreamProcessorSelfTest extends GridCommonAbstractTest {
                     }
                 }, 3_000);
             }
-            finally {
-                ldr.close(true);
-            }
 
             assertNotNull(cache.get("key"));
 
@@ -1011,9 +1008,7 @@ public class DataStreamProcessorSelfTest extends GridCommonAbstractTest {
 
             final IgniteCache<String, String> cache = ignite.cache(DEFAULT_CACHE_NAME);
 
-            IgniteDataStreamer<String, String> ldr = client.dataStreamer(DEFAULT_CACHE_NAME);
-
-            try {
+            try (IgniteDataStreamer<String, String> ldr = client.dataStreamer(DEFAULT_CACHE_NAME)) {
                 ldr.receiver(new StringStringStreamReceiver());
 
                 ldr.addData("key", "value");
@@ -1021,14 +1016,12 @@ public class DataStreamProcessorSelfTest extends GridCommonAbstractTest {
                 ldr.tryFlush();
 
                 GridTestUtils.waitForCondition(new GridAbsPredicate() {
-                    @Override public boolean apply() {
+                    @Override
+                    public boolean apply() {
                         return cache.get("key") != null;
                     }
                 }, 3_000);
             }
-            finally {
-                ldr.close(true);
-            }
 
             assertNotNull(cache.get("key"));
 


[43/50] [abbrv] ignite git commit: IGNITE-5771: Added Ignite::SetActive() for C++

Posted by yz...@apache.org.
IGNITE-5771: Added Ignite::SetActive() for C++


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

Branch: refs/heads/ignite-5658
Commit: 47fea40b07857a08727ac2e062cb9a3e0f464fdc
Parents: 2941392
Author: Igor Sapego <is...@gridgain.com>
Authored: Thu Jul 27 19:39:51 2017 +0300
Committer: Igor Sapego <is...@gridgain.com>
Committed: Thu Jul 27 19:39:51 2017 +0300

----------------------------------------------------------------------
 .../cpp/core-test/src/cluster_test.cpp          | 13 ++++++
 .../platforms/cpp/core/include/ignite/ignite.h  | 15 +++++++
 .../ignite/impl/cluster/cluster_group_impl.h    | 15 +++++++
 .../cpp/core/include/ignite/impl/ignite_impl.h  | 46 ++++++++++----------
 modules/platforms/cpp/core/src/ignite.cpp       | 10 +++++
 .../src/impl/cluster/cluster_group_impl.cpp     | 26 ++++++++++-
 .../platforms/cpp/core/src/impl/ignite_impl.cpp | 24 ++++++++++
 7 files changed, 124 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/47fea40b/modules/platforms/cpp/core-test/src/cluster_test.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core-test/src/cluster_test.cpp b/modules/platforms/cpp/core-test/src/cluster_test.cpp
index e9d6728..4ee3f39 100644
--- a/modules/platforms/cpp/core-test/src/cluster_test.cpp
+++ b/modules/platforms/cpp/core-test/src/cluster_test.cpp
@@ -83,4 +83,17 @@ BOOST_AUTO_TEST_CASE(IgniteImplForServers)
     BOOST_REQUIRE(clusterGroup.Get()->ForServers().IsValid());
 }
 
+BOOST_AUTO_TEST_CASE(IgniteSetActive)
+{
+    BOOST_REQUIRE(node.IsActive());
+
+    node.SetActive(false);
+
+    BOOST_REQUIRE(!node.IsActive());
+
+    node.SetActive(true);
+
+    BOOST_REQUIRE(node.IsActive());
+}
+
 BOOST_AUTO_TEST_SUITE_END()
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/47fea40b/modules/platforms/cpp/core/include/ignite/ignite.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/include/ignite/ignite.h b/modules/platforms/cpp/core/include/ignite/ignite.h
index 07134a1..e953b8f 100644
--- a/modules/platforms/cpp/core/include/ignite/ignite.h
+++ b/modules/platforms/cpp/core/include/ignite/ignite.h
@@ -182,6 +182,21 @@ namespace ignite
         }
 
         /**
+         * Check if the Ignite grid is active.
+         *
+         * @return True if grid is active and false otherwise.
+         */
+        bool IsActive();
+
+        /**
+         * Change Ignite grid state to active or inactive.
+         *
+         * @param active If true start activation process. If false start
+         *    deactivation process.
+         */
+        void SetActive(bool active);
+
+        /**
          * Get transactions.
          *
          * This method should only be used on the valid instance.

http://git-wip-us.apache.org/repos/asf/ignite/blob/47fea40b/modules/platforms/cpp/core/include/ignite/impl/cluster/cluster_group_impl.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/include/ignite/impl/cluster/cluster_group_impl.h b/modules/platforms/cpp/core/include/ignite/impl/cluster/cluster_group_impl.h
index 3cfd700..d81e899 100644
--- a/modules/platforms/cpp/core/include/ignite/impl/cluster/cluster_group_impl.h
+++ b/modules/platforms/cpp/core/include/ignite/impl/cluster/cluster_group_impl.h
@@ -71,6 +71,21 @@ namespace ignite
                  */
                 SP_ComputeImpl GetCompute();
 
+                /**
+                 * Check if the Ignite grid is active.
+                 *
+                 * @return True if grid is active and false otherwise.
+                 */
+                bool IsActive();
+
+                /**
+                 * Change Ignite grid state to active or inactive.
+                 *
+                 * @param active If true start activation process. If false start
+                 *    deactivation process.
+                 */
+                void SetActive(bool active);
+
             private:
                 IGNITE_NO_COPY_ASSIGNMENT(ClusterGroupImpl);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/47fea40b/modules/platforms/cpp/core/include/ignite/impl/ignite_impl.h
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/include/ignite/impl/ignite_impl.h b/modules/platforms/cpp/core/include/ignite/impl/ignite_impl.h
index d1763c4..5461d1c 100644
--- a/modules/platforms/cpp/core/include/ignite/impl/ignite_impl.h
+++ b/modules/platforms/cpp/core/include/ignite/impl/ignite_impl.h
@@ -182,6 +182,27 @@ namespace ignite
              */
             SP_ComputeImpl GetCompute();
 
+            /**
+             * Check if the Ignite grid is active.
+             *
+             * @return True if grid is active and false otherwise.
+             */
+            bool IsActive()
+            {
+                return prjImpl.Get()->IsActive();
+            }
+
+            /**
+             * Change Ignite grid state to active or inactive.
+             *
+             * @param active If true start activation process. If false start
+             *    deactivation process.
+             */
+            void SetActive(bool active)
+            {
+                prjImpl.Get()->SetActive(active);
+            }
+
         private:
             /**
              * Get transactions internal call.
@@ -215,30 +236,7 @@ namespace ignite
             * @param err Error.
             * @param op Operation code.
             */
-            cache::CacheImpl* GetOrCreateCache(const char* name, IgniteError& err, int32_t op)
-            {
-                SharedPointer<InteropMemory> mem = env.Get()->AllocateMemory();
-                InteropMemory* mem0 = mem.Get();
-                InteropOutputStream out(mem0);
-                BinaryWriterImpl writer(&out, env.Get()->GetTypeManager());
-                BinaryRawWriter rawWriter(&writer);
-
-                rawWriter.WriteString(name);
-
-                out.Synchronize();
-
-                jobject cacheJavaRef = InStreamOutObject(op, *mem0, err);
-
-                if (!cacheJavaRef)
-                {
-                    return NULL;
-                }
-
-                char* name0 = common::CopyChars(name);
-
-                return new cache::CacheImpl(name0, env, cacheJavaRef);
-            }
-
+            cache::CacheImpl* GetOrCreateCache(const char* name, IgniteError& err, int32_t op);
         };
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/47fea40b/modules/platforms/cpp/core/src/ignite.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/src/ignite.cpp b/modules/platforms/cpp/core/src/ignite.cpp
index 9c42f1d..6eaae01 100644
--- a/modules/platforms/cpp/core/src/ignite.cpp
+++ b/modules/platforms/cpp/core/src/ignite.cpp
@@ -45,6 +45,16 @@ namespace ignite
         return impl.Get()->GetConfiguration();
     }
 
+    bool Ignite::IsActive()
+    {
+        return impl.Get()->IsActive();
+    }
+
+    void Ignite::SetActive(bool active)
+    {
+        impl.Get()->SetActive(active);
+    }
+
     transactions::Transactions Ignite::GetTransactions()
     {
         using ignite::common::concurrent::SharedPointer;

http://git-wip-us.apache.org/repos/asf/ignite/blob/47fea40b/modules/platforms/cpp/core/src/impl/cluster/cluster_group_impl.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/src/impl/cluster/cluster_group_impl.cpp b/modules/platforms/cpp/core/src/impl/cluster/cluster_group_impl.cpp
index c34e828..91f9d30 100644
--- a/modules/platforms/cpp/core/src/impl/cluster/cluster_group_impl.cpp
+++ b/modules/platforms/cpp/core/src/impl/cluster/cluster_group_impl.cpp
@@ -30,7 +30,11 @@ namespace ignite
             {
                 enum Type
                 {
-                    FOR_SERVERS = 23
+                    FOR_SERVERS = 23,
+
+                    SET_ACTIVE = 28,
+
+                    IS_ACTIVE = 29
                 };
             };
 
@@ -61,6 +65,26 @@ namespace ignite
                 return computeImpl;
             }
 
+            bool ClusterGroupImpl::IsActive()
+            {
+                IgniteError err;
+
+                int64_t res = OutInOpLong(Command::IS_ACTIVE, 0, err);
+
+                IgniteError::ThrowIfNeeded(err);
+
+                return res == 1;
+            }
+
+            void ClusterGroupImpl::SetActive(bool active)
+            {
+                IgniteError err;
+
+                int64_t res = OutInOpLong(Command::SET_ACTIVE, active ? 1 : 0, err);
+
+                IgniteError::ThrowIfNeeded(err);
+            }
+
             SP_ClusterGroupImpl ClusterGroupImpl::FromTarget(jobject javaRef)
             {
                 return SP_ClusterGroupImpl(new ClusterGroupImpl(GetEnvironmentPointer(), javaRef));

http://git-wip-us.apache.org/repos/asf/ignite/blob/47fea40b/modules/platforms/cpp/core/src/impl/ignite_impl.cpp
----------------------------------------------------------------------
diff --git a/modules/platforms/cpp/core/src/impl/ignite_impl.cpp b/modules/platforms/cpp/core/src/impl/ignite_impl.cpp
index f7ff185..f2132d4 100644
--- a/modules/platforms/cpp/core/src/impl/ignite_impl.cpp
+++ b/modules/platforms/cpp/core/src/impl/ignite_impl.cpp
@@ -91,5 +91,29 @@ namespace ignite
 
             return res;
         }
+
+        cache::CacheImpl* IgniteImpl::GetOrCreateCache(const char* name, IgniteError& err, int32_t op)
+        {
+            SharedPointer<InteropMemory> mem = env.Get()->AllocateMemory();
+            InteropMemory* mem0 = mem.Get();
+            InteropOutputStream out(mem0);
+            BinaryWriterImpl writer(&out, env.Get()->GetTypeManager());
+            BinaryRawWriter rawWriter(&writer);
+
+            rawWriter.WriteString(name);
+
+            out.Synchronize();
+
+            jobject cacheJavaRef = InStreamOutObject(op, *mem0, err);
+
+            if (!cacheJavaRef)
+            {
+                return NULL;
+            }
+
+            char* name0 = common::CopyChars(name);
+
+            return new cache::CacheImpl(name0, env, cacheJavaRef);
+        }
     }
 }


[02/50] [abbrv] ignite git commit: Merge branch 'ignite-2.1.3' of https://github.com/gridgain/apache-ignite

Posted by yz...@apache.org.
Merge branch 'ignite-2.1.3' of https://github.com/gridgain/apache-ignite


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

Branch: refs/heads/ignite-5658
Commit: cde3da448e297846e0ae5aca58a8f8f07fc407fc
Parents: e5f2d90 23f26af
Author: Alexey Goncharuk <al...@gmail.com>
Authored: Wed Jul 19 12:13:01 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Wed Jul 19 12:13:01 2017 +0300

----------------------------------------------------------------------
 .../apache/ignite/IgniteSystemProperties.java   |  20 +++
 .../cache/CacheObjectsReleaseFuture.java        |  60 +++++++++
 .../cache/GridCacheExplicitLockSpan.java        |  10 +-
 .../processors/cache/GridCacheMvccManager.java  |  24 +++-
 .../cache/GridCacheSharedContext.java           |   4 +-
 ...idNearAtomicAbstractSingleUpdateRequest.java |   9 +-
 ...GridNearAtomicSingleUpdateInvokeRequest.java |   6 +
 .../atomic/GridNearAtomicUpdateResponse.java    |   2 +-
 .../GridDhtPartitionsExchangeFuture.java        |  30 +++--
 .../cache/transactions/IgniteTxAdapter.java     |  44 ++++++-
 .../cache/transactions/IgniteTxManager.java     |   5 +-
 .../service/GridServiceProcessor.java           |   4 +-
 .../processors/service/ServiceContextImpl.java  |   2 +
 .../util/future/GridCompoundFuture.java         |   6 +-
 .../util/tostring/GridToStringBuilder.java      |   2 +-
 .../spi/IgniteSpiOperationTimeoutHelper.java    |   8 +-
 .../communication/tcp/TcpCommunicationSpi.java  | 131 ++++++++++++-------
 .../ignite/spi/discovery/tcp/ServerImpl.java    |  72 +++++++---
 .../spi/discovery/tcp/TcpDiscoverySpi.java      |  16 ++-
 .../IgniteClientReconnectAbstractTest.java      |   5 +
 .../cache/GridCachePutAllFailoverSelfTest.java  |  15 +++
 .../cache/IgniteCachePutAllRestartTest.java     |  15 +++
 .../CacheGetInsideLockChangingTopologyTest.java |   5 +
 .../GridCacheAbstractNodeRestartSelfTest.java   |  12 +-
 ...niteBinaryMetadataUpdateNodeRestartTest.java |  10 ++
 .../distributed/IgniteCacheGetRestartTest.java  |   5 +
 .../IgniteCacheNearRestartRollbackSelfTest.java |  15 +++
 ...teSynchronizationModesMultithreadedTest.java |   5 +
 .../IgniteCachePutRetryAbstractSelfTest.java    |   5 +
 .../org/apache/ignite/spi/GridTcpForwarder.java |  26 ++++
 .../tcp/TcpCommunicationSpiDropNodesTest.java   |  15 +++
 .../TcpCommunicationSpiFaultyClientTest.java    |  20 ++-
 .../IgniteCacheRestartTestSuite2.java           |   2 +
 33 files changed, 494 insertions(+), 116 deletions(-)
----------------------------------------------------------------------



[34/50] [abbrv] ignite git commit: IGNITE-4648 IgniteInternalTx.prepare() does not wait for async operations to complete

Posted by yz...@apache.org.
IGNITE-4648 IgniteInternalTx.prepare() does not wait for async operations to complete


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

Branch: refs/heads/ignite-5658
Commit: e96225f1ed4080243844108e798e3fa74d13d542
Parents: de259ff
Author: Dmitrii Ryabov <So...@gmail.com>
Authored: Wed Jul 26 17:00:52 2017 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Wed Jul 26 17:00:52 2017 +0300

----------------------------------------------------------------------
 .../cache/GridCacheSharedContext.java           |   6 +-
 .../cache/distributed/near/GridNearTxLocal.java |   6 +-
 .../IgniteTxImplicitSingleStateImpl.java        |   2 +-
 .../IgniteTxRemoteStateAdapter.java             |   2 +-
 .../cache/transactions/IgniteTxState.java       |   2 +-
 .../cache/transactions/IgniteTxStateImpl.java   |   2 +-
 .../transactions/PlatformTransactions.java      |   2 +-
 ...cOriginatingNodeFailureAbstractSelfTest.java |   2 +-
 .../GridCachePartitionedTxSalvageSelfTest.java  |   8 +-
 .../processors/cache/jta/CacheJtaResource.java  |  20 +-
 .../cache/AbstractCacheJtaSelfTest.java         | 183 --------------
 .../GridPartitionedCacheJtaFactorySelfTest.java |  41 ---
 ...rtitionedCacheJtaFactoryUseSyncSelfTest.java |  32 ---
 ...titionedCacheJtaLookupClassNameSelfTest.java |  83 -------
 .../GridReplicatedCacheJtaFactorySelfTest.java  |  32 ---
 ...eplicatedCacheJtaFactoryUseSyncSelfTest.java |  32 ---
 ...plicatedCacheJtaLookupClassNameSelfTest.java |  32 ---
 .../cache/jta/AbstractCacheJtaSelfTest.java     | 248 +++++++++++++++++++
 .../GridPartitionedCacheJtaFactorySelfTest.java |  41 +++
 ...rtitionedCacheJtaFactoryUseSyncSelfTest.java |  32 +++
 ...titionedCacheJtaLookupClassNameSelfTest.java |  83 +++++++
 .../GridReplicatedCacheJtaFactorySelfTest.java  |  32 +++
 ...eplicatedCacheJtaFactoryUseSyncSelfTest.java |  32 +++
 ...plicatedCacheJtaLookupClassNameSelfTest.java |  32 +++
 .../processors/cache/jta/package-info.java      |  22 ++
 .../ignite/testsuites/IgniteJtaTestSuite.java   |  12 +-
 .../Cache/CacheAbstractTransactionalTest.cs     |  53 ++--
 27 files changed, 591 insertions(+), 483 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
index 5387cc8..1876023 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSharedContext.java
@@ -910,7 +910,7 @@ public class GridCacheSharedContext<K, V> {
      * @throws IgniteCheckedException If failed.
      */
     public void endTx(GridNearTxLocal tx) throws IgniteCheckedException {
-        tx.txState().awaitLastFut(this);
+        tx.txState().awaitLastFuture(this);
 
         tx.close();
     }
@@ -924,7 +924,7 @@ public class GridCacheSharedContext<K, V> {
         GridCacheContext ctx = tx.txState().singleCacheContext(this);
 
         if (ctx == null) {
-            tx.txState().awaitLastFut(this);
+            tx.txState().awaitLastFuture(this);
 
             return tx.commitNearTxLocalAsync();
         }
@@ -938,7 +938,7 @@ public class GridCacheSharedContext<K, V> {
      * @return Rollback future.
      */
     public IgniteInternalFuture rollbackTxAsync(GridNearTxLocal tx) throws IgniteCheckedException {
-        tx.txState().awaitLastFut(this);
+        tx.txState().awaitLastFuture(this);
 
         return tx.rollbackNearTxLocalAsync();
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java
index 81e5ca8..58ecee9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/near/GridNearTxLocal.java
@@ -3120,9 +3120,13 @@ public class GridNearTxLocal extends GridDhtTxLocalAdapter implements AutoClosea
     }
 
     /**
+     * @param awaitLastFuture If true - method will wait until transaction finish every action started before.
      * @throws IgniteCheckedException If failed.
      */
-    public final void prepare() throws IgniteCheckedException {
+    public final void prepare(boolean awaitLastFuture) throws IgniteCheckedException {
+        if (awaitLastFuture)
+            txState().awaitLastFuture(cctx);
+
         prepareAsync().get();
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxImplicitSingleStateImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxImplicitSingleStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxImplicitSingleStateImpl.java
index 7610d50..886d0d6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxImplicitSingleStateImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxImplicitSingleStateImpl.java
@@ -91,7 +91,7 @@ public class IgniteTxImplicitSingleStateImpl extends IgniteTxLocalStateAdapter {
     }
 
     /** {@inheritDoc} */
-    @Override public void awaitLastFut(GridCacheSharedContext ctx) {
+    @Override public void awaitLastFuture(GridCacheSharedContext ctx) {
         if (cacheCtx == null)
             return;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateAdapter.java
index 86ae684..bcb900c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxRemoteStateAdapter.java
@@ -44,7 +44,7 @@ public abstract class IgniteTxRemoteStateAdapter implements IgniteTxRemoteState
     }
 
     /** {@inheritDoc} */
-    @Override public void awaitLastFut(GridCacheSharedContext cctx) {
+    @Override public void awaitLastFuture(GridCacheSharedContext cctx) {
         assert false;
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxState.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxState.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxState.java
index ee48ed7..1fe0d2a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxState.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxState.java
@@ -59,7 +59,7 @@ public interface IgniteTxState {
     /**
      * @param cctx Awaits for previous async operations on active caches to be completed.
      */
-    public void awaitLastFut(GridCacheSharedContext cctx);
+    public void awaitLastFuture(GridCacheSharedContext cctx);
 
     /**
      * @param cctx Context.

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java
index ad4ca61..4f14b5c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxStateImpl.java
@@ -107,7 +107,7 @@ public class IgniteTxStateImpl extends IgniteTxLocalStateAdapter {
     }
 
     /** {@inheritDoc} */
-    @Override public void awaitLastFut(GridCacheSharedContext cctx) {
+    @Override public void awaitLastFuture(GridCacheSharedContext cctx) {
         for (int i = 0; i < activeCacheIds.size(); i++) {
             int cacheId = activeCacheIds.get(i);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/transactions/PlatformTransactions.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/transactions/PlatformTransactions.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/transactions/PlatformTransactions.java
index 8f34343..8baca9b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/transactions/PlatformTransactions.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/platform/transactions/PlatformTransactions.java
@@ -160,7 +160,7 @@ public class PlatformTransactions extends PlatformAbstractTarget {
     @Override public long processInLongOutLong(int type, long val) throws IgniteCheckedException {
         switch (type) {
             case OP_PREPARE:
-                ((TransactionProxyImpl)tx(val)).tx().prepare();
+                ((TransactionProxyImpl)tx(val)).tx().prepare(true);
 
                 return TRUE;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxPessimisticOriginatingNodeFailureAbstractSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxPessimisticOriginatingNodeFailureAbstractSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxPessimisticOriginatingNodeFailureAbstractSelfTest.java
index 0463c46..7514555 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxPessimisticOriginatingNodeFailureAbstractSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/IgniteTxPessimisticOriginatingNodeFailureAbstractSelfTest.java
@@ -349,7 +349,7 @@ public abstract class IgniteTxPessimisticOriginatingNodeFailureAbstractSelfTest
             assertTrue(txEx.pessimistic());
 
             if (commmit) {
-                txEx.prepare();
+                txEx.prepare(true);
 
                 // Fail the node in the middle of transaction.
                 info(">>> Stopping primary node " + primaryNode);

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedTxSalvageSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedTxSalvageSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedTxSalvageSelfTest.java
index 06fbe8f..256e8da 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedTxSalvageSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCachePartitionedTxSalvageSelfTest.java
@@ -152,7 +152,7 @@ public class GridCachePartitionedTxSalvageSelfTest extends GridCommonAbstractTes
      * Check whether caches has no transactions after salvage timeout.
      *
      * @param mode Transaction mode (PESSIMISTIC, OPTIMISTIC).
-     * @param prepare Whether to prepare transaction state (i.e. call {@link GridNearTxLocal#prepare()}).
+     * @param prepare Whether to prepare transaction state (i.e. call {@link GridNearTxLocal#prepare(boolean)}).
      * @throws Exception If failed.
      */
     private void checkSalvageAfterTimeout(TransactionConcurrency mode, boolean prepare) throws Exception {
@@ -171,7 +171,7 @@ public class GridCachePartitionedTxSalvageSelfTest extends GridCommonAbstractTes
      *
      * @param mode Transaction mode (PESSIMISTIC, OPTIMISTIC).
      * @param prepare Whether to prepare transaction state
-     *                (i.e. call {@link GridNearTxLocal#prepare()}).
+     *                (i.e. call {@link GridNearTxLocal#prepare(boolean)}).
      * @throws Exception If failed.
      */
     private void checkSalvageBeforeTimeout(TransactionConcurrency mode, boolean prepare) throws Exception {
@@ -197,7 +197,7 @@ public class GridCachePartitionedTxSalvageSelfTest extends GridCommonAbstractTes
      * Start new transaction on the grid(0) and put some keys to it.
      *
      * @param mode Transaction mode (PESSIMISTIC, OPTIMISTIC).
-     * @param prepare Whether to prepare transaction state (i.e. call {@link GridNearTxLocal#prepare()}).
+     * @param prepare Whether to prepare transaction state (i.e. call {@link GridNearTxLocal#prepare(boolean)}).
      * @throws Exception If failed.
      */
     private void startTxAndPutKeys(final TransactionConcurrency mode, final boolean prepare) throws Exception {
@@ -216,7 +216,7 @@ public class GridCachePartitionedTxSalvageSelfTest extends GridCommonAbstractTes
                         c.put(key, "val" + key);
 
                     if (prepare)
-                        ((TransactionProxyImpl)tx).tx().prepare();
+                        ((TransactionProxyImpl)tx).tx().prepare(true);
                 }
                 catch (IgniteCheckedException e) {
                     info("Failed to put keys to cache: " + e.getMessage());

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaResource.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaResource.java b/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaResource.java
index 649f7c4..c63dafa 100644
--- a/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaResource.java
+++ b/modules/jta/src/main/java/org/apache/ignite/internal/processors/cache/jta/CacheJtaResource.java
@@ -56,6 +56,9 @@ final class CacheJtaResource implements XAResource, Synchronization {
     /** */
     private Xid xid;
 
+    /** */
+    private final GridKernalContext ctx;
+
     /**
      * @param cacheTx Cache jta.
      * @param ctx Kernal context.
@@ -65,6 +68,7 @@ final class CacheJtaResource implements XAResource, Synchronization {
         assert ctx != null;
 
         this.cacheTx = cacheTx;
+        this.ctx = ctx;
 
         if (log == null)
             log = U.logger(ctx, logRef, CacheJtaResource.class);
@@ -100,7 +104,7 @@ final class CacheJtaResource implements XAResource, Synchronization {
             log.debug("XA resource rollback(...) [xid=" + xid + "]");
 
         try {
-            cacheTx.rollback();
+            ctx.cache().context().rollbackTxAsync(cacheTx).get();
         }
         catch (IgniteCheckedException e) {
             throwException("Failed to rollback cache transaction: " + e.getMessage(), e);
@@ -118,7 +122,7 @@ final class CacheJtaResource implements XAResource, Synchronization {
             throw new XAException("Cache transaction is not in active state.");
 
         try {
-            cacheTx.prepare();
+            cacheTx.prepare(true);
         }
         catch (IgniteCheckedException e) {
             throwException("Failed to prepare cache transaction.", e);
@@ -146,7 +150,7 @@ final class CacheJtaResource implements XAResource, Synchronization {
             log.debug("XA resource commit(...) [xid=" + xid + ", onePhase=" + onePhase + "]");
 
         try {
-            cacheTx.commit();
+            ctx.cache().context().commitTxAsync(cacheTx).get();
         }
         catch (IgniteCheckedException e) {
             throwException("Failed to commit cache transaction: " + e.getMessage(), e);
@@ -161,9 +165,7 @@ final class CacheJtaResource implements XAResource, Synchronization {
             log.debug("XA resource forget(...) [xid=" + xid + "]");
 
         try {
-            cacheTx.invalidate(true);
-
-            cacheTx.commit();
+            ctx.cache().context().rollbackTxAsync(cacheTx).get();
         }
         catch (IgniteCheckedException e) {
             throwException("Failed to forget cache transaction: " + e.getMessage(), e);
@@ -246,7 +248,7 @@ final class CacheJtaResource implements XAResource, Synchronization {
             throw new CacheException("Cache transaction is not in active state.");
 
         try {
-            cacheTx.prepare();
+            cacheTx.prepare(true);
         }
         catch (IgniteCheckedException e) {
             throw new CacheException("Failed to prepare cache transaction.", e);
@@ -261,7 +263,7 @@ final class CacheJtaResource implements XAResource, Synchronization {
                     log.debug("Synchronization.afterCompletion(STATUS_COMMITTED) [xid=" + cacheTx.xid() + "]");
 
                 try {
-                    cacheTx.commit();
+                    ctx.cache().context().commitTxAsync(cacheTx).get();
                 }
                 catch (IgniteCheckedException e) {
                     throw new CacheException("Failed to commit cache transaction.", e);
@@ -274,7 +276,7 @@ final class CacheJtaResource implements XAResource, Synchronization {
                     log.debug("Synchronization.afterCompletion(STATUS_ROLLEDBACK) [xid=" + cacheTx.xid() + "]");
 
                 try {
-                    cacheTx.rollback();
+                    ctx.cache().context().rollbackTxAsync(cacheTx).get();
                 }
                 catch (IgniteCheckedException e) {
                     throw new CacheException("Failed to rollback cache transaction.", e);

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/AbstractCacheJtaSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/AbstractCacheJtaSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/AbstractCacheJtaSelfTest.java
deleted file mode 100644
index 37af32c..0000000
--- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/AbstractCacheJtaSelfTest.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.ignite.internal.processors.cache;
-
-import javax.transaction.Status;
-import javax.transaction.UserTransaction;
-import org.apache.ignite.IgniteCache;
-import org.apache.ignite.cache.CacheMode;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.transactions.Transaction;
-import org.objectweb.jotm.Jotm;
-
-import static org.apache.ignite.cache.CacheMode.PARTITIONED;
-import static org.apache.ignite.transactions.TransactionState.ACTIVE;
-
-/**
- * Abstract class for cache tests.
- */
-public abstract class AbstractCacheJtaSelfTest extends GridCacheAbstractSelfTest {
-    /** */
-    private static final int GRID_CNT = 1;
-
-    /** Java Open Transaction Manager facade. */
-    protected static Jotm jotm;
-
-    /** {@inheritDoc} */
-    @Override protected void beforeTestsStarted() throws Exception {
-        jotm = new Jotm(true, false);
-
-        super.beforeTestsStarted();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected void afterTestsStopped() throws Exception {
-        super.afterTestsStopped();
-
-        jotm.stop();
-    }
-
-    /** {@inheritDoc} */
-    @Override protected int gridCount() {
-        return GRID_CNT;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected CacheMode cacheMode() {
-        return PARTITIONED;
-    }
-
-    /** {@inheritDoc} */
-    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
-        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
-
-        configureJta(cfg);
-
-        CacheConfiguration cfg1 = cacheConfiguration(igniteInstanceName);
-
-        CacheConfiguration cfg2 = cacheConfiguration(igniteInstanceName);
-
-        cfg2.setName("cache-2");
-
-        cfg.setCacheConfiguration(cfg1, cfg2);
-
-        return cfg;
-    }
-
-    /**
-     * @param cfg Ignite Configuration.
-     */
-    protected abstract void configureJta(IgniteConfiguration cfg);
-
-    /**
-     * JUnit.
-     *
-     * @throws Exception If failed.
-     */
-    public void testJta() throws Exception {
-        UserTransaction jtaTx = jotm.getUserTransaction();
-
-        IgniteCache<String, Integer> cache = jcache();
-
-        assert ignite(0).transactions().tx() == null;
-
-        jtaTx.begin();
-
-        try {
-            assert ignite(0).transactions().tx() == null;
-
-            assert cache.getAndPut("key", 1) == null;
-
-            Transaction tx = ignite(0).transactions().tx();
-
-            assert tx != null;
-            assert tx.state() == ACTIVE;
-
-            Integer one = 1;
-
-            assertEquals(one, cache.get("key"));
-
-            tx = ignite(0).transactions().tx();
-
-            assert tx != null;
-            assert tx.state() == ACTIVE;
-
-            jtaTx.commit();
-
-            assert ignite(0).transactions().tx() == null;
-        }
-        finally {
-            if (jtaTx.getStatus() == Status.STATUS_ACTIVE)
-                jtaTx.rollback();
-        }
-
-        assertEquals((Integer)1, cache.get("key"));
-    }
-
-    /**
-     * @throws Exception If failed.
-     */
-    @SuppressWarnings("ConstantConditions")
-    public void testJtaTwoCaches() throws Exception {
-        UserTransaction jtaTx = jotm.getUserTransaction();
-
-        IgniteEx ignite = grid(0);
-
-        IgniteCache<String, Integer> cache1 = jcache();
-
-        IgniteCache<Object, Object> cache2 = ignite.cache("cache-2");
-
-        assertNull(ignite.transactions().tx());
-
-        jtaTx.begin();
-
-        try {
-            cache1.put("key", 0);
-            cache2.put("key", 0);
-            cache1.put("key1", 1);
-            cache2.put("key2", 2);
-
-            assertEquals(0, (int)cache1.get("key"));
-            assertEquals(0, (int)cache1.get("key"));
-            assertEquals(1, (int)cache1.get("key1"));
-            assertEquals(2, (int)cache2.get("key2"));
-
-            assertEquals(ignite.transactions().tx().state(), ACTIVE);
-
-            jtaTx.commit();
-
-            assertNull(ignite.transactions().tx());
-
-            assertEquals(0, (int)cache1.get("key"));
-            assertEquals(0, (int)cache2.get("key"));
-            assertEquals(1, (int)cache1.get("key1"));
-            assertEquals(2, (int)cache2.get("key2"));
-        }
-        finally {
-            if (jtaTx.getStatus() == Status.STATUS_ACTIVE)
-                jtaTx.rollback();
-        }
-
-        assertEquals(0, (int)cache1.get("key"));
-        assertEquals(0, (int)cache2.get("key"));
-        assertEquals(1, (int)cache1.get("key1"));
-        assertEquals(2, (int)cache2.get("key2"));
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaFactorySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaFactorySelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaFactorySelfTest.java
deleted file mode 100644
index f079974..0000000
--- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaFactorySelfTest.java
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.ignite.internal.processors.cache;
-
-import javax.cache.configuration.Factory;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.configuration.TransactionConfiguration;
-import org.objectweb.transaction.jta.TransactionManager;
-
-/**
- * Factory JTA integration test using PARTITIONED cache.
- */
-public class GridPartitionedCacheJtaFactorySelfTest extends AbstractCacheJtaSelfTest {
-    /** {@inheritDoc} */
-    @Override protected void configureJta(IgniteConfiguration cfg) {
-        TransactionConfiguration txCfg = cfg.getTransactionConfiguration();
-
-        txCfg.setTxManagerFactory(new Factory<TransactionManager>() {
-            private static final long serialVersionUID = 0L;
-
-            @Override public TransactionManager create() {
-                return jotm.getTransactionManager();
-            }
-        });
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaFactoryUseSyncSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaFactoryUseSyncSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaFactoryUseSyncSelfTest.java
deleted file mode 100644
index 5e6deee..0000000
--- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaFactoryUseSyncSelfTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.ignite.internal.processors.cache;
-
-import org.apache.ignite.configuration.IgniteConfiguration;
-
-/**
- * Factory JTA integration test using PARTITIONED cache.
- */
-public class GridPartitionedCacheJtaFactoryUseSyncSelfTest extends GridPartitionedCacheJtaFactorySelfTest {
-    /** {@inheritDoc} */
-    @Override protected void configureJta(IgniteConfiguration cfg) {
-        super.configureJta(cfg);
-
-        cfg.getTransactionConfiguration().setUseJtaSynchronization(true);
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaLookupClassNameSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaLookupClassNameSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaLookupClassNameSelfTest.java
deleted file mode 100644
index bb1e89c..0000000
--- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridPartitionedCacheJtaLookupClassNameSelfTest.java
+++ /dev/null
@@ -1,83 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.ignite.internal.processors.cache;
-
-import java.util.concurrent.Callable;
-import javax.transaction.TransactionManager;
-import org.apache.ignite.IgniteException;
-import org.apache.ignite.cache.CacheAtomicityMode;
-import org.apache.ignite.cache.jta.CacheTmLookup;
-import org.apache.ignite.configuration.CacheConfiguration;
-import org.apache.ignite.configuration.IgniteConfiguration;
-import org.apache.ignite.internal.IgniteEx;
-import org.apache.ignite.testframework.GridTestUtils;
-import org.apache.ignite.testsuites.IgniteIgnore;
-
-/**
- * Lookup class name based JTA integration test using PARTITIONED cache.
- */
-public class GridPartitionedCacheJtaLookupClassNameSelfTest extends AbstractCacheJtaSelfTest {
-    /** {@inheritDoc} */
-    @Override protected void configureJta(IgniteConfiguration cfg) {
-        cfg.getTransactionConfiguration().setTxManagerLookupClassName(TestTmLookup.class.getName());
-    }
-
-    /**
-     *
-     */
-    @IgniteIgnore(value = "https://issues.apache.org/jira/browse/IGNITE-1094", forceFailure = true)
-    public void testUncompatibleTmLookup() {
-        final IgniteEx ignite = grid(0);
-
-        final CacheConfiguration cacheCfg = new CacheConfiguration(DEFAULT_CACHE_NAME);
-
-        cacheCfg.setName("Foo");
-        cacheCfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
-        cacheCfg.setTransactionManagerLookupClassName(TestTmLookup2.class.getName());
-
-        GridTestUtils.assertThrows(log, new Callable<Object>() {
-            @Override public Object call() throws IgniteException {
-                ignite.createCache(cacheCfg);
-
-                return null;
-            }
-        }, IgniteException.class, null);
-    }
-
-    /**
-     *
-     */
-    @SuppressWarnings("PublicInnerClass")
-    public static class TestTmLookup implements CacheTmLookup {
-        /** {@inheritDoc} */
-        @Override public TransactionManager getTm() {
-            return jotm.getTransactionManager();
-        }
-    }
-
-    /**
-     *
-     */
-    @SuppressWarnings("PublicInnerClass")
-    public static class TestTmLookup2 implements CacheTmLookup {
-        /** {@inheritDoc} */
-        @Override public TransactionManager getTm() {
-            return null;
-        }
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaFactorySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaFactorySelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaFactorySelfTest.java
deleted file mode 100644
index 3885447..0000000
--- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaFactorySelfTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.ignite.internal.processors.cache;
-
-import org.apache.ignite.cache.CacheMode;
-
-import static org.apache.ignite.cache.CacheMode.REPLICATED;
-
-/**
- * Factory JTA integration test using REPLICATED cache.
- */
-public class GridReplicatedCacheJtaFactorySelfTest extends GridPartitionedCacheJtaFactorySelfTest {
-    /** {@inheritDoc} */
-    @Override protected CacheMode cacheMode() {
-        return REPLICATED;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaFactoryUseSyncSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaFactoryUseSyncSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaFactoryUseSyncSelfTest.java
deleted file mode 100644
index e25f5e8..0000000
--- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaFactoryUseSyncSelfTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.ignite.internal.processors.cache;
-
-import org.apache.ignite.configuration.IgniteConfiguration;
-
-/**
- * Factory JTA integration test using REPLICATED cache.
- */
-public class GridReplicatedCacheJtaFactoryUseSyncSelfTest extends GridReplicatedCacheJtaFactorySelfTest {
-    /** {@inheritDoc} */
-    @Override protected void configureJta(IgniteConfiguration cfg) {
-        super.configureJta(cfg);
-
-        cfg.getTransactionConfiguration().setUseJtaSynchronization(true);
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaLookupClassNameSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaLookupClassNameSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaLookupClassNameSelfTest.java
deleted file mode 100644
index 2b89ba1..0000000
--- a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/GridReplicatedCacheJtaLookupClassNameSelfTest.java
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * 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.
- */
-
-package org.apache.ignite.internal.processors.cache;
-
-import org.apache.ignite.cache.CacheMode;
-
-import static org.apache.ignite.cache.CacheMode.REPLICATED;
-
-/**
- * Lookup class name based JTA integration test using REPLICATED cache.
- */
-public class GridReplicatedCacheJtaLookupClassNameSelfTest extends GridPartitionedCacheJtaLookupClassNameSelfTest {
-    /** {@inheritDoc} */
-    @Override protected CacheMode cacheMode() {
-        return REPLICATED;
-    }
-}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/AbstractCacheJtaSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/AbstractCacheJtaSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/AbstractCacheJtaSelfTest.java
new file mode 100644
index 0000000..89fb72f
--- /dev/null
+++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/AbstractCacheJtaSelfTest.java
@@ -0,0 +1,248 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache.jta;
+
+import javax.transaction.Status;
+import javax.transaction.UserTransaction;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.cache.CacheMode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.processors.cache.GridCacheAbstractSelfTest;
+import org.apache.ignite.testframework.GridTestSafeThreadFactory;
+import org.apache.ignite.transactions.Transaction;
+import org.objectweb.jotm.Jotm;
+import java.util.concurrent.Callable;
+import java.util.concurrent.CountDownLatch;
+
+import static org.apache.ignite.cache.CacheMode.PARTITIONED;
+import static org.apache.ignite.transactions.TransactionConcurrency.PESSIMISTIC;
+import static org.apache.ignite.transactions.TransactionIsolation.READ_COMMITTED;
+import static org.apache.ignite.transactions.TransactionState.ACTIVE;
+
+/**
+ * Abstract class for cache tests.
+ */
+public abstract class AbstractCacheJtaSelfTest extends GridCacheAbstractSelfTest {
+    /** */
+    private static final int GRID_CNT = 1;
+
+    /** Java Open Transaction Manager facade. */
+    protected static Jotm jotm;
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTestsStarted() throws Exception {
+        jotm = new Jotm(true, false);
+
+        super.beforeTestsStarted();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTestsStopped() throws Exception {
+        super.afterTestsStopped();
+
+        jotm.stop();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected int gridCount() {
+        return GRID_CNT;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return PARTITIONED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        configureJta(cfg);
+
+        CacheConfiguration cfg1 = cacheConfiguration(igniteInstanceName);
+
+        CacheConfiguration cfg2 = cacheConfiguration(igniteInstanceName);
+
+        cfg2.setName("cache-2");
+
+        cfg.setCacheConfiguration(cfg1, cfg2);
+
+        return cfg;
+    }
+
+    /**
+     * @param cfg Ignite Configuration.
+     */
+    protected abstract void configureJta(IgniteConfiguration cfg);
+
+    /**
+     * JUnit.
+     *
+     * @throws Exception If failed.
+     */
+    public void testJta() throws Exception {
+        UserTransaction jtaTx = jotm.getUserTransaction();
+
+        IgniteCache<String, Integer> cache = jcache();
+
+        assert ignite(0).transactions().tx() == null;
+
+        jtaTx.begin();
+
+        try {
+            assert ignite(0).transactions().tx() == null;
+
+            assert cache.getAndPut("key", 1) == null;
+
+            Transaction tx = ignite(0).transactions().tx();
+
+            assert tx != null;
+            assert tx.state() == ACTIVE;
+
+            Integer one = 1;
+
+            assertEquals(one, cache.get("key"));
+
+            tx = ignite(0).transactions().tx();
+
+            assert tx != null;
+            assert tx.state() == ACTIVE;
+
+            jtaTx.commit();
+
+            assert ignite(0).transactions().tx() == null;
+        }
+        finally {
+            if (jtaTx.getStatus() == Status.STATUS_ACTIVE)
+                jtaTx.rollback();
+        }
+
+        assertEquals((Integer)1, cache.get("key"));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    @SuppressWarnings("ConstantConditions")
+    public void testJtaTwoCaches() throws Exception {
+        UserTransaction jtaTx = jotm.getUserTransaction();
+
+        IgniteEx ignite = grid(0);
+
+        IgniteCache<String, Integer> cache1 = jcache();
+
+        IgniteCache<Object, Object> cache2 = ignite.cache("cache-2");
+
+        assertNull(ignite.transactions().tx());
+
+        jtaTx.begin();
+
+        try {
+            cache1.put("key", 0);
+            cache2.put("key", 0);
+            cache1.put("key1", 1);
+            cache2.put("key2", 2);
+
+            assertEquals(0, (int)cache1.get("key"));
+            assertEquals(0, (int)cache2.get("key"));
+            assertEquals(1, (int)cache1.get("key1"));
+            assertEquals(2, (int)cache2.get("key2"));
+
+            assertEquals(ignite.transactions().tx().state(), ACTIVE);
+
+            jtaTx.commit();
+
+            assertNull(ignite.transactions().tx());
+
+            assertEquals(0, (int)cache1.get("key"));
+            assertEquals(0, (int)cache2.get("key"));
+            assertEquals(1, (int)cache1.get("key1"));
+            assertEquals(2, (int)cache2.get("key2"));
+        }
+        finally {
+            if (jtaTx.getStatus() == Status.STATUS_ACTIVE)
+                jtaTx.rollback();
+        }
+
+        assertEquals(0, (int)cache1.get("key"));
+        assertEquals(0, (int)cache2.get("key"));
+        assertEquals(1, (int)cache1.get("key1"));
+        assertEquals(2, (int)cache2.get("key2"));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testAsyncOpAwait() throws Exception {
+        final IgniteCache<String, Integer> cache = jcache();
+
+        GridTestSafeThreadFactory factory = new GridTestSafeThreadFactory("JtaThread");
+
+        final CountDownLatch latch = new CountDownLatch(1);
+
+        Callable<Object> c = new Callable<Object>() {
+            @Override public Object call() throws Exception {
+                assertNull(grid(0).transactions().tx());
+
+                UserTransaction jtaTx = jotm.getUserTransaction();
+
+                jtaTx.begin();
+
+                try {
+                    cache.put("key1", 1);
+
+                    cache.putAsync("key", 1);
+
+                    assertEquals(grid(0).transactions().tx().state(), ACTIVE);
+
+                    latch.countDown();
+
+                    info("Before JTA commit.");
+                }
+                finally {
+                    jtaTx.commit();
+                }
+
+                info("After JTA commit.");
+
+                assertEquals((Integer)1, cache.get("key"));
+
+                return null;
+            }
+        };
+
+        Thread task = factory.newThread(c);
+
+        try (Transaction tx = ignite(0).transactions().txStart(PESSIMISTIC, READ_COMMITTED)) {
+            cache.put("key", 0);
+
+            task.start();
+
+            latch.await();
+
+            while (task.getState() != Thread.State.WAITING)
+                factory.checkError();
+
+            info("Before cache TX commit.");
+
+            tx.commit();
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactorySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactorySelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactorySelfTest.java
new file mode 100644
index 0000000..f6fd5c7
--- /dev/null
+++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactorySelfTest.java
@@ -0,0 +1,41 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache.jta;
+
+import javax.cache.configuration.Factory;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.TransactionConfiguration;
+import org.objectweb.transaction.jta.TransactionManager;
+
+/**
+ * Factory JTA integration test using PARTITIONED cache.
+ */
+public class GridPartitionedCacheJtaFactorySelfTest extends AbstractCacheJtaSelfTest {
+    /** {@inheritDoc} */
+    @Override protected void configureJta(IgniteConfiguration cfg) {
+        TransactionConfiguration txCfg = cfg.getTransactionConfiguration();
+
+        txCfg.setTxManagerFactory(new Factory<TransactionManager>() {
+            private static final long serialVersionUID = 0L;
+
+            @Override public TransactionManager create() {
+                return jotm.getTransactionManager();
+            }
+        });
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactoryUseSyncSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactoryUseSyncSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactoryUseSyncSelfTest.java
new file mode 100644
index 0000000..b66452d
--- /dev/null
+++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaFactoryUseSyncSelfTest.java
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache.jta;
+
+import org.apache.ignite.configuration.IgniteConfiguration;
+
+/**
+ * Factory JTA integration test using PARTITIONED cache.
+ */
+public class GridPartitionedCacheJtaFactoryUseSyncSelfTest extends GridPartitionedCacheJtaFactorySelfTest {
+    /** {@inheritDoc} */
+    @Override protected void configureJta(IgniteConfiguration cfg) {
+        super.configureJta(cfg);
+
+        cfg.getTransactionConfiguration().setUseJtaSynchronization(true);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaLookupClassNameSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaLookupClassNameSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaLookupClassNameSelfTest.java
new file mode 100644
index 0000000..7357f8e
--- /dev/null
+++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridPartitionedCacheJtaLookupClassNameSelfTest.java
@@ -0,0 +1,83 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache.jta;
+
+import java.util.concurrent.Callable;
+import javax.transaction.TransactionManager;
+import org.apache.ignite.IgniteException;
+import org.apache.ignite.cache.CacheAtomicityMode;
+import org.apache.ignite.cache.jta.CacheTmLookup;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testsuites.IgniteIgnore;
+
+/**
+ * Lookup class name based JTA integration test using PARTITIONED cache.
+ */
+public class GridPartitionedCacheJtaLookupClassNameSelfTest extends AbstractCacheJtaSelfTest {
+    /** {@inheritDoc} */
+    @Override protected void configureJta(IgniteConfiguration cfg) {
+        cfg.getTransactionConfiguration().setTxManagerLookupClassName(TestTmLookup.class.getName());
+    }
+
+    /**
+     *
+     */
+    @IgniteIgnore(value = "https://issues.apache.org/jira/browse/IGNITE-1094", forceFailure = true)
+    public void testIncompatibleTmLookup() {
+        final IgniteEx ignite = grid(0);
+
+        final CacheConfiguration cacheCfg = new CacheConfiguration(DEFAULT_CACHE_NAME);
+
+        cacheCfg.setName("Foo");
+        cacheCfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL);
+        cacheCfg.setTransactionManagerLookupClassName(TestTmLookup2.class.getName());
+
+        GridTestUtils.assertThrows(log, new Callable<Object>() {
+            @Override public Object call() throws IgniteException {
+                ignite.createCache(cacheCfg);
+
+                return null;
+            }
+        }, IgniteException.class, null);
+    }
+
+    /**
+     *
+     */
+    @SuppressWarnings("PublicInnerClass")
+    public static class TestTmLookup implements CacheTmLookup {
+        /** {@inheritDoc} */
+        @Override public TransactionManager getTm() {
+            return jotm.getTransactionManager();
+        }
+    }
+
+    /**
+     *
+     */
+    @SuppressWarnings("PublicInnerClass")
+    public static class TestTmLookup2 implements CacheTmLookup {
+        /** {@inheritDoc} */
+        @Override public TransactionManager getTm() {
+            return null;
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaFactorySelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaFactorySelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaFactorySelfTest.java
new file mode 100644
index 0000000..1efd99c
--- /dev/null
+++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaFactorySelfTest.java
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache.jta;
+
+import org.apache.ignite.cache.CacheMode;
+
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
+
+/**
+ * Factory JTA integration test using REPLICATED cache.
+ */
+public class GridReplicatedCacheJtaFactorySelfTest extends GridPartitionedCacheJtaFactorySelfTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return REPLICATED;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaFactoryUseSyncSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaFactoryUseSyncSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaFactoryUseSyncSelfTest.java
new file mode 100644
index 0000000..54610f9
--- /dev/null
+++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaFactoryUseSyncSelfTest.java
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache.jta;
+
+import org.apache.ignite.configuration.IgniteConfiguration;
+
+/**
+ * Factory JTA integration test using REPLICATED cache.
+ */
+public class GridReplicatedCacheJtaFactoryUseSyncSelfTest extends GridReplicatedCacheJtaFactorySelfTest {
+    /** {@inheritDoc} */
+    @Override protected void configureJta(IgniteConfiguration cfg) {
+        super.configureJta(cfg);
+
+        cfg.getTransactionConfiguration().setUseJtaSynchronization(true);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaLookupClassNameSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaLookupClassNameSelfTest.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaLookupClassNameSelfTest.java
new file mode 100644
index 0000000..a1aa6cf
--- /dev/null
+++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/GridReplicatedCacheJtaLookupClassNameSelfTest.java
@@ -0,0 +1,32 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache.jta;
+
+import org.apache.ignite.cache.CacheMode;
+
+import static org.apache.ignite.cache.CacheMode.REPLICATED;
+
+/**
+ * Lookup class name based JTA integration test using REPLICATED cache.
+ */
+public class GridReplicatedCacheJtaLookupClassNameSelfTest extends GridPartitionedCacheJtaLookupClassNameSelfTest {
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return REPLICATED;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/package-info.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/package-info.java b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/package-info.java
new file mode 100644
index 0000000..49b208d
--- /dev/null
+++ b/modules/jta/src/test/java/org/apache/ignite/internal/processors/cache/jta/package-info.java
@@ -0,0 +1,22 @@
+/*
+ * 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.
+ */
+
+/**
+ * <!-- Package description. -->
+ * Contains internal tests or test related classes and interfaces.
+ */
+package org.apache.ignite.internal.processors.cache.jta;
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/jta/src/test/java/org/apache/ignite/testsuites/IgniteJtaTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/jta/src/test/java/org/apache/ignite/testsuites/IgniteJtaTestSuite.java b/modules/jta/src/test/java/org/apache/ignite/testsuites/IgniteJtaTestSuite.java
index 4ae5df0..677f485 100644
--- a/modules/jta/src/test/java/org/apache/ignite/testsuites/IgniteJtaTestSuite.java
+++ b/modules/jta/src/test/java/org/apache/ignite/testsuites/IgniteJtaTestSuite.java
@@ -21,12 +21,12 @@ import junit.framework.TestSuite;
 import org.apache.ignite.internal.processors.cache.CacheJndiTmFactorySelfTest;
 import org.apache.ignite.internal.processors.cache.GridCacheJtaConfigurationValidationSelfTest;
 import org.apache.ignite.internal.processors.cache.GridCacheJtaFactoryConfigValidationSelfTest;
-import org.apache.ignite.internal.processors.cache.GridPartitionedCacheJtaFactorySelfTest;
-import org.apache.ignite.internal.processors.cache.GridPartitionedCacheJtaFactoryUseSyncSelfTest;
-import org.apache.ignite.internal.processors.cache.GridPartitionedCacheJtaLookupClassNameSelfTest;
-import org.apache.ignite.internal.processors.cache.GridReplicatedCacheJtaFactorySelfTest;
-import org.apache.ignite.internal.processors.cache.GridReplicatedCacheJtaFactoryUseSyncSelfTest;
-import org.apache.ignite.internal.processors.cache.GridReplicatedCacheJtaLookupClassNameSelfTest;
+import org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaFactorySelfTest;
+import org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaFactoryUseSyncSelfTest;
+import org.apache.ignite.internal.processors.cache.jta.GridPartitionedCacheJtaLookupClassNameSelfTest;
+import org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaFactorySelfTest;
+import org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaFactoryUseSyncSelfTest;
+import org.apache.ignite.internal.processors.cache.jta.GridReplicatedCacheJtaLookupClassNameSelfTest;
 import org.apache.ignite.internal.processors.cache.GridJtaLifecycleAwareSelfTest;
 import org.apache.ignite.testframework.IgniteTestSuite;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/e96225f1/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTransactionalTest.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTransactionalTest.cs b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTransactionalTest.cs
index 45d0b5f..77ae8fe 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTransactionalTest.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core.Tests/Cache/CacheAbstractTransactionalTest.cs
@@ -606,8 +606,7 @@ namespace Apache.Ignite.Core.Tests.Cache
         /// with multiple participating caches.
         /// </summary>
         [Test]
-        [Ignore("IGNITE-1561")]
-        public void TestTransactionScopeMultiCache()
+        public void TestTransactionScopeMultiCache([Values(true, false)] bool async)
         {
             var cache1 = Cache();
 
@@ -622,8 +621,16 @@ namespace Apache.Ignite.Core.Tests.Cache
             // Commit.
             using (var ts = new TransactionScope())
             {
-                cache1[1] = 10;
-                cache2[1] = 20;
+                if (async)
+                {
+                    cache1.PutAsync(1, 10);
+                    cache2.PutAsync(1, 20);
+                }
+                else
+                {
+                    cache1.Put(1, 10);
+                    cache2.Put(1, 20);
+                }
 
                 ts.Complete();
             }
@@ -634,8 +641,16 @@ namespace Apache.Ignite.Core.Tests.Cache
             // Rollback.
             using (new TransactionScope())
             {
-                cache1[1] = 100;
-                cache2[1] = 200;
+                if (async)
+                {
+                    cache1.PutAsync(1, 100);
+                    cache2.PutAsync(1, 200);
+                }
+                else
+                {
+                    cache1.Put(1, 100);
+                    cache2.Put(1, 200);
+                }
             }
 
             Assert.AreEqual(10, cache1[1]);
@@ -773,10 +788,10 @@ namespace Apache.Ignite.Core.Tests.Cache
             for (var i = 0; i < 10; i++)
             {
                 CheckTxOp((cache, key) => cache.Put(key, -5));
-                CheckTxOp((cache, key) => cache.PutAsync(key, -5).Wait());
+                CheckTxOp((cache, key) => cache.PutAsync(key, -5));
 
                 CheckTxOp((cache, key) => cache.PutAll(new Dictionary<int, int> {{key, -7}}));
-                CheckTxOp((cache, key) => cache.PutAllAsync(new Dictionary<int, int> {{key, -7}}).Wait());
+                CheckTxOp((cache, key) => cache.PutAllAsync(new Dictionary<int, int> {{key, -7}}));
 
                 CheckTxOp((cache, key) =>
                 {
@@ -786,11 +801,11 @@ namespace Apache.Ignite.Core.Tests.Cache
                 CheckTxOp((cache, key) =>
                 {
                     cache.Remove(key);
-                    cache.PutIfAbsentAsync(key, -10).Wait();
+                    cache.PutIfAbsentAsync(key, -10);
                 });
 
                 CheckTxOp((cache, key) => cache.GetAndPut(key, -9));
-                CheckTxOp((cache, key) => cache.GetAndPutAsync(key, -9).Wait());
+                CheckTxOp((cache, key) => cache.GetAndPutAsync(key, -9));
 
                 CheckTxOp((cache, key) =>
                 {
@@ -800,32 +815,32 @@ namespace Apache.Ignite.Core.Tests.Cache
                 CheckTxOp((cache, key) =>
                 {
                     cache.Remove(key);
-                    cache.GetAndPutIfAbsentAsync(key, -10).Wait();
+                    cache.GetAndPutIfAbsentAsync(key, -10);
                 });
 
                 CheckTxOp((cache, key) => cache.GetAndRemove(key));
-                CheckTxOp((cache, key) => cache.GetAndRemoveAsync(key).Wait());
+                CheckTxOp((cache, key) => cache.GetAndRemoveAsync(key));
 
                 CheckTxOp((cache, key) => cache.GetAndReplace(key, -11));
-                CheckTxOp((cache, key) => cache.GetAndReplaceAsync(key, -11).Wait());
+                CheckTxOp((cache, key) => cache.GetAndReplaceAsync(key, -11));
 
                 CheckTxOp((cache, key) => cache.Invoke(key, new AddProcessor(), 1));
-                CheckTxOp((cache, key) => cache.InvokeAsync(key, new AddProcessor(), 1).Wait());
+                CheckTxOp((cache, key) => cache.InvokeAsync(key, new AddProcessor(), 1));
 
                 CheckTxOp((cache, key) => cache.InvokeAll(new[] {key}, new AddProcessor(), 1));
-                CheckTxOp((cache, key) => cache.InvokeAllAsync(new[] {key}, new AddProcessor(), 1).Wait());
+                CheckTxOp((cache, key) => cache.InvokeAllAsync(new[] {key}, new AddProcessor(), 1));
 
                 CheckTxOp((cache, key) => cache.Remove(key));
-                CheckTxOp((cache, key) => cache.RemoveAsync(key).Wait());
+                CheckTxOp((cache, key) => cache.RemoveAsync(key));
 
                 CheckTxOp((cache, key) => cache.RemoveAll(new[] {key}));
-                CheckTxOp((cache, key) => cache.RemoveAllAsync(new[] {key}).Wait());
+                CheckTxOp((cache, key) => cache.RemoveAllAsync(new[] {key}));
 
                 CheckTxOp((cache, key) => cache.Replace(key, 100));
-                CheckTxOp((cache, key) => cache.ReplaceAsync(key, 100).Wait());
+                CheckTxOp((cache, key) => cache.ReplaceAsync(key, 100));
 
                 CheckTxOp((cache, key) => cache.Replace(key, cache[key], 100));
-                CheckTxOp((cache, key) => cache.ReplaceAsync(key, cache[key], 100).Wait());
+                CheckTxOp((cache, key) => cache.ReplaceAsync(key, cache[key], 100));
             }
         }
 


[44/50] [abbrv] ignite git commit: IGNITE-5769 Abstract away .NET->Java calls

Posted by yz...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTargetAdapter.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTargetAdapter.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTargetAdapter.cs
new file mode 100644
index 0000000..64b5f29
--- /dev/null
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/PlatformTargetAdapter.cs
@@ -0,0 +1,534 @@
+/*
+ * 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.Impl
+{
+    using System;
+    using System.Collections.Generic;
+    using System.Diagnostics;
+    using System.Diagnostics.CodeAnalysis;
+    using System.Threading.Tasks;
+    using Apache.Ignite.Core.Binary;
+    using Apache.Ignite.Core.Impl.Binary;
+    using Apache.Ignite.Core.Impl.Binary.IO;
+    using Apache.Ignite.Core.Impl.Common;
+    using BinaryReader = Apache.Ignite.Core.Impl.Binary.BinaryReader;
+    using BinaryWriter = Apache.Ignite.Core.Impl.Binary.BinaryWriter;
+
+    /// <summary>
+    /// Base class for interop targets, provides additional functionality over <see cref="IPlatformTargetInternal"/>.
+    /// </summary>
+    [SuppressMessage("ReSharper", "LocalVariableHidesMember")]
+    internal class PlatformTargetAdapter
+    {
+        /** */
+        internal const int False = 0;
+
+        /** */
+        internal const int True = 1;
+
+        /** */
+        internal const int Error = -1;
+
+        /** */
+        private static readonly Dictionary<Type, FutureType> IgniteFutureTypeMap
+            = new Dictionary<Type, FutureType>
+            {
+                {typeof(bool), FutureType.Bool},
+                {typeof(byte), FutureType.Byte},
+                {typeof(char), FutureType.Char},
+                {typeof(double), FutureType.Double},
+                {typeof(float), FutureType.Float},
+                {typeof(int), FutureType.Int},
+                {typeof(long), FutureType.Long},
+                {typeof(short), FutureType.Short}
+            };
+        
+        /** Unmanaged target. */
+        private readonly IPlatformTargetInternal _target;
+
+        /** Marshaller. */
+        private readonly Marshaller _marsh;
+
+        /// <summary>
+        /// Constructor.
+        /// </summary>
+        /// <param name="target">Target.</param>
+        protected PlatformTargetAdapter(IPlatformTargetInternal target)
+        {
+            Debug.Assert(target != null);
+
+            _target = target;
+            _marsh = target.Marshaller;
+        }
+
+        /// <summary>
+        /// Unmanaged target.
+        /// </summary>
+        internal IPlatformTargetInternal Target
+        {
+            get { return _target; }
+        }
+
+        /// <summary>
+        /// Marshaller.
+        /// </summary>
+        internal Marshaller Marshaller
+        {
+            get { return _marsh; }
+        }
+
+        #region OUT operations
+
+        /// <summary>
+        /// Perform out operation.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="action">Action to be performed on the stream.</param>
+        /// <returns></returns>
+        protected long DoOutOp(int type, Action<IBinaryStream> action)
+        {
+            return _target.InStreamOutLong(type, action);
+        }
+
+        /// <summary>
+        /// Perform out operation.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="action">Action to be performed on the stream.</param>
+        /// <returns></returns>
+        protected long DoOutOp(int type, Action<BinaryWriter> action)
+        {
+            return DoOutOp(type, stream => WriteToStream(action, stream, _marsh));
+        }
+
+        /// <summary>
+        /// Perform out operation.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="action">Action to be performed on the stream.</param>
+        /// <returns>Resulting object.</returns>
+        protected IPlatformTargetInternal DoOutOpObject(int type, Action<BinaryWriter> action)
+        {
+            return _target.InStreamOutObject(type, stream => WriteToStream(action, stream, _marsh));
+        }
+
+        /// <summary>
+        /// Perform out operation.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="action">Action to be performed on the stream.</param>
+        /// <returns>Resulting object.</returns>
+        protected IPlatformTargetInternal DoOutOpObject(int type, Action<IBinaryStream> action)
+        {
+            return _target.InStreamOutObject(type, action);
+        }
+
+        /// <summary>
+        /// Perform out operation.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <returns>Resulting object.</returns>
+        protected IPlatformTargetInternal DoOutOpObject(int type)
+        {
+            return _target.OutObjectInternal(type);
+        }
+
+        /// <summary>
+        /// Perform simple output operation accepting single argument.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="val1">Value.</param>
+        /// <returns>Result.</returns>
+        protected long DoOutOp<T1>(int type, T1 val1)
+        {
+            return DoOutOp(type, writer =>
+            {
+                writer.Write(val1);
+            });
+        }
+
+        /// <summary>
+        /// Perform simple output operation accepting two arguments.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="val1">Value 1.</param>
+        /// <param name="val2">Value 2.</param>
+        /// <returns>Result.</returns>
+        protected long DoOutOp<T1, T2>(int type, T1 val1, T2 val2)
+        {
+            return DoOutOp(type, writer =>
+            {
+                writer.Write(val1);
+                writer.Write(val2);
+            });
+        }
+
+        #endregion
+
+        #region IN operations
+
+        /// <summary>
+        /// Perform in operation.
+        /// </summary>
+        /// <param name="type">Type.</param>
+        /// <param name="action">Action.</param>
+        /// <returns>Result.</returns>
+        protected T DoInOp<T>(int type, Func<IBinaryStream, T> action)
+        {
+            return _target.OutStream(type, action);
+        }
+
+        /// <summary>
+        /// Perform simple in operation returning immediate result.
+        /// </summary>
+        /// <param name="type">Type.</param>
+        /// <returns>Result.</returns>
+        protected T DoInOp<T>(int type)
+        {
+            return _target.OutStream(type, s => Unmarshal<T>(s));
+        }
+
+        #endregion
+
+        #region OUT-IN operations
+        
+        /// <summary>
+        /// Perform out-in operation.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="outAction">Out action.</param>
+        /// <param name="inAction">In action.</param>
+        /// <returns>Result.</returns>
+        protected TR DoOutInOp<TR>(int type, Action<BinaryWriter> outAction, Func<IBinaryStream, TR> inAction)
+        {
+            return _target.InStreamOutStream(type, stream => WriteToStream(outAction, stream, _marsh), inAction);
+        }
+
+        /// <summary>
+        /// Perform out-in operation with a single stream.
+        /// </summary>
+        /// <typeparam name="TR">The type of the r.</typeparam>
+        /// <param name="type">Operation type.</param>
+        /// <param name="outAction">Out action.</param>
+        /// <param name="inAction">In action.</param>
+        /// <param name="inErrorAction">The action to read an error.</param>
+        /// <returns>
+        /// Result.
+        /// </returns>
+        protected TR DoOutInOpX<TR>(int type, Action<BinaryWriter> outAction, Func<IBinaryStream, long, TR> inAction,
+            Func<IBinaryStream, Exception> inErrorAction)
+        {
+            return _target.InStreamOutLong(type, stream => WriteToStream(outAction, stream, _marsh), 
+                inAction, inErrorAction);
+        }
+
+        /// <summary>
+        /// Perform out-in operation with a single stream.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="outAction">Out action.</param>
+        /// <param name="inErrorAction">The action to read an error.</param>
+        /// <returns>
+        /// Result.
+        /// </returns>
+        protected bool DoOutInOpX(int type, Action<BinaryWriter> outAction,
+            Func<IBinaryStream, Exception> inErrorAction)
+        {
+            return _target.InStreamOutLong(type, stream => WriteToStream(outAction, stream, _marsh), 
+                (stream, res) => res == True, inErrorAction);
+        }
+
+        /// <summary>
+        /// Perform out-in operation.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="outAction">Out action.</param>
+        /// <param name="inAction">In action.</param>
+        /// <param name="arg">Argument.</param>
+        /// <returns>Result.</returns>
+        protected TR DoOutInOp<TR>(int type, Action<BinaryWriter> outAction,
+            Func<IBinaryStream, IPlatformTargetInternal, TR> inAction, IPlatformTargetInternal arg)
+        {
+            return _target.InObjectStreamOutObjectStream(type, stream => WriteToStream(outAction, stream, _marsh), 
+                inAction, arg);
+        }
+
+        /// <summary>
+        /// Perform out-in operation.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="outAction">Out action.</param>
+        /// <returns>Result.</returns>
+        protected TR DoOutInOp<TR>(int type, Action<BinaryWriter> outAction)
+        {
+            return _target.InStreamOutStream(type, stream => WriteToStream(outAction, stream, _marsh), 
+                stream => Unmarshal<TR>(stream));
+        }
+
+        /// <summary>
+        /// Perform simple out-in operation accepting single argument.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="val">Value.</param>
+        /// <returns>Result.</returns>
+        protected TR DoOutInOp<T1, TR>(int type, T1 val)
+        {
+            return _target.InStreamOutStream(type, stream => WriteToStream(val, stream, _marsh),
+                stream => Unmarshal<TR>(stream));
+        }
+
+        /// <summary>
+        /// Perform simple out-in operation accepting two arguments.
+        /// </summary>
+        /// <param name="type">Operation type.</param>
+        /// <param name="val">Value.</param>
+        /// <returns>Result.</returns>
+        protected long DoOutInOp(int type, long val = 0)
+        {
+            return _target.InLongOutLong(type, val);
+        }
+
+        #endregion
+
+        #region Async operations
+
+        /// <summary>
+        /// Performs async operation.
+        /// </summary>
+        /// <param name="type">The type code.</param>
+        /// <param name="writeAction">The write action.</param>
+        /// <returns>Task for async operation</returns>
+        protected Task DoOutOpAsync(int type, Action<BinaryWriter> writeAction = null)
+        {
+            return DoOutOpAsync<object>(type, writeAction);
+        }
+
+        /// <summary>
+        /// Performs async operation.
+        /// </summary>
+        /// <typeparam name="T">Type of the result.</typeparam>
+        /// <param name="type">The type code.</param>
+        /// <param name="writeAction">The write action.</param>
+        /// <param name="keepBinary">Keep binary flag, only applicable to object futures. False by default.</param>
+        /// <param name="convertFunc">The function to read future result from stream.</param>
+        /// <returns>Task for async operation</returns>
+        protected Task<T> DoOutOpAsync<T>(int type, Action<BinaryWriter> writeAction = null, bool keepBinary = false,
+            Func<BinaryReader, T> convertFunc = null)
+        {
+            return GetFuture((futId, futType) => DoOutOp(type, w =>
+            {
+                if (writeAction != null)
+                {
+                    writeAction(w);
+                }
+                w.WriteLong(futId);
+                w.WriteInt(futType);
+            }), keepBinary, convertFunc).Task;
+        }
+
+        /// <summary>
+        /// Performs async operation.
+        /// </summary>
+        /// <typeparam name="T">Type of the result.</typeparam>
+        /// <param name="type">The type code.</param>
+        /// <param name="writeAction">The write action.</param>
+        /// <returns>Future for async operation</returns>
+        protected Future<T> DoOutOpObjectAsync<T>(int type, Action<IBinaryRawWriter> writeAction)
+        {
+            return GetFuture<T>((futId, futType) => DoOutOpObject(type, w =>
+            {
+                writeAction(w);
+                w.WriteLong(futId);
+                w.WriteInt(futType);
+            }));
+        }
+
+        /// <summary>
+        /// Performs async operation.
+        /// </summary>
+        /// <typeparam name="TR">Type of the result.</typeparam>
+        /// <typeparam name="T1">The type of the first arg.</typeparam>
+        /// <param name="type">The type code.</param>
+        /// <param name="val1">First arg.</param>
+        /// <returns>
+        /// Task for async operation
+        /// </returns>
+        protected Task<TR> DoOutOpAsync<T1, TR>(int type, T1 val1)
+        {
+            return GetFuture<TR>((futId, futType) => DoOutOp(type, w =>
+            {
+                w.WriteObject(val1);
+                w.WriteLong(futId);
+                w.WriteInt(futType);
+            })).Task;
+        }
+
+        /// <summary>
+        /// Performs async operation.
+        /// </summary>
+        /// <typeparam name="TR">Type of the result.</typeparam>
+        /// <typeparam name="T1">The type of the first arg.</typeparam>
+        /// <typeparam name="T2">The type of the second arg.</typeparam>
+        /// <param name="type">The type code.</param>
+        /// <param name="val1">First arg.</param>
+        /// <param name="val2">Second arg.</param>
+        /// <returns>
+        /// Task for async operation
+        /// </returns>
+        protected Task<TR> DoOutOpAsync<T1, T2, TR>(int type, T1 val1, T2 val2)
+        {
+            return GetFuture<TR>((futId, futType) => DoOutOp(type, w =>
+            {
+                w.WriteObject(val1);
+                w.WriteObject(val2);
+                w.WriteLong(futId);
+                w.WriteInt(futType);
+            })).Task;
+        }
+
+        #endregion
+
+        #region Miscelanneous
+
+        /// <summary>
+        /// Finish marshaling.
+        /// </summary>
+        /// <param name="writer">Writer.</param>
+        internal void FinishMarshal(BinaryWriter writer)
+        {
+            _marsh.FinishMarshal(writer);
+        }
+
+        /// <summary>
+        /// Unmarshal object using the given stream.
+        /// </summary>
+        /// <param name="stream">Stream.</param>
+        /// <returns>Unmarshalled object.</returns>
+        protected virtual T Unmarshal<T>(IBinaryStream stream)
+        {
+            return _marsh.Unmarshal<T>(stream);
+        }
+
+        /// <summary>
+        /// Creates a future and starts listening.
+        /// </summary>
+        /// <typeparam name="T">Future result type</typeparam>
+        /// <param name="listenAction">The listen action.</param>
+        /// <param name="keepBinary">Keep binary flag, only applicable to object futures. False by default.</param>
+        /// <param name="convertFunc">The function to read future result from stream.</param>
+        /// <returns>Created future.</returns>
+        private Future<T> GetFuture<T>(Func<long, int, IPlatformTargetInternal> listenAction, bool keepBinary = false,
+            Func<BinaryReader, T> convertFunc = null)
+        {
+            var futType = FutureType.Object;
+
+            var type = typeof(T);
+
+            if (type.IsPrimitive)
+                IgniteFutureTypeMap.TryGetValue(type, out futType);
+
+            var fut = convertFunc == null && futType != FutureType.Object
+                ? new Future<T>()
+                : new Future<T>(new FutureConverter<T>(_marsh, keepBinary, convertFunc));
+
+            var futHnd = _marsh.Ignite.HandleRegistry.Allocate(fut);
+
+            IPlatformTargetInternal futTarget;
+
+            try
+            {
+                futTarget = listenAction(futHnd, (int)futType);
+            }
+            catch (Exception)
+            {
+                _marsh.Ignite.HandleRegistry.Release(futHnd);
+
+                throw;
+            }
+
+            fut.SetTarget(new Listenable(futTarget));
+
+            return fut;
+        }
+
+        /// <summary>
+        /// Creates a future and starts listening.
+        /// </summary>
+        /// <typeparam name="T">Future result type</typeparam>
+        /// <param name="listenAction">The listen action.</param>
+        /// <param name="keepBinary">Keep binary flag, only applicable to object futures. False by default.</param>
+        /// <param name="convertFunc">The function to read future result from stream.</param>
+        /// <returns>Created future.</returns>
+        private Future<T> GetFuture<T>(Action<long, int> listenAction, bool keepBinary = false,
+            Func<BinaryReader, T> convertFunc = null)
+        {
+            var futType = FutureType.Object;
+
+            var type = typeof(T);
+
+            if (type.IsPrimitive)
+                IgniteFutureTypeMap.TryGetValue(type, out futType);
+
+            var fut = convertFunc == null && futType != FutureType.Object
+                ? new Future<T>()
+                : new Future<T>(new FutureConverter<T>(_marsh, keepBinary, convertFunc));
+
+            var futHnd = _marsh.Ignite.HandleRegistry.Allocate(fut);
+
+            try
+            {
+                listenAction(futHnd, (int)futType);
+            }
+            catch (Exception)
+            {
+                _marsh.Ignite.HandleRegistry.Release(futHnd);
+
+                throw;
+            }
+
+            return fut;
+        }
+
+        /// <summary>
+        /// Writes to stream.
+        /// </summary>
+        private static void WriteToStream(Action<BinaryWriter> action, IBinaryStream stream, Marshaller marsh)
+        {
+            var writer = marsh.StartMarshal(stream);
+
+            action(writer);
+
+            marsh.FinishMarshal(writer);
+        }
+
+        /// <summary>
+        /// Writes to stream.
+        /// </summary>
+        private static void WriteToStream<T>(T obj, IBinaryStream stream, Marshaller marsh)
+        {
+            var writer = marsh.StartMarshal(stream);
+
+            writer.WriteObject(obj);
+
+            marsh.FinishMarshal(writer);
+        }
+
+
+        #endregion
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 88d2a76..93611f7 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/Services.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Services/Services.cs
@@ -24,16 +24,13 @@ 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.Common;
-    using Apache.Ignite.Core.Impl.Unmanaged;
     using Apache.Ignite.Core.Services;
-    using UU = Apache.Ignite.Core.Impl.Unmanaged.UnmanagedUtils;
 
     /// <summary>
     /// Services implementation.
     /// </summary>
-    internal sealed class Services : PlatformTarget, IServices
+    internal sealed class Services : PlatformTargetAdapter, IServices
     {
         /** */
         private const int OpDeploy = 1;
@@ -87,13 +84,12 @@ namespace Apache.Ignite.Core.Impl.Services
         /// Initializes a new instance of the <see cref="Services" /> class.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
         /// <param name="clusterGroup">Cluster group.</param>
         /// <param name="keepBinary">Invoker binary flag.</param>
         /// <param name="srvKeepBinary">Server binary flag.</param>
-        public Services(IUnmanagedTarget target, Marshaller marsh, IClusterGroup clusterGroup, 
+        public Services(IPlatformTargetInternal target, IClusterGroup clusterGroup, 
             bool keepBinary, bool srvKeepBinary)
-            : base(target, marsh)
+            : base(target)
         {
             Debug.Assert(clusterGroup  != null);
 
@@ -108,7 +104,7 @@ namespace Apache.Ignite.Core.Impl.Services
             if (_keepBinary)
                 return this;
 
-            return new Services(Target, Marshaller, _clusterGroup, true, _srvKeepBinary);
+            return new Services(Target, _clusterGroup, true, _srvKeepBinary);
         }
 
         /** <inheritDoc /> */
@@ -117,7 +113,7 @@ namespace Apache.Ignite.Core.Impl.Services
             if (_srvKeepBinary)
                 return this;
 
-            return new Services(DoOutOpObject(OpWithServerKeepBinary), Marshaller, _clusterGroup, _keepBinary, true);
+            return new Services(DoOutOpObject(OpWithServerKeepBinary), _clusterGroup, _keepBinary, true);
         }
 
         /** <inheritDoc /> */
@@ -372,12 +368,13 @@ namespace Apache.Ignite.Core.Impl.Services
         /// <returns>
         /// Invocation result.
         /// </returns>
-        private unsafe object InvokeProxyMethod(IUnmanagedTarget proxy, MethodBase method, object[] args, 
+        private object InvokeProxyMethod(IPlatformTargetInternal proxy, MethodBase method, object[] args, 
             Platform platform)
         {
             return DoOutInOp(OpInvokeMethod,
                 writer => ServiceProxySerializer.WriteProxyMethod(writer, method, args, platform),
-                (stream, res) => ServiceProxySerializer.ReadInvocationResult(stream, Marshaller, _keepBinary), proxy.Target);
+                (stream, res) => ServiceProxySerializer.ReadInvocationResult(stream, Marshaller, _keepBinary), 
+                proxy);
         }
 
         /// <summary>

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Transactions/TransactionsImpl.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Transactions/TransactionsImpl.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Transactions/TransactionsImpl.cs
index 4ddbc6d..4dd7f9f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Transactions/TransactionsImpl.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Transactions/TransactionsImpl.cs
@@ -22,13 +22,12 @@ namespace Apache.Ignite.Core.Impl.Transactions
     using System.Threading.Tasks;
     using Apache.Ignite.Core.Binary;
     using Apache.Ignite.Core.Impl.Binary;
-    using Apache.Ignite.Core.Impl.Unmanaged;
     using Apache.Ignite.Core.Transactions;
 
     /// <summary>
     /// Transactions facade.
     /// </summary>
-    internal class TransactionsImpl : PlatformTarget, ITransactions
+    internal class TransactionsImpl : PlatformTargetAdapter, ITransactions
     {
         /** */
         private const int OpCacheConfigParameters = 1;
@@ -82,29 +81,19 @@ namespace Apache.Ignite.Core.Impl.Transactions
         /// Initializes a new instance of the <see cref="TransactionsImpl" /> class.
         /// </summary>
         /// <param name="target">Target.</param>
-        /// <param name="marsh">Marshaller.</param>
         /// <param name="localNodeId">Local node id.</param>
-        public TransactionsImpl(IUnmanagedTarget target, Marshaller marsh,
-            Guid localNodeId) : base(target, marsh)
+        public TransactionsImpl(IPlatformTargetInternal target, Guid localNodeId) : base(target)
         {
             _localNodeId = localNodeId;
 
-            TransactionConcurrency concurrency = default(TransactionConcurrency);
-            TransactionIsolation isolation = default(TransactionIsolation);
-            TimeSpan timeout = default(TimeSpan);
+            var res = target.OutStream(OpCacheConfigParameters, reader => Tuple.Create(
+                (TransactionConcurrency) reader.ReadInt(),
+                (TransactionIsolation) reader.ReadInt(),
+                reader.ReadLongAsTimespan()));
 
-            DoInOp(OpCacheConfigParameters, stream =>
-            {
-                var reader = marsh.StartUnmarshal(stream).GetRawReader();
-
-                concurrency = (TransactionConcurrency) reader.ReadInt();
-                isolation = (TransactionIsolation) reader.ReadInt();
-                timeout = reader.ReadLongAsTimespan();
-            });
-
-            _dfltConcurrency = concurrency;
-            _dfltIsolation = isolation;
-            _dfltTimeout = timeout;
+            _dfltConcurrency = res.Item1;
+            _dfltIsolation = res.Item2;
+            _dfltTimeout = res.Item3;
         }
 
         /** <inheritDoc /> */

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 1720a79..f96157c 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/IgniteJniNativeMethods.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/IgniteJniNativeMethods.cs
@@ -63,6 +63,9 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
         [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteTargetInStreamAsync")]
         public static extern void TargetInStreamAsync(void* ctx, void* target, int opType, long memPtr);
 
+        [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteTargetInStreamOutObjectAsync")]
+        public static extern void* TargetInStreamOutObjectAsync(void* ctx, void* target, int opType, long memPtr);
+
         [DllImport(IgniteUtils.FileIgniteJniDll, EntryPoint = "IgniteAcquire")]
         public static extern void* Acquire(void* ctx, void* target);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 2400390..819eda2 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedCallbacks.cs
@@ -678,7 +678,11 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
                                binaryReceiver.Deserialize<StreamReceiverHolder>();
 
                 if (receiver != null)
-                    receiver.Receive(_ignite, new UnmanagedNonReleaseableTarget(_ctx, cache), stream, keepBinary);
+                {
+                    var target = new PlatformJniTarget(new UnmanagedNonReleaseableTarget(_ctx, cache), 
+                        _ignite.Marshaller);
+                    receiver.Receive(_ignite, target, stream, keepBinary);
+                }
 
                 return 0;
             }
@@ -1171,9 +1175,9 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
 
                 if (affBase != null)
                 {
-                    var baseFunc0 = UU.Acquire(_ctx, baseFunc);
+                    var baseFunc0 = new PlatformJniTarget(UU.Acquire(_ctx, baseFunc), _ignite.Marshaller);
 
-                    affBase.SetBaseFunction(new PlatformAffinityFunction(baseFunc0, _ignite.Marshaller));
+                    affBase.SetBaseFunction(new PlatformAffinityFunction(baseFunc0));
                 }
 
                 return _handleRegistry.Allocate(func);

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/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 a38cf2f..b6e6582 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs
@@ -175,6 +175,13 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
             JNI.TargetInStreamAsync(target.Context, target.Target, opType, memPtr);
         }
 
+        internal static IUnmanagedTarget TargetInStreamOutObjectAsync(IUnmanagedTarget target, int opType, long memPtr)
+        {
+            void* res = JNI.TargetInStreamOutObjectAsync(target.Context, target.Target, opType, memPtr);
+
+            return target.ChangeTarget(res);
+        }
+
         #endregion
 
         #region NATIVE METHODS: MISCELANNEOUS

http://git-wip-us.apache.org/repos/asf/ignite/blob/89bba2fa/modules/platforms/dotnet/Apache.Ignite.Core/Interop/IPlatformTarget.cs
----------------------------------------------------------------------
diff --git a/modules/platforms/dotnet/Apache.Ignite.Core/Interop/IPlatformTarget.cs b/modules/platforms/dotnet/Apache.Ignite.Core/Interop/IPlatformTarget.cs
index 621e604..6f5596a 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Interop/IPlatformTarget.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Interop/IPlatformTarget.cs
@@ -18,6 +18,7 @@
 namespace Apache.Ignite.Core.Interop
 {
     using System;
+    using System.Threading;
     using System.Threading.Tasks;
     using Apache.Ignite.Core.Binary;
 
@@ -99,5 +100,19 @@ namespace Apache.Ignite.Core.Interop
         /// <returns>Task.</returns>
         Task<T> DoOutOpAsync<T>(int type, Action<IBinaryRawWriter> writeAction,
             Func<IBinaryRawReader, T> readAction);
+
+        /// <summary>
+        /// Performs asynchronous operation.
+        /// </summary>
+        /// <typeparam name="T">Result type</typeparam>
+        /// <param name="type">Operation type code.</param>
+        /// <param name="writeAction">Write action (can be null).</param>
+        /// <param name="readAction">Read function (can be null).</param>
+        /// <param name="cancellationToken">The cancellation token.</param>
+        /// <returns>
+        /// Task.
+        /// </returns>
+        Task<T> DoOutOpAsync<T>(int type, Action<IBinaryRawWriter> writeAction,
+            Func<IBinaryRawReader, T> readAction, CancellationToken cancellationToken);
     }
 }


[36/50] [abbrv] ignite git commit: Tried to simplify GridDhtAtomicCache.updateAllAsyncInternal0.

Posted by yz...@apache.org.
Tried to simplify GridDhtAtomicCache.updateAllAsyncInternal0.


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

Branch: refs/heads/ignite-5658
Commit: 5704e393102cc8c24df7bfb4ff9053003530b7fc
Parents: 9e79c4b
Author: sboikov <sb...@gridgain.com>
Authored: Thu Jul 27 12:50:37 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Jul 27 12:50:37 2017 +0300

----------------------------------------------------------------------
 .../dht/atomic/DhtAtomicUpdateResult.java       | 131 +++++++
 .../dht/atomic/GridDhtAtomicCache.java          | 380 ++++++++-----------
 .../GridNearAtomicAbstractUpdateFuture.java     |   2 +-
 .../dht/atomic/GridNearAtomicUpdateFuture.java  |   4 +-
 4 files changed, 282 insertions(+), 235 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/5704e393/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/DhtAtomicUpdateResult.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/DhtAtomicUpdateResult.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/DhtAtomicUpdateResult.java
new file mode 100644
index 0000000..e7d2b19
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/DhtAtomicUpdateResult.java
@@ -0,0 +1,131 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache.distributed.dht.atomic;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.apache.ignite.internal.processors.cache.GridCacheReturn;
+import org.apache.ignite.internal.processors.cache.GridCacheUpdateAtomicResult;
+import org.apache.ignite.internal.processors.cache.IgniteCacheExpiryPolicy;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheEntry;
+import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
+import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.lang.IgniteBiTuple;
+import org.jetbrains.annotations.Nullable;
+
+/**
+ *
+ */
+class DhtAtomicUpdateResult {
+    /** */
+    private GridCacheReturn retVal;
+
+    /** */
+    private Collection<IgniteBiTuple<GridDhtCacheEntry, GridCacheVersion>> deleted;
+
+    /** */
+    private GridDhtAtomicAbstractUpdateFuture dhtFut;
+
+    /** */
+    private IgniteCacheExpiryPolicy expiry;
+
+    /**
+     *
+     */
+    DhtAtomicUpdateResult() {
+        // No-op.
+    }
+
+    /**
+     * @param retVal Return value.
+     * @param deleted Deleted entries.
+     * @param dhtFut DHT update future.
+     */
+    DhtAtomicUpdateResult(GridCacheReturn retVal,
+        Collection<IgniteBiTuple<GridDhtCacheEntry, GridCacheVersion>> deleted,
+        GridDhtAtomicAbstractUpdateFuture dhtFut) {
+        this.retVal = retVal;
+        this.deleted = deleted;
+        this.dhtFut = dhtFut;
+    }
+
+    /**
+     * @param expiry Expiry policy.
+     */
+    void expiryPolicy(@Nullable IgniteCacheExpiryPolicy expiry) {
+        this.expiry = expiry;
+    }
+
+    /**
+     * @return Expiry policy.
+     */
+    @Nullable IgniteCacheExpiryPolicy expiryPolicy() {
+        return expiry;
+    }
+
+    /**
+     * @param entry Entry.
+     * @param updRes Entry update result.
+     * @param entries All entries.
+     */
+    void addDeleted(GridDhtCacheEntry entry,
+        GridCacheUpdateAtomicResult updRes,
+        Collection<GridDhtCacheEntry> entries) {
+        if (updRes.removeVersion() != null) {
+            if (deleted == null)
+                deleted = new ArrayList<>(entries.size());
+
+            deleted.add(F.t(entry, updRes.removeVersion()));
+        }
+    }
+
+    /**
+     * @return Deleted entries.
+     */
+    Collection<IgniteBiTuple<GridDhtCacheEntry, GridCacheVersion>> deleted() {
+        return deleted;
+    }
+
+    /**
+     * @return DHT future.
+     */
+    GridDhtAtomicAbstractUpdateFuture dhtFuture() {
+        return dhtFut;
+    }
+
+    /**
+     * @param retVal Result for operation.
+     */
+    void returnValue(GridCacheReturn retVal) {
+        this.retVal = retVal;
+    }
+
+    /**
+     * @return Result for invoke operation.
+     */
+    GridCacheReturn returnValue() {
+        return retVal;
+    }
+
+    /**
+     * @param dhtFut DHT future.
+     */
+    void dhtFuture(@Nullable GridDhtAtomicAbstractUpdateFuture dhtFut) {
+        this.dhtFut = dhtFut;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/5704e393/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
index 712babd..be4aace 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridDhtAtomicCache.java
@@ -1658,12 +1658,12 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
     /**
      * Executes local update.
      *
-     * @param nodeId Node ID.
+     * @param node Node.
      * @param req Update request.
      * @param completionCb Completion callback.
      */
     void updateAllAsyncInternal(
-        final UUID nodeId,
+        final ClusterNode node,
         final GridNearAtomicAbstractUpdateRequest req,
         final UpdateReplyClosure completionCb
     ) {
@@ -1678,12 +1678,12 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
                 return;
             }
             catch (IgniteCheckedException e) {
-                onForceKeysError(nodeId, req, completionCb, e);
+                onForceKeysError(node.id(), req, completionCb, e);
 
                 return;
             }
 
-            updateAllAsyncInternal0(nodeId, req, completionCb);
+            updateAllAsyncInternal0(node, req, completionCb);
         }
         else {
             forceFut.listen(new CI1<IgniteInternalFuture<Object>>() {
@@ -1695,12 +1695,12 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
                         return;
                     }
                     catch (IgniteCheckedException e) {
-                        onForceKeysError(nodeId, req, completionCb, e);
+                        onForceKeysError(node.id(), req, completionCb, e);
 
                         return;
                     }
 
-                    updateAllAsyncInternal0(nodeId, req, completionCb);
+                    updateAllAsyncInternal0(node, req, completionCb);
                 }
             });
         }
@@ -1732,26 +1732,17 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
     /**
      * Executes local update after preloader fetched values.
      *
-     * @param nodeId Node ID.
+     * @param node Node.
      * @param req Update request.
      * @param completionCb Completion callback.
      */
     private void updateAllAsyncInternal0(
-        UUID nodeId,
+        ClusterNode node,
         GridNearAtomicAbstractUpdateRequest req,
         UpdateReplyClosure completionCb
     ) {
-        ClusterNode node = ctx.discovery().node(nodeId);
-
-        if (node == null) {
-            U.warn(msgLog, "Skip near update request, node originated update request left [" +
-                "futId=" + req.futureId() + ", node=" + nodeId + ']');
-
-            return;
-        }
-
         GridNearAtomicUpdateResponse res = new GridNearAtomicUpdateResponse(ctx.cacheId(),
-            nodeId,
+            node.id(),
             req.futureId(),
             req.partition(),
             false,
@@ -1763,8 +1754,6 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
 
         boolean remap = false;
 
-        String taskName = ctx.kernalContext().task().resolveTaskName(req.taskNameHash());
-
         IgniteCacheExpiryPolicy expiry = null;
 
         ctx.shared().database().checkpointReadLock();
@@ -1795,97 +1784,11 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
                     // Do not check topology version if topology was locked on near node by
                     // external transaction or explicit lock.
                     if (req.topologyLocked() || !needRemap(req.topologyVersion(), top.topologyVersion())) {
-                        boolean hasNear = req.nearCache();
-
-                        // Assign next version for update inside entries lock.
-                        GridCacheVersion ver = ctx.versions().next(top.topologyVersion());
-
-                        if (hasNear)
-                            res.nearVersion(ver);
-
-                        if (msgLog.isDebugEnabled()) {
-                            msgLog.debug("Assigned update version [futId=" + req.futureId() +
-                                ", writeVer=" + ver + ']');
-                        }
-
-                        assert ver != null : "Got null version for update request: " + req;
-
-                        boolean sndPrevVal = !top.rebalanceFinished(req.topologyVersion());
-
-                        dhtFut = createDhtFuture(ver, req);
-
-                        expiry = expiryPolicy(req.expiry());
-
-                        GridCacheReturn retVal = null;
-
-                        if (req.size() > 1 &&                    // Several keys ...
-                            writeThrough() && !req.skipStore() && // and store is enabled ...
-                            !ctx.store().isLocal() &&             // and this is not local store ...
-                            // (conflict resolver should be used for local store)
-                            !ctx.dr().receiveEnabled()            // and no DR.
-                            ) {
-                            // This method can only be used when there are no replicated entries in the batch.
-                            UpdateBatchResult updRes = updateWithBatch(node,
-                                hasNear,
-                                req,
-                                res,
-                                locked,
-                                ver,
-                                dhtFut,
-                                ctx.isDrEnabled(),
-                                taskName,
-                                expiry,
-                                sndPrevVal);
-
-                            deleted = updRes.deleted();
-                            dhtFut = updRes.dhtFuture();
-
-                            if (req.operation() == TRANSFORM)
-                                retVal = updRes.invokeResults();
-                        }
-                        else {
-                            UpdateSingleResult updRes = updateSingle(node,
-                                hasNear,
-                                req,
-                                res,
-                                locked,
-                                ver,
-                                dhtFut,
-                                ctx.isDrEnabled(),
-                                taskName,
-                                expiry,
-                                sndPrevVal);
-
-                            retVal = updRes.returnValue();
-                            deleted = updRes.deleted();
-                            dhtFut = updRes.dhtFuture();
-                        }
+                        DhtAtomicUpdateResult updRes = update(node, locked, req, res);
 
-                        if (retVal == null)
-                            retVal = new GridCacheReturn(ctx, node.isLocal(), true, null, true);
-
-                        res.returnValue(retVal);
-
-                        if (dhtFut != null) {
-                            if (req.writeSynchronizationMode() == PRIMARY_SYNC
-                                // To avoid deadlock disable back-pressure for sender data node.
-                                && !ctx.discovery().cacheAffinityNode(node, ctx.name())
-                                && !dhtFut.isDone()) {
-                                final IgniteRunnable tracker = GridNioBackPressureControl.threadTracker();
-
-                                if (tracker != null && tracker instanceof GridNioMessageTracker) {
-                                    ((GridNioMessageTracker)tracker).onMessageReceived();
-
-                                    dhtFut.listen(new IgniteInClosure<IgniteInternalFuture<Void>>() {
-                                        @Override public void apply(IgniteInternalFuture<Void> fut) {
-                                            ((GridNioMessageTracker)tracker).onMessageProcessed();
-                                        }
-                                    });
-                                }
-                            }
-
-                            ctx.mvcc().addAtomicFuture(dhtFut.id(), dhtFut);
-                        }
+                        dhtFut = updRes.dhtFuture();
+                        deleted = updRes.deleted();
+                        expiry = updRes.expiryPolicy();
                     }
                     else {
                         // Should remap all keys.
@@ -1953,9 +1856,10 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
 
             completionCb.apply(req, res);
         }
-        else
+        else {
             if (dhtFut != null)
                 dhtFut.map(node, res.returnValue(), res, completionCb);
+        }
 
         if (req.writeSynchronizationMode() != FULL_ASYNC)
             req.cleanup(!node.isLocal());
@@ -1964,6 +1868,122 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
     }
 
     /**
+     * @param node Node.
+     * @param locked Entries.
+     * @param req Request.
+     * @param res Response.
+     * @return Operation result.
+     * @throws GridCacheEntryRemovedException If got obsolete entry.
+     */
+    private DhtAtomicUpdateResult update(
+        ClusterNode node,
+        List<GridDhtCacheEntry> locked,
+        GridNearAtomicAbstractUpdateRequest req,
+        GridNearAtomicUpdateResponse res)
+        throws GridCacheEntryRemovedException
+    {
+        GridDhtPartitionTopology top = topology();
+
+        String taskName = ctx.kernalContext().task().resolveTaskName(req.taskNameHash());
+
+        boolean hasNear = req.nearCache();
+
+        // Assign next version for update inside entries lock.
+        GridCacheVersion ver = ctx.versions().next(top.topologyVersion());
+
+        if (hasNear)
+            res.nearVersion(ver);
+
+        if (msgLog.isDebugEnabled()) {
+            msgLog.debug("Assigned update version [futId=" + req.futureId() +
+                ", writeVer=" + ver + ']');
+        }
+
+        assert ver != null : "Got null version for update request: " + req;
+
+        boolean sndPrevVal = !top.rebalanceFinished(req.topologyVersion());
+
+        GridDhtAtomicAbstractUpdateFuture dhtFut = createDhtFuture(ver, req);
+
+        IgniteCacheExpiryPolicy expiry = expiryPolicy(req.expiry());
+
+        GridCacheReturn retVal = null;
+
+        DhtAtomicUpdateResult updRes;
+
+        if (req.size() > 1 &&                    // Several keys ...
+            writeThrough() && !req.skipStore() && // and store is enabled ...
+            !ctx.store().isLocal() &&             // and this is not local store ...
+            // (conflict resolver should be used for local store)
+            !ctx.dr().receiveEnabled()            // and no DR.
+            ) {
+            // This method can only be used when there are no replicated entries in the batch.
+            updRes = updateWithBatch(node,
+                hasNear,
+                req,
+                res,
+                locked,
+                ver,
+                dhtFut,
+                ctx.isDrEnabled(),
+                taskName,
+                expiry,
+                sndPrevVal);
+
+            dhtFut = updRes.dhtFuture();
+
+            if (req.operation() == TRANSFORM)
+                retVal = updRes.returnValue();
+        }
+        else {
+            updRes = updateSingle(node,
+                hasNear,
+                req,
+                res,
+                locked,
+                ver,
+                dhtFut,
+                ctx.isDrEnabled(),
+                taskName,
+                expiry,
+                sndPrevVal);
+
+            retVal = updRes.returnValue();
+            dhtFut = updRes.dhtFuture();
+        }
+
+        if (retVal == null)
+            retVal = new GridCacheReturn(ctx, node.isLocal(), true, null, true);
+
+        res.returnValue(retVal);
+
+        if (dhtFut != null) {
+            if (req.writeSynchronizationMode() == PRIMARY_SYNC
+                // To avoid deadlock disable back-pressure for sender data node.
+                && !ctx.discovery().cacheAffinityNode(node, ctx.name())
+                && !dhtFut.isDone()) {
+                final IgniteRunnable tracker = GridNioBackPressureControl.threadTracker();
+
+                if (tracker != null && tracker instanceof GridNioMessageTracker) {
+                    ((GridNioMessageTracker)tracker).onMessageReceived();
+
+                    dhtFut.listen(new IgniteInClosure<IgniteInternalFuture<Void>>() {
+                        @Override public void apply(IgniteInternalFuture<Void> fut) {
+                            ((GridNioMessageTracker)tracker).onMessageProcessed();
+                        }
+                    });
+                }
+            }
+
+            ctx.mvcc().addAtomicFuture(dhtFut.id(), dhtFut);
+        }
+
+        updRes.expiryPolicy(expiry);
+
+        return updRes;
+    }
+
+    /**
      * Updates locked entries using batched write-through.
      *
      * @param node Sender node.
@@ -1981,7 +2001,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
      * @throws GridCacheEntryRemovedException Should not be thrown.
      */
     @SuppressWarnings("unchecked")
-    private UpdateBatchResult updateWithBatch(
+    private DhtAtomicUpdateResult updateWithBatch(
         final ClusterNode node,
         final boolean hasNear,
         final GridNearAtomicAbstractUpdateRequest req,
@@ -2004,7 +2024,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
             catch (IgniteCheckedException e) {
                 res.addFailedKeys(req.keys(), e);
 
-                return new UpdateBatchResult();
+                return new DhtAtomicUpdateResult();
             }
         }
 
@@ -2018,7 +2038,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
 
         List<CacheObject> writeVals = null;
 
-        UpdateBatchResult updRes = new UpdateBatchResult();
+        DhtAtomicUpdateResult updRes = new DhtAtomicUpdateResult();
 
         List<GridDhtCacheEntry> filtered = new ArrayList<>(size);
 
@@ -2317,7 +2337,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
 
         updRes.dhtFuture(dhtFut);
 
-        updRes.invokeResult(invokeRes);
+        updRes.returnValue(invokeRes);
 
         return updRes;
     }
@@ -2390,7 +2410,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
      * @return Return value.
      * @throws GridCacheEntryRemovedException Should be never thrown.
      */
-    private UpdateSingleResult updateSingle(
+    private DhtAtomicUpdateResult updateSingle(
         ClusterNode nearNode,
         boolean hasNear,
         GridNearAtomicAbstractUpdateRequest req,
@@ -2577,7 +2597,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
             }
         }
 
-        return new UpdateSingleResult(retVal, deleted, dhtFut);
+        return new DhtAtomicUpdateResult(retVal, deleted, dhtFut);
     }
 
     /**
@@ -2615,7 +2635,7 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
         final GridNearAtomicAbstractUpdateRequest req,
         final GridNearAtomicUpdateResponse res,
         final boolean replicate,
-        final UpdateBatchResult batchRes,
+        final DhtAtomicUpdateResult batchRes,
         final String taskName,
         @Nullable final IgniteCacheExpiryPolicy expiry,
         final boolean sndPrevVal
@@ -3060,7 +3080,16 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
                 ", node=" + nodeId + ']');
         }
 
-        updateAllAsyncInternal(nodeId, req, updateReplyClos);
+        ClusterNode node = ctx.discovery().node(nodeId);
+
+        if (node == null) {
+            U.warn(msgLog, "Skip near update request, node originated update request left [" +
+                "futId=" + req.futureId() + ", node=" + nodeId + ']');
+
+            return;
+        }
+
+        updateAllAsyncInternal(node, req, updateReplyClos);
     }
 
     /**
@@ -3541,119 +3570,6 @@ public class GridDhtAtomicCache<K, V> extends GridDhtCacheAdapter<K, V> {
     }
 
     /**
-     * Result of {@link GridDhtAtomicCache#updateSingle} execution.
-     */
-    private static class UpdateSingleResult {
-        /** */
-        private final GridCacheReturn retVal;
-
-        /** */
-        private final Collection<IgniteBiTuple<GridDhtCacheEntry, GridCacheVersion>> deleted;
-
-        /** */
-        private final GridDhtAtomicAbstractUpdateFuture dhtFut;
-
-        /**
-         * @param retVal Return value.
-         * @param deleted Deleted entries.
-         * @param dhtFut DHT future.
-         */
-        private UpdateSingleResult(GridCacheReturn retVal,
-            Collection<IgniteBiTuple<GridDhtCacheEntry, GridCacheVersion>> deleted,
-            GridDhtAtomicAbstractUpdateFuture dhtFut) {
-            this.retVal = retVal;
-            this.deleted = deleted;
-            this.dhtFut = dhtFut;
-        }
-
-        /**
-         * @return Return value.
-         */
-        private GridCacheReturn returnValue() {
-            return retVal;
-        }
-
-        /**
-         * @return Deleted entries.
-         */
-        private Collection<IgniteBiTuple<GridDhtCacheEntry, GridCacheVersion>> deleted() {
-            return deleted;
-        }
-
-        /**
-         * @return DHT future.
-         */
-        public GridDhtAtomicAbstractUpdateFuture dhtFuture() {
-            return dhtFut;
-        }
-    }
-
-    /**
-     * Result of {@link GridDhtAtomicCache#updateWithBatch} execution.
-     */
-    private static class UpdateBatchResult {
-        /** */
-        private Collection<IgniteBiTuple<GridDhtCacheEntry, GridCacheVersion>> deleted;
-
-        /** */
-        private GridDhtAtomicAbstractUpdateFuture dhtFut;
-
-        /** */
-        private GridCacheReturn invokeRes;
-
-        /**
-         * @param entry Entry.
-         * @param updRes Entry update result.
-         * @param entries All entries.
-         */
-        private void addDeleted(GridDhtCacheEntry entry,
-            GridCacheUpdateAtomicResult updRes,
-            Collection<GridDhtCacheEntry> entries) {
-            if (updRes.removeVersion() != null) {
-                if (deleted == null)
-                    deleted = new ArrayList<>(entries.size());
-
-                deleted.add(F.t(entry, updRes.removeVersion()));
-            }
-        }
-
-        /**
-         * @return Deleted entries.
-         */
-        private Collection<IgniteBiTuple<GridDhtCacheEntry, GridCacheVersion>> deleted() {
-            return deleted;
-        }
-
-        /**
-         * @return DHT future.
-         */
-        public GridDhtAtomicAbstractUpdateFuture dhtFuture() {
-            return dhtFut;
-        }
-
-        /**
-         * @param invokeRes Result for invoke operation.
-         */
-        private void invokeResult(GridCacheReturn invokeRes) {
-            this.invokeRes = invokeRes;
-        }
-
-        /**
-         * @return Result for invoke operation.
-         */
-        GridCacheReturn invokeResults() {
-            return invokeRes;
-        }
-
-        /**
-         * @param dhtFut DHT future.
-         */
-        private void dhtFuture(@Nullable GridDhtAtomicAbstractUpdateFuture dhtFut) {
-            this.dhtFut = dhtFut;
-        }
-    }
-
-    /**
      *
      */
     private static class FinishedLockFuture extends GridFinishedFuture<Boolean> implements GridDhtFuture<Boolean> {

http://git-wip-us.apache.org/repos/asf/ignite/blob/5704e393/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
index 6fe96a4..983b18a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicAbstractUpdateFuture.java
@@ -296,7 +296,7 @@ public abstract class GridNearAtomicAbstractUpdateFuture extends GridCacheFuture
      */
     final void sendSingleRequest(UUID nodeId, GridNearAtomicAbstractUpdateRequest req) {
         if (cctx.localNodeId().equals(nodeId)) {
-            cache.updateAllAsyncInternal(nodeId, req,
+            cache.updateAllAsyncInternal(cctx.localNode(), req,
                 new GridDhtAtomicCache.UpdateReplyClosure() {
                     @Override public void apply(GridNearAtomicAbstractUpdateRequest req, GridNearAtomicUpdateResponse res) {
                         if (syncMode != FULL_ASYNC)

http://git-wip-us.apache.org/repos/asf/ignite/blob/5704e393/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
index 138645d..930012a 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/atomic/GridNearAtomicUpdateFuture.java
@@ -706,7 +706,7 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
         }
 
         if (locUpdate != null) {
-            cache.updateAllAsyncInternal(cctx.localNodeId(), locUpdate,
+            cache.updateAllAsyncInternal(cctx.localNode(), locUpdate,
                 new GridDhtAtomicCache.UpdateReplyClosure() {
                     @Override public void apply(GridNearAtomicAbstractUpdateRequest req, GridNearAtomicUpdateResponse res) {
                         if (syncMode != FULL_ASYNC)
@@ -730,7 +730,7 @@ public class GridNearAtomicUpdateFuture extends GridNearAtomicAbstractUpdateFutu
      * @param topVer Topology version.
      * @param remapKeys Keys to remap.
      */
-    void map(AffinityTopologyVersion topVer, @Nullable Collection<KeyCacheObject> remapKeys) {
+    private void map(AffinityTopologyVersion topVer, @Nullable Collection<KeyCacheObject> remapKeys) {
         Collection<ClusterNode> topNodes = CU.affinityNodes(cctx, topVer);
 
         if (F.isEmpty(topNodes)) {


[27/50] [abbrv] ignite git commit: Merge remote-tracking branch 'remotes/community/ignite-2.1.3'

Posted by yz...@apache.org.
Merge remote-tracking branch 'remotes/community/ignite-2.1.3'


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

Branch: refs/heads/ignite-5658
Commit: bd7d4077bdf0cd95618f5a8935f900f4854b5672
Parents: 3019433 2005eec
Author: sboikov <sb...@gridgain.com>
Authored: Tue Jul 25 13:17:01 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Tue Jul 25 13:17:01 2017 +0300

----------------------------------------------------------------------
 .../dht/GridClientPartitionTopology.java        |   9 +-
 .../dht/GridDhtPartitionTopologyImpl.java       |   9 +-
 .../IgniteCacheDatabaseSharedManager.java       |  22 ++-
 .../database/SwapPathConstructionSelfTest.java  | 157 +++++++++++++++++++
 .../ignite/testsuites/IgniteBasicTestSuite.java |   3 +
 modules/web-console/backend/.eslintrc           |  39 +++--
 modules/web-console/backend/app/agentSocket.js  |   4 +-
 .../web-console/backend/app/browsersHandler.js  |   2 +-
 modules/web-console/backend/package.json        |  27 ++--
 modules/web-console/frontend/.eslintrc          |  40 ++---
 modules/web-console/frontend/app/app.js         |  45 +++---
 .../components/activities-user-dialog/index.js  |  28 ++--
 .../page-configure-advanced/controller.js       |   9 +-
 .../components/page-configure-basic/service.js  |   8 +-
 .../app/components/page-configure/controller.js |  12 +-
 .../page-configure/controller.spec.js           |  48 ------
 .../page-configure/services/PageConfigure.js    |  18 ++-
 .../components/web-console-header/component.js  |  12 +-
 .../app/components/web-console-header/index.js  |   4 +-
 .../components/web-console-header/style.scss    |   6 +-
 .../frontend/app/decorator/select.js            |  77 ---------
 .../frontend/app/decorator/tooltip.js           |  73 ---------
 .../frontend/app/modules/ace.module.js          |   6 +-
 .../app/modules/branding/branding.module.js     |  16 +-
 .../generator/ConfigurationGenerator.js         |   2 +-
 .../generator/PlatformGenerator.js              |   4 +-
 .../frontend/app/modules/demo/Demo.module.js    |  10 +-
 .../app/modules/dialog/dialog.controller.js     |   4 -
 .../app/modules/form/field/label.directive.js   |   4 +-
 .../app/modules/form/field/tooltip.directive.js |   4 +-
 .../frontend/app/modules/sql/sql.controller.js  |   2 +-
 .../frontend/app/modules/sql/sql.module.js      |  66 ++++----
 .../frontend/app/modules/states/admin.state.js  |   6 +-
 .../app/modules/states/configuration.state.js   |  35 +++--
 .../states/configuration/clusters/memory.pug    |   8 +-
 .../summary/summary-zipper.service.js           |   2 +-
 .../frontend/app/modules/states/errors.state.js |   4 +-
 .../frontend/app/modules/states/logout.state.js |  12 +-
 .../app/modules/states/password.state.js        |   4 +-
 .../app/modules/states/profile.state.js         |   9 +-
 .../frontend/app/modules/states/signin.state.js |  32 ++--
 .../app/modules/user/AclRoute.provider.js       |   6 +-
 .../frontend/app/modules/user/user.module.js    |  30 +++-
 .../frontend/app/primitives/modal/index.scss    |   9 ++
 .../frontend/app/primitives/panel/index.scss    |   2 +-
 .../services/AngularStrapSelect.decorator.js    |  77 +++++++++
 .../services/AngularStrapTooltip.decorator.js   | 103 ++++++++++++
 .../app/services/CopyToClipboard.service.js     |   4 +-
 .../app/services/LegacyTable.service.js         |   2 +-
 modules/web-console/frontend/app/vendor.js      |   8 +-
 modules/web-console/frontend/package.json       |  57 +++----
 .../views/configuration/domains-import.tpl.pug  |   4 +-
 .../frontend/views/includes/header-left.pug     |  41 ++---
 modules/web-console/frontend/views/index.pug    |  14 +-
 .../console/agent/handlers/RestListener.java    |   7 +-
 .../ignite/console/agent/rest/RestExecutor.java |  49 +++---
 56 files changed, 726 insertions(+), 569 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/bd7d4077/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/ignite/blob/bd7d4077/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
----------------------------------------------------------------------


[49/50] [abbrv] ignite git commit: Merge branches 'ignite-5658' and 'master' of https://git-wip-us.apache.org/repos/asf/ignite into ignite-5658

Posted by yz...@apache.org.
Merge branches 'ignite-5658' and 'master' of https://git-wip-us.apache.org/repos/asf/ignite into ignite-5658


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

Branch: refs/heads/ignite-5658
Commit: d8497641361d6fdceede8c0f7f45761ca219efa7
Parents: 9936dd8 ab899cf
Author: Yakov Zhdanov <yz...@gridgain.com>
Authored: Fri Jul 28 12:40:02 2017 +0300
Committer: Yakov Zhdanov <yz...@gridgain.com>
Committed: Fri Jul 28 12:40:02 2017 +0300

----------------------------------------------------------------------
 DEVNOTES.txt                                    |   18 +-
 LICENSE                                         |    7 +
 .../ml/math/matrix/ExampleMatrixStorage.java    |    6 +-
 .../apache/ignite/IgniteSystemProperties.java   |   20 +
 .../configuration/CacheConfiguration.java       |    5 -
 .../apache/ignite/internal/IgniteKernal.java    |    8 +-
 .../org/apache/ignite/internal/IgnitionEx.java  |   37 +-
 .../ignite/internal/MarshallerContextImpl.java  |    4 +-
 .../communication/GridIoMessageFactory.java     |    2 +-
 .../managers/communication/GridIoPolicy.java    |    3 +
 .../eventstorage/GridEventStorageManager.java   |   14 +
 .../MetaPageUpdatePartitionDataRecord.java      |    2 +
 .../affinity/GridAffinityProcessor.java         |    2 +-
 .../cache/CacheAffinitySharedManager.java       |   66 +-
 .../cache/CacheObjectsReleaseFuture.java        |   60 +
 .../cache/GridCacheExplicitLockSpan.java        |   10 +-
 .../processors/cache/GridCacheIoManager.java    |    2 +-
 .../processors/cache/GridCacheMvccManager.java  |   24 +-
 .../GridCachePartitionExchangeManager.java      |   57 +-
 .../cache/GridCacheSharedContext.java           |   10 +-
 .../binary/CacheObjectBinaryProcessorImpl.java  |    5 -
 .../dht/GridClientPartitionTopology.java        |   39 +-
 .../cache/distributed/dht/GridDhtGetFuture.java |   14 +-
 .../dht/GridDhtPartitionTopology.java           |   21 +-
 .../dht/GridDhtPartitionTopologyImpl.java       |   88 +-
 .../dht/atomic/DhtAtomicUpdateResult.java       |  131 +++
 .../dht/atomic/GridDhtAtomicCache.java          |  382 +++----
 ...idNearAtomicAbstractSingleUpdateRequest.java |    9 +-
 .../GridNearAtomicAbstractUpdateFuture.java     |    2 +-
 ...GridNearAtomicSingleUpdateInvokeRequest.java |    6 +
 .../dht/atomic/GridNearAtomicUpdateFuture.java  |    4 +-
 .../atomic/GridNearAtomicUpdateResponse.java    |    2 +-
 .../preloader/GridDhtPartitionExchangeId.java   |    2 +-
 .../dht/preloader/GridDhtPartitionMap.java      |    7 +-
 .../GridDhtPartitionsExchangeFuture.java        |  192 ++--
 .../preloader/GridDhtPartitionsFullMessage.java |    4 +-
 ...arOptimisticSerializableTxPrepareFuture.java |    2 +-
 .../near/GridNearOptimisticTxPrepareFuture.java |    2 +-
 .../GridNearPessimisticTxPrepareFuture.java     |    2 +-
 .../cache/distributed/near/GridNearTxLocal.java |    6 +-
 .../cache/local/GridLocalLockFuture.java        |    5 -
 .../GridCacheDatabaseSharedManager.java         |    6 +-
 .../persistence/GridCacheOffheapManager.java    |    2 +-
 .../IgniteCacheDatabaseSharedManager.java       |   22 +-
 .../freelist/io/PagesListMetaIO.java            |    2 +-
 .../wal/FileWriteAheadLogManager.java           |   93 +-
 .../cache/query/GridCacheQueryManager.java      |   24 +-
 .../store/GridCacheStoreManagerAdapter.java     |    5 +-
 .../cache/transactions/IgniteTxAdapter.java     |   44 +-
 .../cache/transactions/IgniteTxHandler.java     |  125 +-
 .../IgniteTxImplicitSingleStateImpl.java        |    2 +-
 .../cache/transactions/IgniteTxManager.java     |    7 +-
 .../IgniteTxRemoteStateAdapter.java             |    2 +-
 .../cache/transactions/IgniteTxState.java       |    2 +-
 .../cache/transactions/IgniteTxStateImpl.java   |    2 +-
 .../processors/igfs/IgfsDataManager.java        |    2 +-
 .../internal/processors/igfs/IgfsImpl.java      |    2 +-
 .../processors/job/GridJobProcessor.java        |   10 +-
 .../platform/PlatformAbstractTarget.java        |    6 +-
 .../processors/platform/PlatformIgnition.java   |    5 +-
 .../platform/PlatformNoopProcessor.java         |  132 ---
 .../processors/platform/PlatformProcessor.java  |  216 ----
 .../platform/PlatformProcessorImpl.java         |  554 +++++----
 .../platform/PlatformTargetProxy.java           |   11 +
 .../platform/PlatformTargetProxyImpl.java       |   79 +-
 .../platform/cluster/PlatformClusterGroup.java  |   29 +
 .../datastructures/PlatformAtomicReference.java |   13 +-
 .../dotnet/PlatformDotNetCacheStore.java        |   31 +
 .../transactions/PlatformTransactions.java      |    2 +-
 .../string/GridRedisIncrDecrCommandHandler.java |    2 +-
 .../service/GridServiceProcessor.java           |    6 +-
 .../processors/service/ServiceContextImpl.java  |    2 +
 .../ignite/internal/util/IgniteUtils.java       |   16 +-
 .../util/StripedCompositeReadWriteLock.java     |    6 +-
 .../ignite/internal/util/StripedExecutor.java   |    4 +-
 .../util/future/GridCompoundFuture.java         |    6 +-
 .../ignite/internal/util/nio/GridNioServer.java |   14 +-
 .../util/tostring/GridToStringBuilder.java      |    2 +-
 .../visor/cache/VisorCacheJdbcType.java         |    2 +-
 .../cache/VisorCacheMetricsCollectorTask.java   |    2 +-
 .../spi/IgniteSpiOperationTimeoutHelper.java    |    8 +-
 .../communication/tcp/TcpCommunicationSpi.java  |  223 ++--
 .../ignite/spi/discovery/tcp/ServerImpl.java    |   74 +-
 .../spi/discovery/tcp/TcpDiscoverySpi.java      |   16 +-
 .../spi/failover/always/AlwaysFailoverSpi.java  |    2 +-
 .../org/apache/ignite/thread/IgniteThread.java  |   35 +-
 .../ignite/thread/IgniteThreadFactory.java      |   15 +-
 .../ignite/thread/IgniteThreadPoolExecutor.java |  141 +--
 .../ignite/internal/GridVersionSelfTest.java    |    2 +
 .../IgniteClientReconnectAbstractTest.java      |    5 +
 .../internal/IgniteComputeJobOneThreadTest.java |   75 ++
 ...UpdateNotifierPerClusterSettingSelfTest.java |    2 +
 .../cache/GridCachePutAllFailoverSelfTest.java  |   15 +
 .../IgniteCacheBinaryObjectsScanSelfTest.java   |    9 +-
 ...acheBinaryObjectsScanWithEventsSelfTest.java |   30 +
 .../cache/IgniteCachePutAllRestartTest.java     |   15 +
 .../cache/IgniteDynamicCacheMultinodeTest.java  |    3 +
 .../CacheGetInsideLockChangingTopologyTest.java |    5 +
 .../CacheLateAffinityAssignmentTest.java        |   36 +-
 .../distributed/CachePartitionStateTest.java    |  410 +++++++
 .../GridCacheAbstractNodeRestartSelfTest.java   |   12 +-
 ...titionEvictionDuringReadThroughSelfTest.java |    1 +
 ...niteBinaryMetadataUpdateNodeRestartTest.java |   10 +
 .../distributed/IgniteCacheGetRestartTest.java  |    5 +
 .../IgniteCacheNearRestartRollbackSelfTest.java |   15 +
 ...teSynchronizationModesMultithreadedTest.java |    5 +
 ...cOriginatingNodeFailureAbstractSelfTest.java |    2 +-
 .../TestCacheNodeExcludingFilter.java           |   53 +
 .../dht/IgniteCacheMultiTxLockSelfTest.java     |    2 -
 .../IgniteCachePutRetryAbstractSelfTest.java    |    5 +
 .../GridCachePartitionedTxSalvageSelfTest.java  |    8 +-
 ...cingDelayedPartitionMapExchangeSelfTest.java |   58 +-
 .../GridCacheReplicatedNodeRestartSelfTest.java |    2 +-
 .../db/IgnitePdsCacheRestoreTest.java           |  208 ++++
 .../processors/database/BPlusTreeSelfTest.java  |    4 +-
 .../database/FreeListImplSelfTest.java          |    4 +-
 .../database/SwapPathConstructionSelfTest.java  |  157 +++
 .../loadtests/colocation/GridTestMain.java      |   45 -
 .../marshaller/GridMarshallerResourceBean.java  |    5 +-
 .../plugin/PlatformTestPluginTarget.java        |    7 +-
 .../org/apache/ignite/spi/GridTcpForwarder.java |   26 +
 .../tcp/TcpCommunicationSpiDropNodesTest.java   |   15 +
 .../TcpCommunicationSpiFaultyClientTest.java    |   20 +-
 .../junits/common/GridCommonAbstractTest.java   |    6 +-
 .../ignite/testsuites/IgniteBasicTestSuite.java |    3 +
 .../IgniteCacheRestartTestSuite2.java           |    2 +
 .../testsuites/IgniteCacheTestSuite6.java       |   38 +
 .../testsuites/IgniteComputeGridTestSuite.java  |    3 +
 .../ignite/testsuites/IgnitePdsTestSuite.java   |    3 +
 .../GridThreadPoolExecutorServiceSelfTest.java  |    9 +-
 modules/docker/2.1.0/Dockerfile                 |   46 +
 modules/docker/2.1.0/run.sh                     |   51 +
 modules/docker/Dockerfile                       |    2 +-
 .../IgniteBinaryCacheQueryTestSuite.java        |    2 +
 .../processors/cache/jta/CacheJtaResource.java  |   20 +-
 .../cache/AbstractCacheJtaSelfTest.java         |  183 ---
 .../GridPartitionedCacheJtaFactorySelfTest.java |   41 -
 ...rtitionedCacheJtaFactoryUseSyncSelfTest.java |   32 -
 ...titionedCacheJtaLookupClassNameSelfTest.java |   83 --
 .../GridReplicatedCacheJtaFactorySelfTest.java  |   32 -
 ...eplicatedCacheJtaFactoryUseSyncSelfTest.java |   32 -
 ...plicatedCacheJtaLookupClassNameSelfTest.java |   32 -
 .../cache/jta/AbstractCacheJtaSelfTest.java     |  248 ++++
 .../GridPartitionedCacheJtaFactorySelfTest.java |   41 +
 ...rtitionedCacheJtaFactoryUseSyncSelfTest.java |   32 +
 ...titionedCacheJtaLookupClassNameSelfTest.java |   83 ++
 .../GridReplicatedCacheJtaFactorySelfTest.java  |   32 +
 ...eplicatedCacheJtaFactoryUseSyncSelfTest.java |   32 +
 ...plicatedCacheJtaLookupClassNameSelfTest.java |   32 +
 .../processors/cache/jta/package-info.java      |   22 +
 .../ignite/testsuites/IgniteJtaTestSuite.java   |   12 +-
 .../apache/ignite/mesos/ClusterProperties.java  |    4 +-
 modules/ml/README.txt                           |    6 +
 modules/ml/licenses/bsd3.txt                    |   51 +
 modules/ml/pom.xml                              |   22 +
 .../clustering/KMeansDistributedClusterer.java  |    6 +-
 .../ml/clustering/KMeansLocalClusterer.java     |    2 +-
 .../java/org/apache/ignite/ml/math/Blas.java    |  484 ++++++++
 .../apache/ignite/ml/math/DistanceMeasure.java  |    2 +-
 .../ignite/ml/math/EuclideanDistance.java       |    3 +-
 .../org/apache/ignite/ml/math/MathUtils.java    |    1 +
 .../java/org/apache/ignite/ml/math/Matrix.java  |   31 +
 .../apache/ignite/ml/math/MatrixStorage.java    |    2 +-
 .../apache/ignite/ml/math/OrderedMatrix.java    |   24 +
 .../java/org/apache/ignite/ml/math/Vector.java  |    8 +
 .../org/apache/ignite/ml/math/VectorUtils.java  |    7 +-
 .../decompositions/CholeskyDecomposition.java   |   11 +-
 .../math/decompositions/EigenDecomposition.java |    2 +-
 .../ml/math/decompositions/LUDecomposition.java |    2 +-
 .../ml/math/decompositions/QRDecomposition.java |    2 +-
 .../exceptions/MathIllegalNumberException.java  |    8 +-
 .../IgniteIntDoubleToDoubleBiFunction.java      |   27 +
 .../functions/IgniteIntIntToIntBiFunction.java  |   27 +
 .../ml/math/functions/IgniteTriFunction.java    |   35 +
 .../apache/ignite/ml/math/impls/CacheUtils.java |  198 +++-
 .../ml/math/impls/matrix/AbstractMatrix.java    |  100 +-
 .../ignite/ml/math/impls/matrix/BlockEntry.java |   50 +
 .../ml/math/impls/matrix/CacheMatrix.java       |    9 +-
 .../impls/matrix/DenseLocalOnHeapMatrix.java    |   61 +-
 .../matrix/SparseBlockDistributedMatrix.java    |  208 ++++
 .../impls/matrix/SparseDistributedMatrix.java   |   26 +-
 .../impls/matrix/SparseLocalOnHeapMatrix.java   |   27 +
 .../storage/matrix/ArrayMatrixStorage.java      |   78 +-
 .../storage/matrix/BaseBlockMatrixKey.java      |   41 +
 .../impls/storage/matrix/BlockMatrixKey.java    |  144 +++
 .../storage/matrix/BlockMatrixStorage.java      |  435 +++++++
 .../matrix/DenseOffHeapMatrixStorage.java       |    4 +-
 .../storage/matrix/MatrixDelegateStorage.java   |    2 +-
 .../matrix/SparseDistributedMatrixStorage.java  |    4 +-
 .../matrix/SparseLocalOnHeapMatrixStorage.java  |   18 +
 .../vector/DenseLocalOffHeapVectorStorage.java  |    2 +-
 .../vector/SparseLocalOffHeapVectorStorage.java |    2 +-
 .../vector/SparseLocalOnHeapVectorStorage.java  |   14 +-
 .../impls/vector/AbstractReadOnlyVector.java    |    6 +
 .../ml/math/impls/vector/AbstractVector.java    |    8 +
 .../ml/math/impls/vector/CacheVector.java       |    4 +-
 .../ml/math/impls/vector/DelegatingVector.java  |    6 +
 .../ml/math/impls/vector/MapWrapperVector.java  |    1 -
 .../ml/math/impls/vector/SparseLocalVector.java |   45 +-
 .../ignite/ml/math/impls/vector/VectorView.java |    2 +-
 .../ignite/ml/math/statistics/Variance.java     |    1 +
 .../ignite/ml/math/statistics/package-info.java |   22 +
 .../org/apache/ignite/ml/math/util/MapUtil.java |    2 +-
 .../apache/ignite/ml/math/util/MatrixUtil.java  |   52 +-
 .../ignite/ml/math/util/package-info.java       |   22 +
 .../java/org/apache/ignite/ml/package-info.java |   22 +
 .../AbstractMultipleLinearRegression.java       |    4 +-
 .../OLSMultipleLinearRegression.java            |    2 +-
 .../java/org/apache/ignite/ml/TestUtils.java    |    2 +-
 .../KMeansDistributedClustererTest.java         |   15 +-
 .../org/apache/ignite/ml/math/BlasTest.java     |  357 ++++++
 .../ml/math/MathImplDistributedTestSuite.java   |    2 +
 .../ignite/ml/math/MathImplMainTestSuite.java   |    3 +-
 .../ignite/ml/math/benchmark/MathBenchmark.java |    2 +-
 .../ml/math/benchmark/VectorBenchmarkTest.java  |    2 +-
 .../decompositions/EigenDecompositionTest.java  |    2 +-
 .../math/impls/matrix/MatrixAttributeTest.java  |    2 -
 .../impls/matrix/MatrixViewConstructorTest.java |    2 +-
 .../SparseDistributedBlockMatrixTest.java       |  379 +++++++
 .../matrix/SparseDistributedMatrixTest.java     |   32 +-
 .../storage/matrix/MatrixArrayStorageTest.java  |    6 +-
 .../matrix/MatrixStorageImplementationTest.java |    2 +-
 .../math/impls/vector/AbstractVectorTest.java   |    4 +-
 .../PivotedVectorViewConstructorTest.java       |    2 +-
 .../math/impls/vector/VectorAttributesTest.java |    2 +-
 .../ml/math/impls/vector/VectorFoldMapTest.java |    2 +-
 .../impls/vector/VectorImplementationsTest.java |   12 +-
 .../math/impls/vector/VectorIterableTest.java   |    2 +-
 .../math/impls/vector/VectorToMatrixTest.java   |    4 +-
 .../OLSMultipleLinearRegressionTest.java        |    4 +-
 .../cpp/core-test/src/cluster_test.cpp          |   13 +
 .../platforms/cpp/core/include/ignite/ignite.h  |   21 +-
 .../ignite/impl/cluster/cluster_group_impl.h    |   15 +
 .../include/ignite/impl/compute/compute_impl.h  |    5 +-
 .../cpp/core/include/ignite/impl/ignite_impl.h  |  110 +-
 .../ignite/impl/interop/interop_target.h        |   16 +-
 modules/platforms/cpp/core/src/ignite.cpp       |   10 +
 modules/platforms/cpp/core/src/ignition.cpp     |   23 +-
 .../src/impl/cluster/cluster_group_impl.cpp     |   26 +-
 .../cpp/core/src/impl/ignite_environment.cpp    |   37 +-
 .../platforms/cpp/core/src/impl/ignite_impl.cpp |   49 +-
 .../core/src/impl/interop/interop_target.cpp    |   18 +-
 .../cpp/jni/include/ignite/jni/exports.h        |   32 +-
 .../platforms/cpp/jni/include/ignite/jni/java.h |   75 +-
 modules/platforms/cpp/jni/project/vs/module.def |   31 +-
 modules/platforms/cpp/jni/src/exports.cpp       |  120 +-
 modules/platforms/cpp/jni/src/java.cpp          |  537 +--------
 .../Apache.Ignite.Core.Tests.csproj             |    5 +
 .../Cache/CacheAbstractTransactionalTest.cs     |   53 +-
 .../Cache/Store/CacheStoreSessionTest.cs        |   90 +-
 .../Store/CacheStoreSessionTestCodeConfig.cs    |   68 ++
 .../Store/CacheStoreSessionTestSharedFactory.cs |   48 +
 .../Cache/Store/CacheStoreTest.cs               |   10 +-
 .../cache-store-session-shared-factory.xml      |   76 ++
 .../Config/Cache/Store/cache-store-session.xml  |   20 +-
 .../Plugin/PluginTest.cs                        |   13 +-
 .../Apache.Ignite.Core.Tests/TestUtils.cs       |    7 +-
 .../Apache.Ignite.Core.csproj                   |    5 +-
 .../dotnet/Apache.Ignite.Core/Ignition.cs       |   21 +-
 .../Impl/Binary/BinaryProcessor.cs              |    6 +-
 .../Impl/Binary/BinaryWriterExtensions.cs       |  107 ++
 .../Cache/Affinity/PlatformAffinityFunction.cs  |    7 +-
 .../Impl/Cache/CacheAffinityImpl.cs             |   18 +-
 .../Impl/Cache/CacheEnumerator.cs               |    8 +-
 .../Apache.Ignite.Core/Impl/Cache/CacheImpl.cs  |  115 +-
 .../Impl/Cache/Query/AbstractQueryCursor.cs     |   12 +-
 .../Continuous/ContinuousQueryHandleImpl.cs     |   12 +-
 .../Impl/Cache/Query/FieldsQueryCursor.cs       |    6 +-
 .../Impl/Cache/Query/QueryCursor.cs             |    5 +-
 .../Impl/Cache/Store/CacheStoreInternal.cs      |   14 +-
 .../Impl/Cluster/ClusterGroupImpl.cs            |  138 ++-
 .../Impl/Common/DelegateTypeDescriptor.cs       |    9 +-
 .../Impl/Common/Listenable.cs                   |    8 +-
 .../Impl/Compute/ComputeImpl.cs                 |   18 +-
 .../Impl/DataStructures/AtomicLong.cs           |    9 +-
 .../Impl/DataStructures/AtomicReference.cs      |    8 +-
 .../Impl/DataStructures/AtomicSequence.cs       |    9 +-
 .../Impl/Datastream/DataStreamerImpl.cs         |   11 +-
 .../Impl/Datastream/StreamReceiverHolder.cs     |   13 +-
 .../Apache.Ignite.Core/Impl/Events/Events.cs    |   11 +-
 .../Impl/IPlatformTargetInternal.cs             |  102 ++
 .../dotnet/Apache.Ignite.Core/Impl/Ignite.cs    |  301 ++---
 .../Apache.Ignite.Core/Impl/Log/JavaLogger.cs   |   23 +-
 .../Impl/Messaging/Messaging.cs                 |   10 +-
 .../Impl/PlatformDisposableTargetAdapter.cs     |   75 ++
 .../Impl/PlatformJniTarget.cs                   |  536 +++++++++
 .../Apache.Ignite.Core/Impl/PlatformTarget.cs   | 1070 ------------------
 .../Impl/PlatformTargetAdapter.cs               |  534 +++++++++
 .../Impl/Plugin/PluginContext.cs                |    7 +-
 .../Impl/Services/Services.cs                   |   19 +-
 .../Impl/Transactions/TransactionsImpl.cs       |   29 +-
 .../Impl/Unmanaged/IgniteJniNativeMethods.cs    |   94 +-
 .../Impl/Unmanaged/UnmanagedCallbacks.cs        |   10 +-
 .../Impl/Unmanaged/UnmanagedUtils.cs            |  315 +-----
 .../Interop/IPlatformTarget.cs                  |   15 +
 .../NuGet/LINQPad/ComputeExample.linq           |    1 +
 modules/web-console/backend/.eslintrc           |   39 +-
 modules/web-console/backend/app/agentSocket.js  |    4 +-
 .../web-console/backend/app/browsersHandler.js  |    2 +-
 modules/web-console/backend/package.json        |   27 +-
 modules/web-console/frontend/.eslintrc          |   40 +-
 modules/web-console/frontend/app/app.js         |   33 +-
 .../components/activities-user-dialog/index.js  |   28 +-
 .../page-configure-advanced/controller.js       |    9 +-
 .../components/page-configure-basic/service.js  |    8 +-
 .../app/components/page-configure/controller.js |   12 +-
 .../page-configure/controller.spec.js           |   48 -
 .../page-configure/services/PageConfigure.js    |   18 +-
 .../components/web-console-header/component.js  |   12 +-
 .../app/components/web-console-header/index.js  |    4 +-
 .../components/web-console-header/style.scss    |    6 +-
 .../frontend/app/data/pom-dependencies.json     |    5 +-
 .../frontend/app/decorator/select.js            |   77 --
 .../frontend/app/decorator/tooltip.js           |   73 --
 .../frontend/app/modules/ace.module.js          |    6 +-
 .../app/modules/branding/branding.module.js     |   16 +-
 .../generator/ConfigurationGenerator.js         |    2 +-
 .../configuration/generator/Maven.service.js    |    9 +-
 .../generator/PlatformGenerator.js              |    4 +-
 .../frontend/app/modules/demo/Demo.module.js    |   10 +-
 .../app/modules/dialog/dialog.controller.js     |    4 -
 .../app/modules/form/field/label.directive.js   |    4 +-
 .../app/modules/form/field/tooltip.directive.js |    4 +-
 .../frontend/app/modules/sql/sql.controller.js  |    2 +-
 .../frontend/app/modules/sql/sql.module.js      |   66 +-
 .../frontend/app/modules/states/admin.state.js  |    6 +-
 .../app/modules/states/configuration.state.js   |   35 +-
 .../states/configuration/clusters/memory.pug    |    8 +-
 .../summary/summary-zipper.service.js           |    2 +-
 .../frontend/app/modules/states/errors.state.js |   10 +-
 .../frontend/app/modules/states/logout.state.js |   12 +-
 .../app/modules/states/password.state.js        |    4 +-
 .../app/modules/states/profile.state.js         |    9 +-
 .../frontend/app/modules/states/signin.state.js |   26 +-
 .../app/modules/user/AclRoute.provider.js       |    6 +-
 .../frontend/app/modules/user/user.module.js    |   30 +-
 .../frontend/app/primitives/modal/index.scss    |    9 +
 .../frontend/app/primitives/panel/index.scss    |    2 +-
 .../services/AngularStrapSelect.decorator.js    |   77 ++
 .../services/AngularStrapTooltip.decorator.js   |  103 ++
 .../app/services/CopyToClipboard.service.js     |    4 +-
 .../app/services/LegacyTable.service.js         |    2 +-
 modules/web-console/frontend/app/vendor.js      |    8 +-
 modules/web-console/frontend/package.json       |   57 +-
 .../views/configuration/domains-import.tpl.pug  |    4 +-
 .../frontend/views/includes/header-left.pug     |   41 +-
 modules/web-console/frontend/views/index.pug    |   14 +-
 .../frontend/webpack/webpack.common.js          |    4 +-
 .../console/agent/handlers/RestListener.java    |    7 +-
 .../ignite/console/agent/rest/RestExecutor.java |   49 +-
 .../cache/websession/WebSessionFilter.java      |    2 +-
 .../cache/IgnitePutTxLoadBenchmark.java         |    3 +-
 352 files changed, 9667 insertions(+), 5625 deletions(-)
----------------------------------------------------------------------



[21/50] [abbrv] ignite git commit: Test for cache partitions state, fix for client cache start.

Posted by yz...@apache.org.
Test for cache partitions state, fix for client cache start.


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

Branch: refs/heads/ignite-5658
Commit: aeb9336b3b161ddfff73f17e41cd453409b84a16
Parents: ca496f6
Author: sboikov <sb...@gridgain.com>
Authored: Mon Jul 24 11:47:16 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Mon Jul 24 11:47:16 2017 +0300

----------------------------------------------------------------------
 .../cache/CacheAffinitySharedManager.java       |  51 ++-
 .../dht/GridClientPartitionTopology.java        |   7 +-
 .../dht/GridDhtPartitionTopology.java           |  12 +-
 .../dht/GridDhtPartitionTopologyImpl.java       |  45 +-
 .../GridDhtPartitionsExchangeFuture.java        | 120 +++---
 .../GridCacheDatabaseSharedManager.java         |   6 +-
 .../CacheLateAffinityAssignmentTest.java        |  36 +-
 .../distributed/CachePartitionStateTest.java    | 410 +++++++++++++++++++
 .../TestCacheNodeExcludingFilter.java           |  53 +++
 .../db/IgnitePdsCacheRestoreTest.java           | 208 ++++++++++
 .../testsuites/IgniteCacheTestSuite6.java       |  38 ++
 .../ignite/testsuites/IgnitePdsTestSuite.java   |   3 +
 12 files changed, 863 insertions(+), 126 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
index 79ab183..f519b4e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheAffinitySharedManager.java
@@ -517,6 +517,16 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
             }
         }
 
+        for (DynamicCacheDescriptor desc : startDescs) {
+            if (desc.cacheConfiguration().getCacheMode() != LOCAL) {
+                CacheGroupContext grp = cctx.cache().cacheGroup(desc.groupId());
+
+                assert grp != null;
+
+                grp.topology().onExchangeDone(grp.affinity().cachedAffinity(topVer), true);
+            }
+        }
+
         cctx.cache().initCacheProxies(topVer, null);
 
         cctx.cache().completeClientCacheChangeFuture(msg.requestId(), null);
@@ -1299,6 +1309,19 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
     }
 
     /**
+     * @param grpId Group ID.
+     * @return Group name for debug purpose.
+     */
+    private String debugGroupName(int grpId) {
+        CacheGroupDescriptor desc = caches.group(grpId);
+
+        if (desc != null)
+            return desc.cacheOrGroupName();
+        else
+            return "Unknown group: " + grpId;
+    }
+
+    /**
      * @param fut Exchange future.
      * @throws IgniteCheckedException If failed.
      */
@@ -1396,19 +1419,31 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
      * Called on exchange initiated by server node leave.
      *
      * @param fut Exchange future.
+     * @param crd Coordinator flag.
      * @throws IgniteCheckedException If failed.
      * @return {@code True} if affinity should be assigned by coordinator.
      */
-    public boolean onServerLeft(final GridDhtPartitionsExchangeFuture fut) throws IgniteCheckedException {
+    public boolean onServerLeft(final GridDhtPartitionsExchangeFuture fut, boolean crd) throws IgniteCheckedException {
         ClusterNode leftNode = fut.discoveryEvent().eventNode();
 
         assert !leftNode.isClient() : leftNode;
 
-        for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
-            if (grp.isLocal())
-                continue;
+        if (crd) {
+            // Need initialize CacheGroupHolders if this node become coordinator on this exchange.
+            forAllRegisteredCacheGroups(new IgniteInClosureX<CacheGroupDescriptor>() {
+                @Override public void applyx(CacheGroupDescriptor desc) throws IgniteCheckedException {
+                    CacheGroupHolder cache = groupHolder(fut.topologyVersion(), desc);
 
-            grp.affinity().calculate(fut.topologyVersion(), fut.discoveryEvent(), fut.discoCache());
+                    cache.aff.calculate(fut.topologyVersion(), fut.discoveryEvent(), fut.discoCache());
+                }
+            });
+        }
+        else {
+            forAllCacheGroups(false, new IgniteInClosureX<GridAffinityAssignmentCache>() {
+                @Override public void applyx(GridAffinityAssignmentCache aff) throws IgniteCheckedException {
+                    aff.calculate(fut.topologyVersion(), fut.discoveryEvent(), fut.discoCache());
+                }
+            });
         }
 
         synchronized (mux) {
@@ -1433,12 +1468,8 @@ public class CacheAffinitySharedManager<K, V> extends GridCacheSharedManagerAdap
             @Override public void applyx(CacheGroupDescriptor desc) throws IgniteCheckedException {
                 CacheGroupHolder grpHolder = grpHolders.get(desc.groupId());
 
-                if (grpHolder != null) {
-                    if (grpHolder.client()) // Affinity for non-client holders calculated in {@link #onServerLeft}.
-                        grpHolder.affinity().calculate(fut.topologyVersion(), fut.discoveryEvent(), fut.discoCache());
-
+                if (grpHolder != null)
                     return;
-                }
 
                 // Need initialize holders and affinity if this node became coordinator during this exchange.
                 final Integer grpId = desc.groupId();

http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
index f4ed517..232ce38 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridClientPartitionTopology.java
@@ -367,6 +367,11 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
     }
 
     /** {@inheritDoc} */
+    @Override public GridDhtLocalPartition forceCreatePartition(int p) throws IgniteCheckedException {
+        throw new UnsupportedOperationException();
+    }
+
+    /** {@inheritDoc} */
     @Override public GridDhtLocalPartition localPartition(int p) {
         return localPartition(p, AffinityTopologyVersion.NONE, false);
     }
@@ -830,7 +835,7 @@ public class GridClientPartitionTopology implements GridDhtPartitionTopology {
     }
 
     /** {@inheritDoc} */
-    @Override public void onExchangeDone(AffinityAssignment assignment) {
+    @Override public void onExchangeDone(AffinityAssignment assignment, boolean updateRebalanceVer) {
         // No-op.
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
index 5f76d12..d9e04a6 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopology.java
@@ -130,6 +130,15 @@ public interface GridDhtPartitionTopology {
         throws GridDhtInvalidPartitionException;
 
     /**
+     * Unconditionally creates partition during restore of persisted partition state.
+     *
+     * @param p Partition ID.
+     * @return Partition.
+     * @throws IgniteCheckedException If failed.
+     */
+    public GridDhtLocalPartition forceCreatePartition(int p) throws IgniteCheckedException;
+
+    /**
      * @param topVer Topology version at the time of creation.
      * @param p Partition ID.
      * @param create If {@code true}, then partition will be created if it's not there.
@@ -331,6 +340,7 @@ public interface GridDhtPartitionTopology {
      * Callback on exchange done.
      *
      * @param assignment New affinity assignment.
+     * @param updateRebalanceVer {@code True} if need check rebalance state.
      */
-    public void onExchangeDone(AffinityAssignment assignment);
+    public void onExchangeDone(AffinityAssignment assignment, boolean updateRebalanceVer);
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
index 601da1b..5ef499c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtPartitionTopologyImpl.java
@@ -135,9 +135,6 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
     /** */
     private volatile AffinityTopologyVersion rebalancedTopVer = AffinityTopologyVersion.NONE;
 
-    /** */
-    private volatile boolean treatAllPartAsLoc;
-
     /**
      * @param ctx Cache shared context.
      * @param grp Cache group.
@@ -421,14 +418,6 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
     /** {@inheritDoc} */
     @Override public void beforeExchange(GridDhtPartitionsExchangeFuture exchFut, boolean affReady)
         throws IgniteCheckedException {
-        DiscoveryEvent discoEvt = exchFut.discoveryEvent();
-
-        treatAllPartAsLoc = exchFut.activateCluster()
-            || (discoEvt.type() == EventType.EVT_NODE_JOINED
-            && discoEvt.eventNode().isLocal()
-            && !ctx.kernalContext().clientNode()
-        );
-
         ClusterNode loc = ctx.localNode();
 
         ctx.database().checkpointReadLock();
@@ -540,8 +529,6 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
 
     /** {@inheritDoc} */
     @Override public boolean afterExchange(GridDhtPartitionsExchangeFuture exchFut) throws IgniteCheckedException {
-        treatAllPartAsLoc = false;
-
         boolean changed = false;
 
         int num = grp.affinity().partitions();
@@ -692,6 +679,29 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
         return loc;
     }
 
+    /** {@inheritDoc} */
+    @Override public GridDhtLocalPartition forceCreatePartition(int p) throws IgniteCheckedException {
+        lock.writeLock().lock();
+
+        try {
+            GridDhtLocalPartition part = locParts.get(p);
+
+            if (part != null)
+                return part;
+
+            part = new GridDhtLocalPartition(ctx, grp, p);
+
+            locParts.set(p, part);
+
+            ctx.pageStore().onPartitionCreated(grp.groupId(), p);
+
+            return part;
+        }
+        finally {
+            lock.writeLock().unlock();
+        }
+    }
+
     /**
      * @param p Partition number.
      * @param topVer Topology version.
@@ -731,7 +741,7 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
             if (loc != null && state == EVICTED) {
                 locParts.set(p, loc = null);
 
-                if (!treatAllPartAsLoc && !belongs)
+                if (!belongs)
                     throw new GridDhtInvalidPartitionException(p, "Adding entry to evicted partition " +
                         "(often may be caused by inconsistent 'key.hashCode()' implementation) " +
                         "[part=" + p + ", topVer=" + topVer + ", this.topVer=" + this.topVer + ']');
@@ -741,7 +751,7 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
                     "[part=" + p + ", shouldBeMoving=" + loc.reload() + "]");
 
             if (loc == null) {
-                if (!treatAllPartAsLoc && !belongs)
+                if (!belongs)
                     throw new GridDhtInvalidPartitionException(p, "Creating partition which does not belong to " +
                         "local node (often may be caused by inconsistent 'key.hashCode()' implementation) " +
                         "[part=" + p + ", topVer=" + topVer + ", this.topVer=" + this.topVer + ']');
@@ -1499,12 +1509,15 @@ public class GridDhtPartitionTopologyImpl implements GridDhtPartitionTopology {
     }
 
     /** {@inheritDoc} */
-    @Override public void onExchangeDone(AffinityAssignment assignment) {
+    @Override public void onExchangeDone(AffinityAssignment assignment, boolean updateRebalanceVer) {
         lock.writeLock().lock();
 
         try {
             if (assignment.topologyVersion().compareTo(diffFromAffinityVer) >= 0)
                 rebuildDiff(assignment);
+
+            if (updateRebalanceVer)
+                updateRebalanceVersion(assignment.assignment());
         }
         finally {
             lock.writeLock().unlock();

http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
index c4a4f83..cdb4bb7 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/preloader/GridDhtPartitionsExchangeFuture.java
@@ -193,9 +193,6 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     /** */
     private CacheAffinityChangeMessage affChangeMsg;
 
-    /** */
-    private boolean clientOnlyExchange;
-
     /** Init timestamp. Used to track the amount of time spent to complete the future. */
     private long initTs;
 
@@ -485,26 +482,8 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
 
                         cctx.affinity().initStartedCaches(crdNode, this, receivedCaches);
                     }
-                    else {
-                        cctx.activate();
-
-                        List<T2<DynamicCacheDescriptor, NearCacheConfiguration>> caches =
-                            cctx.cache().cachesToStartOnLocalJoin();
-
-                        if (cctx.database().persistenceEnabled() &&
-                            !cctx.kernalContext().clientNode()) {
-                            List<DynamicCacheDescriptor> startDescs = new ArrayList<>();
-
-                            if (caches != null) {
-                                for (T2<DynamicCacheDescriptor, NearCacheConfiguration> c : caches)
-                                    startDescs.add(c.get1());
-                            }
-
-                            cctx.database().readCheckpointAndRestoreMemory(startDescs);
-                        }
-
-                        cctx.cache().startCachesOnLocalJoin(caches, topVer);
-                    }
+                    else
+                        initCachesOnLocalJoin();
                 }
 
                 exchange = CU.clientNode(discoEvt.eventNode()) ?
@@ -571,6 +550,29 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     /**
      * @throws IgniteCheckedException If failed.
      */
+    private void initCachesOnLocalJoin() throws IgniteCheckedException {
+        cctx.activate();
+
+        List<T2<DynamicCacheDescriptor, NearCacheConfiguration>> caches =
+            cctx.cache().cachesToStartOnLocalJoin();
+
+        if (cctx.database().persistenceEnabled() && !cctx.kernalContext().clientNode()) {
+            List<DynamicCacheDescriptor> startDescs = new ArrayList<>();
+
+            if (caches != null) {
+                for (T2<DynamicCacheDescriptor, NearCacheConfiguration> c : caches)
+                    startDescs.add(c.get1());
+            }
+
+            cctx.database().readCheckpointAndRestoreMemory(startDescs);
+        }
+
+        cctx.cache().startCachesOnLocalJoin(caches, topologyVersion());
+    }
+
+    /**
+     * @throws IgniteCheckedException If failed.
+     */
     private void initTopologies() throws IgniteCheckedException {
         cctx.database().checkpointReadLock();
 
@@ -776,7 +778,7 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
 
             warnNoAffinityNodes();
 
-            centralizedAff = cctx.affinity().onServerLeft(this);
+            centralizedAff = cctx.affinity().onServerLeft(this, crd);
         }
         else
             cctx.affinity().onServerJoin(this, crd);
@@ -788,40 +790,15 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
      * @throws IgniteCheckedException If failed.
      */
     private void clientOnlyExchange() throws IgniteCheckedException {
-        clientOnlyExchange = true;
-
         if (crd != null) {
-            if (crd.isLocal()) {
-                for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
-                    boolean updateTop = !grp.isLocal() &&
-                        exchId.topologyVersion().equals(grp.localStartVersion());
-
-                    if (updateTop) {
-                        for (GridClientPartitionTopology top : cctx.exchange().clientTopologies()) {
-                            if (top.groupId() == grp.groupId()) {
-                                GridDhtPartitionFullMap fullMap = top.partitionMap(true);
-
-                                assert fullMap != null;
-
-                                grp.topology().update(topologyVersion(),
-                                    fullMap,
-                                    top.updateCounters(false),
-                                    Collections.<Integer>emptySet());
+            assert !crd.isLocal() : crd;
 
-                                break;
-                            }
-                        }
-                    }
-                }
-            }
-            else {
-                if (!centralizedAff)
-                    sendLocalPartitions(crd);
+            if (!centralizedAff)
+                sendLocalPartitions(crd);
 
-                initDone();
+            initDone();
 
-                return;
-            }
+            return;
         }
         else {
             if (centralizedAff) { // Last server node failed.
@@ -896,8 +873,7 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
         try {
             long start = U.currentTimeMillis();
 
-            IgniteInternalFuture fut = cctx.snapshot()
-                .tryStartLocalSnapshotOperation(discoEvt);
+            IgniteInternalFuture fut = cctx.snapshot().tryStartLocalSnapshotOperation(discoEvt);
 
             if (fut != null) {
                 fut.get();
@@ -1122,6 +1098,8 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     private void sendLocalPartitions(ClusterNode node) throws IgniteCheckedException {
         assert node != null;
 
+        GridDhtPartitionsSingleMessage msg;
+
         // Reset lost partition before send local partition to coordinator.
         if (exchActions != null) {
             Set<String> caches = exchActions.cachesToResetLostPartitions();
@@ -1130,22 +1108,32 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
                 resetLostPartitions(caches);
         }
 
-        GridDhtPartitionsSingleMessage m = cctx.exchange().createPartitionsSingleMessage(
-            node, exchangeId(), clientOnlyExchange, true);
+        if (cctx.kernalContext().clientNode()) {
+            msg = new GridDhtPartitionsSingleMessage(exchangeId(),
+                true,
+                null,
+                true);
+        }
+        else {
+            msg = cctx.exchange().createPartitionsSingleMessage(node,
+                exchangeId(),
+                false,
+                true);
+        }
 
         Map<Integer, Map<Integer, Long>> partHistReserved0 = partHistReserved;
 
         if (partHistReserved0 != null)
-            m.partitionHistoryCounters(partHistReserved0);
+            msg.partitionHistoryCounters(partHistReserved0);
 
         if (stateChangeExchange() && changeGlobalStateE != null)
-            m.setError(changeGlobalStateE);
+            msg.setError(changeGlobalStateE);
 
         if (log.isDebugEnabled())
-            log.debug("Sending local partitions [nodeId=" + node.id() + ", exchId=" + exchId + ", msg=" + m + ']');
+            log.debug("Sending local partitions [nodeId=" + node.id() + ", exchId=" + exchId + ", msg=" + msg + ']');
 
         try {
-            cctx.io().send(node, m, SYSTEM_POOL);
+            cctx.io().send(node, msg, SYSTEM_POOL);
         }
         catch (ClusterTopologyCheckedException ignored) {
             if (log.isDebugEnabled())
@@ -1318,7 +1306,7 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
         if (err == null) {
             for (CacheGroupContext grp : cctx.cache().cacheGroups()) {
                 if (!grp.isLocal())
-                    grp.topology().onExchangeDone(grp.affinity().cachedAffinity(topologyVersion()));
+                    grp.topology().onExchangeDone(grp.affinity().cachedAffinity(topologyVersion()), false);
             }
         }
 
@@ -1386,10 +1374,12 @@ public class GridDhtPartitionsExchangeFuture extends GridDhtTopologyFutureAdapte
     public void onReceive(final ClusterNode node, final GridDhtPartitionsSingleMessage msg) {
         assert msg != null;
         assert msg.exchangeId().equals(exchId) : msg;
-        assert msg.lastVersion() != null : msg;
 
-        if (!msg.client())
+        if (!msg.client()) {
+            assert msg.lastVersion() != null : msg;
+
             updateLastVersion(msg.lastVersion());
+        }
 
         if (isDone()) {
             if (log.isDebugEnabled())

http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
index 39038ba..1797d64 100755
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/GridCacheDatabaseSharedManager.java
@@ -1560,8 +1560,7 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
 
                             T2<Integer, Long> fromWal = partStates.get(new T2<>(grpId, i));
 
-                            GridDhtLocalPartition part = grp.topology()
-                                .localPartition(i, AffinityTopologyVersion.NONE, true);
+                            GridDhtLocalPartition part = grp.topology().forceCreatePartition(i);
 
                             assert part != null;
 
@@ -1621,8 +1620,7 @@ public class GridCacheDatabaseSharedManager extends IgniteCacheDatabaseSharedMan
      * @param dataEntry Data entry to apply.
      */
     private void applyUpdate(GridCacheContext cacheCtx, DataEntry dataEntry) throws IgniteCheckedException {
-        GridDhtLocalPartition locPart = cacheCtx.topology()
-            .localPartition(dataEntry.partitionId(), AffinityTopologyVersion.NONE, true);
+        GridDhtLocalPartition locPart = cacheCtx.topology().forceCreatePartition(dataEntry.partitionId());
 
         switch (dataEntry.op()) {
             case CREATE:

http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
index 23043d1..7d8620a 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CacheLateAffinityAssignmentTest.java
@@ -331,7 +331,7 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
             }
         };
 
-        cacheNodeFilter = new CacheNodeFilter(F.asList(getTestIgniteInstanceName(0)));
+        cacheNodeFilter = new TestCacheNodeExcludingFilter(F.asList(getTestIgniteInstanceName(0)));
 
         testAffinitySimpleSequentialStart();
 
@@ -351,7 +351,7 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
             }
         };
 
-        cacheNodeFilter = new CacheNodeFilter(F.asList(getTestIgniteInstanceName(1)));
+        cacheNodeFilter = new TestCacheNodeExcludingFilter(F.asList(getTestIgniteInstanceName(1)));
 
         startServer(0, 1);
 
@@ -391,7 +391,7 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
             }
         };
 
-        cacheNodeFilter = new CacheNodeFilter(F.asList(getTestIgniteInstanceName(1), getTestIgniteInstanceName(2)));
+        cacheNodeFilter = new TestCacheNodeExcludingFilter(F.asList(getTestIgniteInstanceName(1), getTestIgniteInstanceName(2)));
 
         startServer(0, 1);
         startServer(1, 2);
@@ -439,7 +439,7 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
             }
         };
 
-        cacheNodeFilter = new CacheNodeFilter(F.asList(getTestIgniteInstanceName(0)));
+        cacheNodeFilter = new TestCacheNodeExcludingFilter(F.asList(getTestIgniteInstanceName(0)));
 
         Ignite ignite0 = startServer(0, 1);
 
@@ -467,7 +467,7 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
             }
         };
 
-        cacheNodeFilter = new CacheNodeFilter(F.asList(getTestIgniteInstanceName(0)));
+        cacheNodeFilter = new TestCacheNodeExcludingFilter(F.asList(getTestIgniteInstanceName(0)));
 
         Ignite ignite0 = startServer(0, 1);
 
@@ -520,7 +520,7 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
      */
     private void cacheDestroyAndCreate(boolean cacheOnCrd) throws Exception {
         if (!cacheOnCrd)
-            cacheNodeFilter = new CacheNodeFilter(Collections.singletonList(getTestIgniteInstanceName(0)));
+            cacheNodeFilter = new TestCacheNodeExcludingFilter(Collections.singletonList(getTestIgniteInstanceName(0)));
 
         startServer(0, 1);
 
@@ -2069,7 +2069,7 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
                     exclude.add("server-" + (srvIdx + rnd.nextInt(10)));
             }
 
-            ccfg.setNodeFilter(new CacheNodeFilter(exclude));
+            ccfg.setNodeFilter(new TestCacheNodeExcludingFilter(exclude));
         }
 
         ccfg.setName(name);
@@ -2645,28 +2645,6 @@ public class CacheLateAffinityAssignmentTest extends GridCommonAbstractTest {
     /**
      *
      */
-    static class CacheNodeFilter implements IgnitePredicate<ClusterNode> {
-        /** */
-        private Collection<String> excludeNodes;
-
-        /**
-         * @param excludeNodes Nodes names.
-         */
-        public CacheNodeFilter(Collection<String> excludeNodes) {
-            this.excludeNodes = excludeNodes;
-        }
-
-        /** {@inheritDoc} */
-        @Override public boolean apply(ClusterNode clusterNode) {
-            String name = clusterNode.attribute(ATTR_IGNITE_INSTANCE_NAME).toString();
-
-            return !excludeNodes.contains(name);
-        }
-    }
-
-    /**
-     *
-     */
     static class TestTcpDiscoverySpi extends TcpDiscoverySpi {
         /** */
         private boolean blockCustomEvt;

http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CachePartitionStateTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CachePartitionStateTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CachePartitionStateTest.java
new file mode 100644
index 0000000..c64ed0b
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/CachePartitionStateTest.java
@@ -0,0 +1,410 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache.distributed;
+
+import java.util.HashSet;
+import java.util.Set;
+import org.apache.ignite.Ignite;
+import org.apache.ignite.cache.affinity.Affinity;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.internal.IgniteKernal;
+import org.apache.ignite.internal.TestRecordingCommunicationSpi;
+import org.apache.ignite.internal.processors.affinity.AffinityAssignment;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
+import org.apache.ignite.internal.processors.cache.GridCacheAdapter;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionTopology;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionMap;
+import org.apache.ignite.internal.processors.cache.distributed.dht.preloader.GridDhtPartitionSupplyMessage;
+import org.apache.ignite.internal.util.typedef.G;
+import org.apache.ignite.internal.util.typedef.internal.CU;
+import org.apache.ignite.lang.IgniteBiPredicate;
+import org.apache.ignite.plugin.extensions.communication.Message;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
+import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.EVICTED;
+import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.MOVING;
+import static org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtPartitionState.OWNING;
+
+/**
+ *
+ */
+public class CachePartitionStateTest extends GridCommonAbstractTest {
+    /** */
+    private static TcpDiscoveryIpFinder ipFinder = new TcpDiscoveryVmIpFinder(true);
+
+    /** */
+    private boolean client;
+
+    /** */
+    private CacheConfiguration ccfg;
+
+    /** {@inheritDoc} */
+    protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(ipFinder);
+
+        cfg.setCommunicationSpi(new TestRecordingCommunicationSpi());
+
+        cfg.setClientMode(client);
+
+        if (ccfg != null) {
+            cfg.setCacheConfiguration(ccfg);
+
+            ccfg = null;
+        }
+
+        return cfg;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+
+        super.afterTest();
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPartitionState1_1() throws Exception {
+        partitionState1(0, true);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPartitionState1_2() throws Exception {
+        partitionState1(1, true);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPartitionState1_2_NoCacheOnCoordinator() throws Exception {
+        partitionState1(1, false);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPartitionState1_3() throws Exception {
+        partitionState1(100, true);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPartitionState2_1() throws Exception {
+        partitionState2(0, true);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPartitionState2_2() throws Exception {
+        partitionState2(1, true);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPartitionState2_2_NoCacheOnCoordinator() throws Exception {
+        partitionState2(1, false);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testPartitionState2_3() throws Exception {
+        partitionState2(100, true);
+    }
+
+    /**
+     * @param backups Number of backups.
+     * @param crdAffNode If {@code false} cache is not created on coordinator.
+     * @throws Exception If failed.
+     */
+    private void partitionState1(int backups, boolean crdAffNode) throws Exception {
+        startGrids(3);
+
+        blockSupplySend(DEFAULT_CACHE_NAME);
+
+        CacheConfiguration ccfg = cacheConfiguration(DEFAULT_CACHE_NAME, backups);
+
+        if (!crdAffNode)
+            ccfg.setNodeFilter(new TestCacheNodeExcludingFilter(getTestIgniteInstanceName(0)));
+
+        ignite(1).createCache(ccfg);
+
+        AffinityAssignment assign0 =
+            grid(1).context().cache().internalCache(DEFAULT_CACHE_NAME).context().affinity().assignment(
+                new AffinityTopologyVersion(3, 1));
+
+        awaitPartitionMapExchange();
+
+        checkPartitionsState(assign0, DEFAULT_CACHE_NAME, OWNING);
+
+        checkRebalance(DEFAULT_CACHE_NAME, true);
+
+        client = true;
+
+        Ignite clientNode = startGrid(4);
+
+        checkPartitionsState(assign0, DEFAULT_CACHE_NAME, OWNING);
+
+        clientNode.cache(DEFAULT_CACHE_NAME);
+
+        checkPartitionsState(assign0, DEFAULT_CACHE_NAME, OWNING);
+
+        checkRebalance(DEFAULT_CACHE_NAME, true);
+
+        client = false;
+
+        startGrid(5);
+
+        checkRebalance(DEFAULT_CACHE_NAME, false);
+
+        for (int i = 0; i < 3; i++)
+            checkNodePartitions(assign0, ignite(i).cluster().localNode(), DEFAULT_CACHE_NAME, OWNING);
+
+        AffinityAssignment assign1 =
+            grid(1).context().cache().internalCache(DEFAULT_CACHE_NAME).context().affinity().assignment(
+                new AffinityTopologyVersion(5, 0));
+
+        checkNodePartitions(assign1, ignite(5).cluster().localNode(), DEFAULT_CACHE_NAME, MOVING);
+
+        stopBlock();
+
+        awaitPartitionMapExchange();
+
+        AffinityAssignment assign2 =
+            grid(1).context().cache().internalCache(DEFAULT_CACHE_NAME).context().affinity().assignment(
+                new AffinityTopologyVersion(5, 1));
+
+        checkPartitionsState(assign2, DEFAULT_CACHE_NAME, OWNING);
+
+        checkRebalance(DEFAULT_CACHE_NAME, true);
+
+        if (!crdAffNode)
+            ignite(0).cache(DEFAULT_CACHE_NAME);
+
+        checkPartitionsState(assign2, DEFAULT_CACHE_NAME, OWNING);
+
+        checkRebalance(DEFAULT_CACHE_NAME, true);
+
+        startGrid(6);
+
+        awaitPartitionMapExchange();
+
+        AffinityAssignment assign3 =
+            grid(1).context().cache().internalCache(DEFAULT_CACHE_NAME).context().affinity().assignment(
+                new AffinityTopologyVersion(6, 1));
+
+        checkPartitionsState(assign3, DEFAULT_CACHE_NAME, OWNING);
+
+        checkRebalance(DEFAULT_CACHE_NAME, true);
+    }
+
+    /**
+     * @param backups Number of backups.
+     * @param crdAffNode If {@code false} cache is not created on coordinator.
+     * @throws Exception If failed.
+     */
+    private void partitionState2(int backups, boolean crdAffNode) throws Exception {
+        startGrids(3);
+
+        blockSupplySend(DEFAULT_CACHE_NAME);
+
+        ccfg = cacheConfiguration(DEFAULT_CACHE_NAME, backups);
+
+        if (!crdAffNode)
+            ccfg.setNodeFilter(new TestCacheNodeExcludingFilter(getTestIgniteInstanceName(0)));
+
+        startGrid(4);
+
+        AffinityAssignment assign0 =
+            grid(1).context().cache().internalCache(DEFAULT_CACHE_NAME).context().affinity().assignment(
+                new AffinityTopologyVersion(4, 0));
+
+        checkPartitionsState(assign0, DEFAULT_CACHE_NAME, OWNING);
+
+        checkRebalance(DEFAULT_CACHE_NAME, true);
+
+        if (!crdAffNode)
+            ignite(0).cache(DEFAULT_CACHE_NAME);
+
+        checkPartitionsState(assign0, DEFAULT_CACHE_NAME, OWNING);
+
+        checkRebalance(DEFAULT_CACHE_NAME, true);
+
+        stopBlock();
+
+        startGrid(5);
+
+        AffinityAssignment assign1 =
+            grid(1).context().cache().internalCache(DEFAULT_CACHE_NAME).context().affinity().assignment(
+                new AffinityTopologyVersion(5, 1));
+
+        awaitPartitionMapExchange();
+
+        checkPartitionsState(assign1, DEFAULT_CACHE_NAME, OWNING);
+
+        checkRebalance(DEFAULT_CACHE_NAME, true);
+    }
+
+    /**
+     * @param assign Assignments.
+     * @param cacheName Cache name.
+     * @param expState Expected state.
+     */
+    private void checkPartitionsState(AffinityAssignment assign, String cacheName, GridDhtPartitionState expState) {
+        for (Ignite node : G.allGrids())
+            checkNodePartitions(assign, node.cluster().localNode(), cacheName, expState);
+    }
+
+    /**
+     * @param assign Assignments.
+     * @param clusterNode Node.
+     * @param cacheName Cache name.
+     * @param expState Expected partitions state.
+     */
+    private void checkNodePartitions(AffinityAssignment assign,
+        ClusterNode clusterNode,
+        String cacheName,
+        GridDhtPartitionState expState)
+    {
+        Affinity<Object> aff = ignite(0).affinity(cacheName);
+
+        Set<Integer> nodeParts = new HashSet<>();
+
+        nodeParts.addAll(assign.primaryPartitions(clusterNode.id()));
+        nodeParts.addAll(assign.backupPartitions(clusterNode.id()));
+
+        log.info("Test state [node=" + clusterNode.id() + ", parts=" + nodeParts.size() + ", state=" + expState + ']');
+
+        if (grid(0).context().discovery().cacheAffinityNode(clusterNode, cacheName))
+            assertFalse(nodeParts.isEmpty());
+
+        boolean check = false;
+
+        for (Ignite node : G.allGrids()) {
+            GridCacheAdapter cache =
+                ((IgniteKernal)node).context().cache().internalCache(cacheName);
+
+            if (cache != null) {
+                check = true;
+
+                GridDhtPartitionTopology top = cache.context().topology();
+
+                GridDhtPartitionMap partsMap = top.partitions(clusterNode.id());
+
+                for (int p = 0; p < aff.partitions(); p++) {
+                    if (nodeParts.contains(p)) {
+                        assertNotNull(partsMap);
+                        assertEquals(expState, partsMap.get(p));
+                    }
+                    else {
+                        if (partsMap != null) {
+                            GridDhtPartitionState state = partsMap.get(p);
+
+                            assertTrue("Unexpected state: " + state, state == null || state == EVICTED);
+                        }
+                    }
+                }
+            }
+            else {
+                assertEquals(0, aff.primaryPartitions(((IgniteKernal)node).localNode()).length);
+                assertEquals(0, aff.backupPartitions(((IgniteKernal)node).localNode()).length);
+            }
+        }
+
+        assertTrue(check);
+    }
+
+    /**
+     * @param cacheName Cache name.
+     * @param expDone Expected rebalance finish flag.
+     */
+    private void checkRebalance(String cacheName, boolean expDone) {
+        for (Ignite node : G.allGrids()) {
+            IgniteKernal node0 = (IgniteKernal)node;
+
+            GridCacheAdapter cache = node0.context().cache().internalCache(cacheName);
+
+            AffinityTopologyVersion topVer = node0.context().cache().context().exchange().readyAffinityVersion();
+
+            if (cache != null)
+                assertEquals(expDone, cache.context().topology().rebalanceFinished(topVer));
+            else
+                node0.context().discovery().cacheAffinityNode(node0.localNode(), cacheName);
+        }
+    }
+
+    /**
+     * @param cacheName Cache name.
+     */
+    private void blockSupplySend(String cacheName) {
+        for (Ignite node : G.allGrids())
+            blockSupplySend(TestRecordingCommunicationSpi.spi(node), cacheName);
+    }
+
+    /**
+     * @param spi SPI.
+     * @param cacheName Cache name.
+     */
+    private void blockSupplySend(TestRecordingCommunicationSpi spi, final String cacheName) {
+        final int grpId = CU.cacheId(cacheName);
+
+        spi.blockMessages(new IgniteBiPredicate<ClusterNode, Message>() {
+            @Override public boolean apply(ClusterNode node, Message msg) {
+                return msg.getClass().equals(GridDhtPartitionSupplyMessage.class) &&
+                    ((GridDhtPartitionSupplyMessage)msg).groupId() == grpId;
+            }
+        });
+    }
+
+    /**
+     *
+     */
+    private void stopBlock() {
+        for (Ignite node : G.allGrids())
+            TestRecordingCommunicationSpi.spi(node).stopBlock();
+    }
+
+    /**
+     * @param name Cache name.
+     * @param backups Backups number.
+     * @return Cache configuration.
+     */
+    private CacheConfiguration cacheConfiguration(String name, int backups) {
+        CacheConfiguration ccfg = new CacheConfiguration(name);
+
+        ccfg.setWriteSynchronizationMode(FULL_SYNC);
+        ccfg.setBackups(backups);
+
+        return ccfg;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/TestCacheNodeExcludingFilter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/TestCacheNodeExcludingFilter.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/TestCacheNodeExcludingFilter.java
new file mode 100644
index 0000000..a3f7d27
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/TestCacheNodeExcludingFilter.java
@@ -0,0 +1,53 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache.distributed;
+
+import java.util.Arrays;
+import java.util.Collection;
+import org.apache.ignite.cluster.ClusterNode;
+import org.apache.ignite.lang.IgnitePredicate;
+
+import static org.apache.ignite.internal.IgniteNodeAttributes.ATTR_IGNITE_INSTANCE_NAME;
+
+/**
+ *
+ */
+public class TestCacheNodeExcludingFilter implements IgnitePredicate<ClusterNode> {
+    /** */
+    private Collection<String> excludeNodes;
+
+    /**
+     * @param excludeNodes Nodes names.
+     */
+    public TestCacheNodeExcludingFilter(Collection<String> excludeNodes) {
+        this.excludeNodes = excludeNodes;
+    }
+    /**
+     * @param excludeNodes Nodes names.
+     */
+    public TestCacheNodeExcludingFilter(String... excludeNodes) {
+        this.excludeNodes = Arrays.asList(excludeNodes);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean apply(ClusterNode clusterNode) {
+        String name = clusterNode.attribute(ATTR_IGNITE_INSTANCE_NAME).toString();
+
+        return !excludeNodes.contains(name);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsCacheRestoreTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsCacheRestoreTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsCacheRestoreTest.java
new file mode 100644
index 0000000..25626f4
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/persistence/db/IgnitePdsCacheRestoreTest.java
@@ -0,0 +1,208 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.cache.persistence.db;
+
+import java.util.Arrays;
+import java.util.List;
+import org.apache.ignite.IgniteCache;
+import org.apache.ignite.configuration.CacheConfiguration;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.MemoryConfiguration;
+import org.apache.ignite.configuration.PersistentStoreConfiguration;
+import org.apache.ignite.configuration.WALMode;
+import org.apache.ignite.spi.discovery.tcp.TcpDiscoverySpi;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.TcpDiscoveryIpFinder;
+import org.apache.ignite.spi.discovery.tcp.ipfinder.vm.TcpDiscoveryVmIpFinder;
+import org.apache.ignite.testframework.GridTestUtils;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+import static org.apache.ignite.cache.CacheWriteSynchronizationMode.FULL_SYNC;
+
+/**
+ *
+ */
+public class IgnitePdsCacheRestoreTest extends GridCommonAbstractTest {
+    /** */
+    private static final TcpDiscoveryIpFinder IP_FINDER = new TcpDiscoveryVmIpFinder(true);
+
+    /** */
+    private CacheConfiguration[] ccfgs;
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        ((TcpDiscoverySpi)cfg.getDiscoverySpi()).setIpFinder(IP_FINDER);
+
+        if (ccfgs != null) {
+            cfg.setCacheConfiguration(ccfgs);
+
+            ccfgs = null;
+        }
+
+        MemoryConfiguration memCfg = new MemoryConfiguration();
+        memCfg.setPageSize(1024);
+        memCfg.setDefaultMemoryPolicySize(10 * 1024 * 1024);
+
+        cfg.setMemoryConfiguration(memCfg);
+
+        PersistentStoreConfiguration pCfg = new PersistentStoreConfiguration();
+
+        pCfg.setWalMode(WALMode.LOG_ONLY);
+
+        cfg.setPersistentStoreConfiguration(pCfg);
+
+        return cfg;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void beforeTest() throws Exception {
+        super.beforeTest();
+
+        GridTestUtils.deleteDbFiles();
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+
+        GridTestUtils.deleteDbFiles();
+
+        super.afterTest();
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testRestoreAndNewCache1() throws Exception {
+        restoreAndNewCache(false);
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testRestoreAndNewCache2() throws Exception {
+        restoreAndNewCache(true);
+    }
+
+    /**
+     * @param createNew If {@code true} need cache is added while node is stopped.
+     * @throws Exception If failed.
+     */
+    private void restoreAndNewCache(boolean createNew) throws Exception {
+        for (int i = 0; i < 3; i++) {
+            ccfgs = configurations1();
+
+            startGrid(i);
+        }
+
+        ignite(0).active(true);
+
+        IgniteCache<Object, Object> cache1 = ignite(2).cache("c1");
+
+        List<Integer> keys = primaryKeys(cache1, 10);
+
+        for (Integer key : keys)
+            cache1.put(key, key);
+
+        stopGrid(2);
+
+        if (createNew) {
+            // New cache is added when node is stopped.
+            ignite(0).getOrCreateCaches(Arrays.asList(configurations2()));
+        }
+        else {
+            // New cache is added on node restart.
+            ccfgs = configurations2();
+        }
+
+        startGrid(2);
+
+        cache1 = ignite(2).cache("c1");
+
+        IgniteCache<Object, Object> cache2 = ignite(2).cache("c2");
+
+        for (Integer key : keys) {
+            assertEquals(key, cache1.get(key));
+
+            assertNull(cache2.get(key));
+
+            cache2.put(key, key);
+
+            assertEquals(key, cache2.get(key));
+        }
+
+        List<Integer> nearKeys = nearKeys(cache1, 10, 0);
+
+        for (Integer key : nearKeys) {
+            assertNull(cache1.get(key));
+            assertNull(cache2.get(key));
+
+            cache2.put(key, key);
+            assertEquals(key, cache2.get(key));
+
+            cache1.put(key, key);
+            assertEquals(key, cache1.get(key));
+        }
+
+        startGrid(3);
+
+        awaitPartitionMapExchange();
+
+        for (Integer key : nearKeys) {
+            assertEquals(key, cache2.get(key));
+
+            assertEquals(key, cache1.get(key));
+        }
+    }
+
+    /**
+     * @return Configurations set 1.
+     */
+    private CacheConfiguration[] configurations1() {
+        CacheConfiguration[] ccfgs = new CacheConfiguration[1];
+
+        ccfgs[0] = cacheConfiguration("c1");
+
+        return ccfgs;
+    }
+
+    /**
+     * @return Configurations set 1.
+     */
+    private CacheConfiguration[] configurations2() {
+        CacheConfiguration[] ccfgs = new CacheConfiguration[2];
+
+        ccfgs[0] = cacheConfiguration("c1");
+        ccfgs[1] = cacheConfiguration("c2");
+
+        return ccfgs;
+    }
+
+    /**
+     * @param name Cache name.
+     * @return Cache configuration.
+     */
+    private CacheConfiguration cacheConfiguration(String name) {
+        CacheConfiguration ccfg = new CacheConfiguration(name);
+
+        ccfg.setWriteSynchronizationMode(FULL_SYNC);
+
+        return ccfg;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java
new file mode 100644
index 0000000..bb32d24
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheTestSuite6.java
@@ -0,0 +1,38 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.testsuites;
+
+import junit.framework.TestSuite;
+import org.apache.ignite.internal.processors.cache.distributed.CachePartitionStateTest;
+
+/**
+ * Test suite.
+ */
+public class IgniteCacheTestSuite6 extends TestSuite {
+    /**
+     * @return IgniteCache test suite.
+     * @throws Exception Thrown in case of the failure.
+     */
+    public static TestSuite suite() throws Exception {
+        TestSuite suite = new TestSuite("IgniteCache Test Suite part 6");
+
+        suite.addTestSuite(CachePartitionStateTest.class);
+
+        return suite;
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/aeb9336b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite.java
index 5b562c3..5762c02 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgnitePdsTestSuite.java
@@ -22,6 +22,7 @@ import org.apache.ignite.internal.processors.cache.IgniteClusterActivateDeactiva
 import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsClientNearCachePutGetTest;
 import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsDynamicCacheTest;
 import org.apache.ignite.internal.processors.cache.persistence.IgnitePdsSingleNodePutGetPersistenceTest;
+import org.apache.ignite.internal.processors.cache.persistence.db.IgnitePdsCacheRestoreTest;
 import org.apache.ignite.internal.processors.cache.persistence.db.file.IgnitePdsCheckpointSimulationWithRealCpDisabledTest;
 import org.apache.ignite.internal.processors.cache.persistence.db.file.IgnitePdsEvictionTest;
 import org.apache.ignite.internal.processors.cache.persistence.pagemem.BPlusTreePageMemoryImplTest;
@@ -74,6 +75,8 @@ public class IgnitePdsTestSuite extends TestSuite {
 
         suite.addTestSuite(IgniteClusterActivateDeactivateTestWithPersistence.class);
 
+        suite.addTestSuite(IgnitePdsCacheRestoreTest.class);
+
         return suite;
     }
 }


[13/50] [abbrv] ignite git commit: IGNITE-5772 - Fixed race between WAL segment rollover and a concurrent log. Closes #2313

Posted by yz...@apache.org.
IGNITE-5772 - Fixed race between WAL segment rollover and a concurrent log. Closes #2313


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

Branch: refs/heads/ignite-5658
Commit: 6de0571c21ffdb77af7bb1d18e9659126d7f321b
Parents: 199b954
Author: Ilya Lantukh <il...@gridgain.com>
Authored: Fri Jul 21 16:35:43 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Fri Jul 21 16:35:43 2017 +0300

----------------------------------------------------------------------
 .../wal/FileWriteAheadLogManager.java           | 93 +++++++++++++-------
 1 file changed, 61 insertions(+), 32 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/6de0571c/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
index 897f903..b655ddf 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/wal/FileWriteAheadLogManager.java
@@ -319,7 +319,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
         try {
             if (mode == WALMode.BACKGROUND) {
                 if (currHnd != null)
-                    currHnd.flush((FileWALPointer)null);
+                    currHnd.flush((FileWALPointer)null, true);
             }
 
             if (currHnd != null)
@@ -526,7 +526,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
             return;
 
         if (mode == WALMode.LOG_ONLY || forceFlush) {
-            cur.flushOrWait(filePtr);
+            cur.flushOrWait(filePtr, false);
 
             return;
         }
@@ -535,7 +535,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
         if (filePtr != null && !cur.needFsync(filePtr))
             return;
 
-        cur.fsync(filePtr);
+        cur.fsync(filePtr, false);
     }
 
     /** {@inheritDoc} */
@@ -1700,12 +1700,29 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
             this.maxSegmentSize = maxSegmentSize;
             this.serializer = serializer;
 
-            head.set(new FakeRecord(new FileWALPointer(idx, (int)pos, 0)));
+            head.set(new FakeRecord(new FileWALPointer(idx, (int)pos, 0), false));
             written = pos;
             lastFsyncPos = pos;
         }
 
         /**
+         * Checks if current head is a close fake record and returns {@code true} if so.
+         *
+         * @return {@code true} if current head is close record.
+         */
+        private boolean stopped() {
+            return stopped(head.get());
+        }
+
+        /**
+         * @param record Record to check.
+         * @return {@code true} if the record is fake close record.
+         */
+        private boolean stopped(WALRecord record) {
+            return record instanceof FakeRecord && ((FakeRecord)record).stop;
+        }
+
+        /**
          * @param rec Record to be added to record chain as new {@link #head}
          * @return Pointer or null if roll over to next segment is required or already started by other thread.
          * @throws StorageException If failed.
@@ -1721,9 +1738,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
 
                 long nextPos = nextPosition(h);
 
-                // It is important that we read `stop` after `head` in this loop for correct close,
-                // because otherwise we will have a race on the last flush in close.
-                if (nextPos + rec.size() >= maxSegmentSize || stop.get()) {
+                if (nextPos + rec.size() >= maxSegmentSize || stopped(h)) {
                     // Can not write to this segment, need to switch to the next one.
                     return null;
                 }
@@ -1731,7 +1746,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
                 int newChainSize = h.chainSize() + rec.size();
 
                 if (newChainSize > tlbSize && !flushed) {
-                    boolean res = h.previous() == null || flush(h);
+                    boolean res = h.previous() == null || flush(h, false);
 
                     if (rec.size() > tlbSize)
                         flushed = res;
@@ -1770,7 +1785,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
          * @param ptr Pointer.
          * @throws IgniteCheckedException If failed.
          */
-        private void flushOrWait(FileWALPointer ptr) throws IgniteCheckedException {
+        private void flushOrWait(FileWALPointer ptr, boolean stop) throws IgniteCheckedException {
             long expWritten;
 
             if (ptr != null) {
@@ -1783,7 +1798,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
             else // We read head position before the flush because otherwise we can get wrong position.
                 expWritten = recordOffset(head.get());
 
-            if (flush(ptr))
+            if (flush(ptr, stop))
                 return;
 
             // Spin-wait for a while before acquiring the lock.
@@ -1810,18 +1825,20 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
          * @throws IgniteCheckedException If failed.
          * @throws StorageException If failed.
          */
-        private boolean flush(FileWALPointer ptr) throws IgniteCheckedException, StorageException {
+        private boolean flush(FileWALPointer ptr, boolean stop) throws IgniteCheckedException, StorageException {
             if (ptr == null) { // Unconditional flush.
                 for (; ; ) {
                     WALRecord expHead = head.get();
 
                     if (expHead.previous() == null) {
-                        assert expHead instanceof FakeRecord;
+                        FakeRecord frHead = (FakeRecord)expHead;
 
-                        return false;
+                        if (frHead.stop == stop || frHead.stop ||
+                            head.compareAndSet(expHead, new FakeRecord(frHead.position(), stop)))
+                            return false;
                     }
 
-                    if (flush(expHead))
+                    if (flush(expHead, stop))
                         return true;
                 }
             }
@@ -1835,7 +1852,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
                 if (chainBeginPosition(h) > ptr.fileOffset())
                     return false;
 
-                if (flush(h))
+                if (flush(h, stop))
                     return true; // We are lucky.
             }
         }
@@ -1853,17 +1870,18 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
          * @throws IgniteCheckedException If failed.
          * @throws StorageException If failed.
          */
-        private boolean flush(WALRecord expHead) throws StorageException, IgniteCheckedException {
+        private boolean flush(WALRecord expHead, boolean stop) throws StorageException, IgniteCheckedException {
             if (expHead.previous() == null) {
-                assert expHead instanceof FakeRecord;
+                FakeRecord frHead = (FakeRecord)expHead;
 
-                return false;
+                if (stop == frHead.stop)
+                    return false;
             }
 
             // Fail-fast before CAS.
             checkEnvironment();
 
-            if (!head.compareAndSet(expHead, new FakeRecord(new FileWALPointer(idx, (int)nextPosition(expHead), 0))))
+            if (!head.compareAndSet(expHead, new FakeRecord(new FileWALPointer(idx, (int)nextPosition(expHead), 0), stop)))
                 return false;
 
             // At this point we grabbed the piece of WAL chain.
@@ -1976,7 +1994,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
          * @param ptr Pointer to sync.
          * @throws StorageException If failed.
          */
-        private void fsync(FileWALPointer ptr) throws StorageException, IgniteCheckedException {
+        private void fsync(FileWALPointer ptr, boolean stop) throws StorageException, IgniteCheckedException {
             lock.lock();
 
             try {
@@ -1984,7 +2002,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
                     if (!needFsync(ptr))
                         return;
 
-                    if (fsyncDelay > 0 && !stop.get()) {
+                    if (fsyncDelay > 0 && !stopped()) {
                         // Delay fsync to collect as many updates as possible: trade latency for throughput.
                         U.await(fsync, fsyncDelay, TimeUnit.NANOSECONDS);
 
@@ -1993,7 +2011,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
                     }
                 }
 
-                flushOrWait(ptr);
+                flushOrWait(ptr, stop);
 
                 if (lastFsyncPos != written) {
                     assert lastFsyncPos < written; // Fsync position must be behind.
@@ -2031,13 +2049,14 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
          * @throws StorageException If failed.
          */
         private boolean close(boolean rollOver) throws IgniteCheckedException, StorageException {
-            if (stop.compareAndSet(false, true)) {
-                // Here we can be sure that no other records will be added and this fsync will be the last.
-                if (mode == WALMode.DEFAULT)
-                    fsync(null);
-                else
-                    flushOrWait(null);
+            if (mode == WALMode.DEFAULT)
+                fsync(null, true);
+            else
+                flushOrWait(null, true);
+
+            assert stopped() : "Segment is not closed after close flush: " + head.get();
 
+            if (stop.compareAndSet(false, true)) {
                 try {
                     int switchSegmentRecSize = RecordV1Serializer.REC_TYPE_SIZE + RecordV1Serializer.FILE_WAL_POINTER_SIZE;
 
@@ -2068,8 +2087,8 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
 
                 return true;
             }
-
-            return false;
+            else
+                return false;
         }
 
         /**
@@ -2271,17 +2290,27 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
      * Fake record is allowed to have no previous record.
      */
     private static final class FakeRecord extends WALRecord {
+        /** */
+        private final boolean stop;
+
         /**
          * @param pos Position.
          */
-        FakeRecord(FileWALPointer pos) {
+        FakeRecord(FileWALPointer pos, boolean stop) {
             position(pos);
+
+            this.stop = stop;
         }
 
         /** {@inheritDoc} */
         @Override public RecordType type() {
             return null;
         }
+
+        /** {@inheritDoc} */
+        @Override public FileWALPointer position() {
+            return (FileWALPointer) super.position();
+        }
     }
 
     /**
@@ -2492,7 +2521,7 @@ public class FileWriteAheadLogManager extends GridCacheSharedManagerAdapter impl
     private void doFlush() {
         final FileWriteHandle hnd = currentHandle();
         try {
-            hnd.flush(hnd.head.get());
+            hnd.flush(hnd.head.get(), false);
         }
         catch (Exception e) {
             U.warn(log, "Failed to flush WAL record queue", e);


[16/50] [abbrv] ignite git commit: IGNITE-5067 - Fixed absolute swap file path handling for memory policy configuration. Fixes #1867

Posted by yz...@apache.org.
IGNITE-5067 - Fixed absolute swap file path handling for memory policy configuration. Fixes #1867


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

Branch: refs/heads/ignite-5658
Commit: 6f749bf4bebb135250a3f99923ed87b4b7d0c29f
Parents: c1a3b37
Author: Sergey Chugunov <se...@gmail.com>
Authored: Fri Jul 21 17:59:10 2017 +0300
Committer: Alexey Goncharuk <al...@gmail.com>
Committed: Fri Jul 21 18:00:40 2017 +0300

----------------------------------------------------------------------
 .../IgniteCacheDatabaseSharedManager.java       |  22 ++-
 .../database/SwapPathConstructionSelfTest.java  | 157 +++++++++++++++++++
 .../ignite/testsuites/IgniteBasicTestSuite.java |   3 +
 3 files changed, 174 insertions(+), 8 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/6f749bf4/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
index eec3b85..e07c51e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/persistence/IgniteCacheDatabaseSharedManager.java
@@ -25,7 +25,6 @@ import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
-import javax.management.JMException;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteLogger;
 import org.apache.ignite.MemoryMetrics;
@@ -204,8 +203,9 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
 
     /**
      * @param memCfg Database config.
+     * @throws IgniteCheckedException If failed to initialize swap path.
      */
-    protected void initPageMemoryPolicies(MemoryConfiguration memCfg) {
+    protected void initPageMemoryPolicies(MemoryConfiguration memCfg) throws IgniteCheckedException {
         MemoryPolicyConfiguration[] memPlcsCfgs = memCfg.getMemoryPolicies();
 
         if (memPlcsCfgs == null) {
@@ -261,12 +261,13 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
      * @param memCfg Database config.
      * @param memPlcCfg Memory policy config.
      * @param memPlcName Memory policy name.
+     * @throws IgniteCheckedException If failed to initialize swap path.
      */
     private void addMemoryPolicy(
         MemoryConfiguration memCfg,
         MemoryPolicyConfiguration memPlcCfg,
         String memPlcName
-    ) {
+    ) throws IgniteCheckedException {
         String dfltMemPlcName = memCfg.getDefaultMemoryPolicyName();
 
         if (dfltMemPlcName == null)
@@ -844,12 +845,14 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
      * @param plcCfg memory policy with PageMemory specific parameters.
      * @param memMetrics {@link MemoryMetrics} object to collect memory usage metrics.
      * @return Memory policy instance.
+     *
+     * @throws IgniteCheckedException If failed to initialize swap path.
      */
     private MemoryPolicy initMemory(
         MemoryConfiguration memCfg,
         MemoryPolicyConfiguration plcCfg,
         MemoryMetricsImpl memMetrics
-    ) {
+    ) throws IgniteCheckedException {
         File allocPath = buildAllocPath(plcCfg);
 
         DirectMemoryProvider memProvider = allocPath == null ?
@@ -892,8 +895,10 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
      * Builds allocation path for memory mapped file to be used with PageMemory.
      *
      * @param plc MemoryPolicyConfiguration.
+     *
+     * @throws IgniteCheckedException If resolving swap directory fails.
      */
-    @Nullable protected File buildAllocPath(MemoryPolicyConfiguration plc) {
+    @Nullable protected File buildAllocPath(MemoryPolicyConfiguration plc) throws IgniteCheckedException {
         String path = plc.getSwapFilePath();
 
         if (path == null)
@@ -938,13 +943,14 @@ public class IgniteCacheDatabaseSharedManager extends GridCacheSharedManagerAdap
      * @param path Path to the working directory.
      * @param consId Consistent ID of the local node.
      * @return DB storage path.
+     *
+     * @throws IgniteCheckedException If resolving swap directory fails.
      */
-    protected File buildPath(String path, String consId) {
+    protected File buildPath(String path, String consId) throws IgniteCheckedException {
         String igniteHomeStr = U.getIgniteHome();
 
-        File igniteHome = igniteHomeStr != null ? new File(igniteHomeStr) : null;
+        File workDir = igniteHomeStr == null ? new File(path) : U.resolveWorkDirectory(igniteHomeStr, path, false);
 
-        File workDir = igniteHome == null ? new File(path) : new File(igniteHome, path);
 
         return new File(workDir, consId);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/6f749bf4/modules/core/src/test/java/org/apache/ignite/internal/processors/database/SwapPathConstructionSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/SwapPathConstructionSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/SwapPathConstructionSelfTest.java
new file mode 100644
index 0000000..53e5daf
--- /dev/null
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/SwapPathConstructionSelfTest.java
@@ -0,0 +1,157 @@
+/*
+ * 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.
+ */
+
+package org.apache.ignite.internal.processors.database;
+
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.Map;
+import org.apache.ignite.configuration.IgniteConfiguration;
+import org.apache.ignite.configuration.MemoryConfiguration;
+import org.apache.ignite.configuration.MemoryPolicyConfiguration;
+import org.apache.ignite.internal.GridKernalContext;
+import org.apache.ignite.internal.IgniteEx;
+import org.apache.ignite.internal.pagemem.PageMemory;
+import org.apache.ignite.internal.processors.cache.persistence.IgniteCacheDatabaseSharedManager;
+import org.apache.ignite.internal.processors.cache.persistence.MemoryPolicy;
+import org.apache.ignite.internal.util.typedef.internal.U;
+import org.apache.ignite.testframework.junits.common.GridCommonAbstractTest;
+
+/**
+ * Test verifies correct construction of swap file path {@link MemoryPolicyConfiguration#setSwapFilePath(String)}
+ * when absolute or relative paths are provided via configuration.
+ */
+public class SwapPathConstructionSelfTest extends GridCommonAbstractTest {
+    /** */
+    private MemoryConfiguration memCfg;
+
+    /** */
+    private static final String RELATIVE_SWAP_PATH = "relSwapPath";
+
+    /** */
+    private static final String ABSOLUTE_SWAP_PATH = "absoluteSwapPath";
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String igniteInstanceName) throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(igniteInstanceName);
+
+        cfg.setMemoryConfiguration(memCfg);
+
+        return cfg;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected void afterTest() throws Exception {
+        stopAllGrids();
+
+        cleanUpSwapDir();
+    }
+
+    /**
+     * Cleans up swap files and directories after test.
+     */
+    private void cleanUpSwapDir() {
+        Path relDir = Paths.get(U.getIgniteHome(), RELATIVE_SWAP_PATH);
+
+        deleteRecursively(relDir.toFile());
+
+        Path absDir = Paths.get(getTmpDir(), ABSOLUTE_SWAP_PATH);
+
+        deleteRecursively(absDir.toFile());
+    }
+
+    /**
+     * Verifies relative swap file path construction. Directory with swap files is cleaned up during after-test phase.
+     */
+    public void testRelativeSwapFilePath() throws Exception {
+        memCfg = createMemoryConfiguration(true);
+
+        IgniteEx ignite = startGrid(0);
+
+        String allocPath = extractDefaultPageMemoryAllocPath(ignite.context());
+
+        assertNotNull(allocPath);
+
+        assertTrue(allocPath.contains(Paths.get(U.getIgniteHome(), RELATIVE_SWAP_PATH).toString()));
+    }
+
+    /**
+     * Verifies absolute swap file path construction. System tmp directory is used to allocate swap files,
+     * so no clean up is needed.
+     */
+    public void testAbsoluteSwapFilePath() throws Exception {
+        memCfg = createMemoryConfiguration(false);
+
+        IgniteEx ignite = startGrid(0);
+
+        String allocPath = extractDefaultPageMemoryAllocPath(ignite.context());
+
+        assertNotNull(allocPath);
+
+        String expectedPath = Paths.get(getTmpDir(), ABSOLUTE_SWAP_PATH).toString();
+
+        assertTrue("Expected path: "
+                        + expectedPath
+                        + "; actual path: "
+                        + allocPath,
+                allocPath.startsWith(expectedPath));
+    }
+
+    /**
+     * @param context Context.
+     */
+    private String extractDefaultPageMemoryAllocPath(GridKernalContext context) {
+        IgniteCacheDatabaseSharedManager dbMgr = context.cache().context().database();
+
+        Map<String, MemoryPolicy> memPlcMap = U.field(dbMgr, "memPlcMap");
+
+        PageMemory pageMem = memPlcMap.get("default").pageMemory();
+
+        Object memProvider = U.field(pageMem, "directMemoryProvider");
+
+        return ((File) U.field(memProvider, "allocationPath")).getAbsolutePath();
+    }
+
+    /**
+     * @param isRelativePath flag is set to {@code true} if relative path should be used for memory policy configuration.
+     */
+    private MemoryConfiguration createMemoryConfiguration(boolean isRelativePath) {
+        MemoryConfiguration memCfg = new MemoryConfiguration();
+
+        MemoryPolicyConfiguration memPlcCfg = new MemoryPolicyConfiguration();
+
+        memPlcCfg.setName("default");
+        memPlcCfg.setMaxSize(20 * 1024 * 1024);
+
+        if (isRelativePath)
+            memPlcCfg.setSwapFilePath(RELATIVE_SWAP_PATH);
+        else
+            memPlcCfg.setSwapFilePath(Paths.get(getTmpDir(), ABSOLUTE_SWAP_PATH).toString());
+
+        memCfg.setMemoryPolicies(memPlcCfg);
+
+        return memCfg;
+    }
+
+    /**
+     *
+     */
+    private String getTmpDir() {
+        return System.getProperty("java.io.tmpdir");
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/6f749bf4/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
index d79e868..2ec2c74 100644
--- a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
+++ b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteBasicTestSuite.java
@@ -20,6 +20,8 @@ package org.apache.ignite.testsuites;
 import java.util.Set;
 import junit.framework.TestSuite;
 import org.apache.ignite.GridSuppressedExceptionSelfTest;
+import org.apache.ignite.internal.processors.database.SwapPathConstructionSelfTest;
+import org.apache.ignite.util.AttributeNodeFilterSelfTest;
 import org.apache.ignite.internal.ClusterGroupHostsSelfTest;
 import org.apache.ignite.internal.ClusterGroupSelfTest;
 import org.apache.ignite.internal.GridFailFastNodeFailureDetectionSelfTest;
@@ -173,6 +175,7 @@ public class IgniteBasicTestSuite extends TestSuite {
         suite.addTestSuite(MetadataStorageSelfTest.class);
         suite.addTestSuite(FreeListImplSelfTest.class);
         suite.addTestSuite(MemoryMetricsSelfTest.class);
+        suite.addTestSuite(SwapPathConstructionSelfTest.class);
 
         suite.addTestSuite(IgniteMarshallerCacheFSRestoreTest.class);
         suite.addTestSuite(IgniteMarshallerCacheClassNameConflictTest.class);


[11/50] [abbrv] ignite git commit: Merge remote-tracking branch 'origin/master'

Posted by yz...@apache.org.
Merge remote-tracking branch 'origin/master'


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

Branch: refs/heads/ignite-5658
Commit: 0adaf6e4a04fa6405a5596e583e760871e1092dd
Parents: 48f2994 0d2b989
Author: Anton Vinogradov <av...@apache.org>
Authored: Fri Jul 21 15:31:28 2017 +0300
Committer: Anton Vinogradov <av...@apache.org>
Committed: Fri Jul 21 15:31:28 2017 +0300

----------------------------------------------------------------------
 .../apache/ignite/ml/math/DistanceMeasure.java  |   2 +-
 .../ignite/ml/math/EuclideanDistance.java       |   3 +-
 .../math/decompositions/EigenDecomposition.java |   2 +-
 .../apache/ignite/ml/math/impls/CacheUtils.java | 198 +++++++--
 .../ml/math/impls/matrix/AbstractMatrix.java    |   4 +-
 .../ignite/ml/math/impls/matrix/BlockEntry.java |  50 +++
 .../ml/math/impls/matrix/CacheMatrix.java       |   9 +-
 .../matrix/SparseBlockDistributedMatrix.java    | 208 +++++++++
 .../impls/matrix/SparseDistributedMatrix.java   |  26 +-
 .../storage/matrix/BaseBlockMatrixKey.java      |  41 ++
 .../impls/storage/matrix/BlockMatrixKey.java    | 144 ++++++
 .../storage/matrix/BlockMatrixStorage.java      | 435 +++++++++++++++++++
 .../vector/SparseLocalOnHeapVectorStorage.java  |   4 +-
 .../ignite/ml/math/statistics/Variance.java     |   1 +
 .../ignite/ml/math/statistics/package-info.java |  22 +
 .../org/apache/ignite/ml/math/util/MapUtil.java |   2 +-
 .../ignite/ml/math/util/package-info.java       |  22 +
 .../java/org/apache/ignite/ml/package-info.java |  22 +
 .../ml/math/MathImplDistributedTestSuite.java   |   2 +
 .../SparseDistributedBlockMatrixTest.java       | 379 ++++++++++++++++
 .../matrix/SparseDistributedMatrixTest.java     |  32 +-
 21 files changed, 1528 insertions(+), 80 deletions(-)
----------------------------------------------------------------------



[38/50] [abbrv] ignite git commit: Added related GridIoPolicy in IgniteThread.

Posted by yz...@apache.org.
Added related GridIoPolicy in IgniteThread.


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

Branch: refs/heads/ignite-5658
Commit: 3a3650fb2eadcd6a1186cc186fa5d471cd1e74d5
Parents: 2574beb
Author: sboikov <sb...@gridgain.com>
Authored: Thu Jul 27 13:57:11 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Thu Jul 27 13:57:11 2017 +0300

----------------------------------------------------------------------
 .../org/apache/ignite/internal/IgnitionEx.java  | 34 +++++++++++++------
 .../managers/communication/GridIoPolicy.java    |  3 ++
 .../service/GridServiceProcessor.java           |  2 +-
 .../util/StripedCompositeReadWriteLock.java     |  6 ++--
 .../ignite/internal/util/StripedExecutor.java   |  4 ++-
 .../org/apache/ignite/thread/IgniteThread.java  | 35 ++++++++++----------
 .../ignite/thread/IgniteThreadFactory.java      | 15 ++++++---
 .../ignite/thread/IgniteThreadPoolExecutor.java | 33 +++++++++++++++++-
 .../GridThreadPoolExecutorServiceSelfTest.java  |  2 +-
 9 files changed, 95 insertions(+), 39 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/3a3650fb/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
index 1139ec6..23baeb3 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/IgnitionEx.java
@@ -64,6 +64,7 @@ import org.apache.ignite.configuration.IgniteConfiguration;
 import org.apache.ignite.configuration.MemoryConfiguration;
 import org.apache.ignite.configuration.TransactionConfiguration;
 import org.apache.ignite.internal.binary.BinaryMarshaller;
+import org.apache.ignite.internal.managers.communication.GridIoPolicy;
 import org.apache.ignite.internal.processors.datastructures.DataStructuresProcessor;
 import org.apache.ignite.internal.processors.igfs.IgfsThreadFactory;
 import org.apache.ignite.internal.processors.igfs.IgfsUtils;
@@ -1694,7 +1695,8 @@ public class IgnitionEx {
                 cfg.getPublicThreadPoolSize(),
                 cfg.getPublicThreadPoolSize(),
                 DFLT_THREAD_KEEP_ALIVE_TIME,
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<Runnable>(),
+                GridIoPolicy.PUBLIC_POOL);
 
             execSvc.allowCoreThreadTimeOut(true);
 
@@ -1706,7 +1708,8 @@ public class IgnitionEx {
                 cfg.getServiceThreadPoolSize(),
                 cfg.getServiceThreadPoolSize(),
                 DFLT_THREAD_KEEP_ALIVE_TIME,
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<Runnable>(),
+                GridIoPolicy.SERVICE_POOL);
 
             svcExecSvc.allowCoreThreadTimeOut(true);
 
@@ -1718,7 +1721,8 @@ public class IgnitionEx {
                 cfg.getSystemThreadPoolSize(),
                 cfg.getSystemThreadPoolSize(),
                 DFLT_THREAD_KEEP_ALIVE_TIME,
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<Runnable>(),
+                GridIoPolicy.SYSTEM_POOL);
 
             sysExecSvc.allowCoreThreadTimeOut(true);
 
@@ -1738,7 +1742,8 @@ public class IgnitionEx {
                 cfg.getManagementThreadPoolSize(),
                 cfg.getManagementThreadPoolSize(),
                 DFLT_THREAD_KEEP_ALIVE_TIME,
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<Runnable>(),
+                GridIoPolicy.MANAGEMENT_POOL);
 
             mgmtExecSvc.allowCoreThreadTimeOut(true);
 
@@ -1753,7 +1758,8 @@ public class IgnitionEx {
                 cfg.getPeerClassLoadingThreadPoolSize(),
                 cfg.getPeerClassLoadingThreadPoolSize(),
                 DFLT_THREAD_KEEP_ALIVE_TIME,
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<Runnable>(),
+                GridIoPolicy.P2P_POOL);
 
             p2pExecSvc.allowCoreThreadTimeOut(true);
 
@@ -1764,7 +1770,8 @@ public class IgnitionEx {
                 cfg.getDataStreamerThreadPoolSize(),
                 cfg.getDataStreamerThreadPoolSize(),
                 DFLT_THREAD_KEEP_ALIVE_TIME,
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<Runnable>(),
+                GridIoPolicy.DATA_STREAMER_POOL);
 
             dataStreamerExecSvc.allowCoreThreadTimeOut(true);
 
@@ -1811,7 +1818,8 @@ public class IgnitionEx {
                 myCfg.getUtilityCacheThreadPoolSize(),
                 myCfg.getUtilityCacheThreadPoolSize(),
                 myCfg.getUtilityCacheKeepAliveTime(),
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<Runnable>(),
+                GridIoPolicy.UTILITY_CACHE_POOL);
 
             utilityCacheExecSvc.allowCoreThreadTimeOut(true);
 
@@ -1821,7 +1829,8 @@ public class IgnitionEx {
                 1,
                 1,
                 DFLT_THREAD_KEEP_ALIVE_TIME,
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<Runnable>(),
+                GridIoPolicy.AFFINITY_POOL);
 
             affExecSvc.allowCoreThreadTimeOut(true);
 
@@ -1834,7 +1843,8 @@ public class IgnitionEx {
                     cpus,
                     cpus * 2,
                     3000L,
-                    new LinkedBlockingQueue<Runnable>(1000)
+                    new LinkedBlockingQueue<Runnable>(1000),
+                    GridIoPolicy.IDX_POOL
                 );
             }
 
@@ -1846,7 +1856,8 @@ public class IgnitionEx {
                 cfg.getQueryThreadPoolSize(),
                 cfg.getQueryThreadPoolSize(),
                 DFLT_THREAD_KEEP_ALIVE_TIME,
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<Runnable>(),
+                GridIoPolicy.QUERY_POOL);
 
             qryExecSvc.allowCoreThreadTimeOut(true);
 
@@ -1856,7 +1867,8 @@ public class IgnitionEx {
                 2,
                 2,
                 DFLT_THREAD_KEEP_ALIVE_TIME,
-                new LinkedBlockingQueue<Runnable>());
+                new LinkedBlockingQueue<Runnable>(),
+                GridIoPolicy.SCHEMA_POOL);
 
             schemaExecSvc.allowCoreThreadTimeOut(true);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a3650fb/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoPolicy.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoPolicy.java b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoPolicy.java
index 13bc4c4..3f31f92 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoPolicy.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/managers/communication/GridIoPolicy.java
@@ -22,6 +22,9 @@ package org.apache.ignite.internal.managers.communication;
  * message processing by the communication manager.
  */
 public class GridIoPolicy {
+    /** */
+    public static final byte UNDEFINED = -1;
+
     /** Public execution pool. */
     public static final byte PUBLIC_POOL = 0;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a3650fb/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
index db632ec..46fcfea 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/service/GridServiceProcessor.java
@@ -153,7 +153,7 @@ public class GridServiceProcessor extends GridProcessorAdapter implements Ignite
     private volatile GridSpinBusyLock busyLock = new GridSpinBusyLock();
 
     /** Thread factory. */
-    private ThreadFactory threadFactory = new IgniteThreadFactory(ctx.igniteInstanceName());
+    private ThreadFactory threadFactory = new IgniteThreadFactory(ctx.igniteInstanceName(), "service");
 
     /** Thread local for service name. */
     private ThreadLocal<String> svcName = new ThreadLocal<>();

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a3650fb/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java b/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
index e215663..18ef06c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/StripedCompositeReadWriteLock.java
@@ -67,8 +67,10 @@ public class StripedCompositeReadWriteLock implements ReadWriteLock {
     @NotNull @Override public Lock readLock() {
         int idx;
 
-        if (Thread.currentThread() instanceof IgniteThread) {
-            IgniteThread igniteThread = (IgniteThread)Thread.currentThread();
+        Thread curThread = Thread.currentThread();
+
+        if (curThread instanceof IgniteThread) {
+            IgniteThread igniteThread = (IgniteThread)curThread;
 
             idx = igniteThread.compositeRwLockIndex();
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a3650fb/modules/core/src/main/java/org/apache/ignite/internal/util/StripedExecutor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/StripedExecutor.java b/modules/core/src/main/java/org/apache/ignite/internal/util/StripedExecutor.java
index 6c85b32..6d5dc71 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/StripedExecutor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/StripedExecutor.java
@@ -35,6 +35,7 @@ import java.util.concurrent.TimeoutException;
 import java.util.concurrent.locks.LockSupport;
 import org.apache.ignite.IgniteInterruptedException;
 import org.apache.ignite.IgniteLogger;
+import org.apache.ignite.internal.managers.communication.GridIoPolicy;
 import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.typedef.internal.U;
@@ -439,7 +440,8 @@ public class StripedExecutor implements ExecutorService {
                 poolName + "-stripe-" + idx,
                 this,
                 IgniteThread.GRP_IDX_UNASSIGNED,
-                idx);
+                idx,
+                GridIoPolicy.UNDEFINED);
 
             thread.start();
         }

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a3650fb/modules/core/src/main/java/org/apache/ignite/thread/IgniteThread.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThread.java b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThread.java
index 6005ac9..c814625 100644
--- a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThread.java
+++ b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThread.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.thread;
 
 import java.util.concurrent.atomic.AtomicLong;
+import org.apache.ignite.internal.managers.communication.GridIoPolicy;
 import org.apache.ignite.internal.util.typedef.internal.A;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.apache.ignite.internal.util.worker.GridWorker;
@@ -52,13 +53,16 @@ public class IgniteThread extends Thread {
     /** */
     private final int stripe;
 
+    /** */
+    private final byte plc;
+
     /**
      * Creates thread with given worker.
      *
      * @param worker Runnable to create thread with.
      */
     public IgniteThread(GridWorker worker) {
-        this(DFLT_GRP, worker.igniteInstanceName(), worker.name(), worker, GRP_IDX_UNASSIGNED, -1);
+        this(worker.igniteInstanceName(), worker.name(), worker, GRP_IDX_UNASSIGNED, -1, GridIoPolicy.UNDEFINED);
     }
 
     /**
@@ -69,41 +73,28 @@ public class IgniteThread extends Thread {
      * @param r Runnable to execute.
      */
     public IgniteThread(String igniteInstanceName, String threadName, Runnable r) {
-        this(igniteInstanceName, threadName, r, GRP_IDX_UNASSIGNED, -1);
-    }
-
-    /**
-     * Creates grid thread with given name for a given Ignite instance.
-     *
-     * @param igniteInstanceName Name of the Ignite instance this thread is created for.
-     * @param threadName Name of thread.
-     * @param r Runnable to execute.
-     * @param grpIdx Index within a group.
-     * @param stripe Non-negative stripe number if this thread is striped pool thread.
-     */
-    public IgniteThread(String igniteInstanceName, String threadName, Runnable r, int grpIdx, int stripe) {
-        this(DFLT_GRP, igniteInstanceName, threadName, r, grpIdx, stripe);
+        this(igniteInstanceName, threadName, r, GRP_IDX_UNASSIGNED, -1, GridIoPolicy.UNDEFINED);
     }
 
     /**
      * Creates grid thread with given name for a given Ignite instance with specified
      * thread group.
      *
-     * @param grp Thread group.
      * @param igniteInstanceName Name of the Ignite instance this thread is created for.
      * @param threadName Name of thread.
      * @param r Runnable to execute.
      * @param grpIdx Thread index within a group.
      * @param stripe Non-negative stripe number if this thread is striped pool thread.
      */
-    public IgniteThread(ThreadGroup grp, String igniteInstanceName, String threadName, Runnable r, int grpIdx, int stripe) {
-        super(grp, r, createName(cntr.incrementAndGet(), threadName, igniteInstanceName));
+    public IgniteThread(String igniteInstanceName, String threadName, Runnable r, int grpIdx, int stripe, byte plc) {
+        super(DFLT_GRP, r, createName(cntr.incrementAndGet(), threadName, igniteInstanceName));
 
         A.ensure(grpIdx >= -1, "grpIdx >= -1");
 
         this.igniteInstanceName = igniteInstanceName;
         this.compositeRwLockIdx = grpIdx;
         this.stripe = stripe;
+        this.plc = plc;
     }
 
     /**
@@ -117,6 +108,14 @@ public class IgniteThread extends Thread {
         this.igniteInstanceName = igniteInstanceName;
         this.compositeRwLockIdx = GRP_IDX_UNASSIGNED;
         this.stripe = -1;
+        this.plc = GridIoPolicy.UNDEFINED;
+    }
+
+    /**
+     * @return Related {@link GridIoPolicy} for internal Ignite pools.
+     */
+    public byte policy() {
+        return plc;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a3650fb/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
index d2f0b15..062c973 100644
--- a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
+++ b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadFactory.java
@@ -20,6 +20,7 @@ package org.apache.ignite.thread;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.atomic.AtomicInteger;
 
+import org.apache.ignite.internal.managers.communication.GridIoPolicy;
 import org.apache.ignite.internal.util.typedef.internal.S;
 import org.jetbrains.annotations.NotNull;
 
@@ -37,14 +38,18 @@ public class IgniteThreadFactory implements ThreadFactory {
     /** Index generator for threads. */
     private final AtomicInteger idxGen = new AtomicInteger();
 
+    /** */
+    private final byte plc;
+
     /**
      * Constructs new thread factory for given grid. All threads will belong
      * to the same default thread group.
      *
      * @param igniteInstanceName Ignite instance name.
+     * @param threadName Thread name.
      */
-    public IgniteThreadFactory(String igniteInstanceName) {
-        this(igniteInstanceName, "ignite");
+    public IgniteThreadFactory(String igniteInstanceName, String threadName) {
+        this(igniteInstanceName, threadName, GridIoPolicy.UNDEFINED);
     }
 
     /**
@@ -53,15 +58,17 @@ public class IgniteThreadFactory implements ThreadFactory {
      *
      * @param igniteInstanceName Ignite instance name.
      * @param threadName Thread name.
+     * @param plc {@link GridIoPolicy} for thread pool.
      */
-    public IgniteThreadFactory(String igniteInstanceName, String threadName) {
+    public IgniteThreadFactory(String igniteInstanceName, String threadName, byte plc) {
         this.igniteInstanceName = igniteInstanceName;
         this.threadName = threadName;
+        this.plc = plc;
     }
 
     /** {@inheritDoc} */
     @Override public Thread newThread(@NotNull Runnable r) {
-        return new IgniteThread(igniteInstanceName, threadName, r, idxGen.incrementAndGet(), -1);
+        return new IgniteThread(igniteInstanceName, threadName, r, idxGen.incrementAndGet(), -1, plc);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a3650fb/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
index 639ef94..83c64c3 100644
--- a/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
+++ b/modules/core/src/main/java/org/apache/ignite/thread/IgniteThreadPoolExecutor.java
@@ -22,6 +22,7 @@ import java.util.concurrent.ExecutorService;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
+import org.apache.ignite.internal.managers.communication.GridIoPolicy;
 
 /**
  * An {@link ExecutorService} that executes submitted tasks using pooled grid threads.
@@ -46,13 +47,43 @@ public class IgniteThreadPoolExecutor extends ThreadPoolExecutor {
         int maxPoolSize,
         long keepAliveTime,
         BlockingQueue<Runnable> workQ) {
+        this(threadNamePrefix,
+            igniteInstanceName,
+            corePoolSize,
+            maxPoolSize,
+            keepAliveTime,
+            workQ,
+            GridIoPolicy.UNDEFINED);
+    }
+
+    /**
+     * Creates a new service with the given initial parameters.
+     *
+     * @param threadNamePrefix Will be added at the beginning of all created threads.
+     * @param igniteInstanceName Must be the name of the grid.
+     * @param corePoolSize The number of threads to keep in the pool, even if they are idle.
+     * @param maxPoolSize The maximum number of threads to allow in the pool.
+     * @param keepAliveTime When the number of threads is greater than the core, this is the maximum time
+     *      that excess idle threads will wait for new tasks before terminating.
+     * @param workQ The queue to use for holding tasks before they are executed. This queue will hold only
+     *      runnable tasks submitted by the {@link #execute(Runnable)} method.
+     * @param plc {@link GridIoPolicy} for thread pool.
+     */
+    public IgniteThreadPoolExecutor(
+        String threadNamePrefix,
+        String igniteInstanceName,
+        int corePoolSize,
+        int maxPoolSize,
+        long keepAliveTime,
+        BlockingQueue<Runnable> workQ,
+        byte plc) {
         super(
             corePoolSize,
             maxPoolSize,
             keepAliveTime,
             TimeUnit.MILLISECONDS,
             workQ,
-            new IgniteThreadFactory(igniteInstanceName, threadNamePrefix)
+            new IgniteThreadFactory(igniteInstanceName, threadNamePrefix, plc)
         );
     }
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/3a3650fb/modules/core/src/test/java/org/apache/ignite/thread/GridThreadPoolExecutorServiceSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/thread/GridThreadPoolExecutorServiceSelfTest.java b/modules/core/src/test/java/org/apache/ignite/thread/GridThreadPoolExecutorServiceSelfTest.java
index 3948f6a..dce6328 100644
--- a/modules/core/src/test/java/org/apache/ignite/thread/GridThreadPoolExecutorServiceSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/thread/GridThreadPoolExecutorServiceSelfTest.java
@@ -64,7 +64,7 @@ public class GridThreadPoolExecutorServiceSelfTest extends GridCommonAbstractTes
      * @throws Exception If failed.
      */
     public void testSingleGridThreadExecutor() throws Exception {
-        ExecutorService exec = Executors.newSingleThreadExecutor(new IgniteThreadFactory("gridName"));
+        ExecutorService exec = Executors.newSingleThreadExecutor(new IgniteThreadFactory("gridName", "testThread"));
 
         exec.submit(new InterruptingRunnable()).get();
 


[28/50] [abbrv] ignite git commit: IGNITE-5770 Refactor PlatformProcessor to PlatformTarget mechanism

Posted by yz...@apache.org.
http://git-wip-us.apache.org/repos/asf/ignite/blob/bdc9e4b9/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 f76bbac..a38cf2f 100644
--- a/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs
+++ b/modules/platforms/dotnet/Apache.Ignite.Core/Impl/Unmanaged/UnmanagedUtils.cs
@@ -93,12 +93,9 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
 
                 try
                 {
-                    // OnStart receives the same InteropProcessor as here (just as another GlobalRef) and stores it.
-                    // Release current reference immediately.
-                    void* res = JNI.IgnitionStart(ctx.NativeContext, cfgPath0, gridName0, InteropFactoryId,
+                    // OnStart receives InteropProcessor referece and stores it.
+                    JNI.IgnitionStart(ctx.NativeContext, cfgPath0, gridName0, InteropFactoryId,
                         mem.SynchronizeOutput());
-
-                    JNI.Release(res);
                 }
                 finally
                 {
@@ -122,304 +119,6 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
             }
         }
 
-        internal static void IgnitionStopAll(void* ctx, bool cancel)
-        {
-            JNI.IgnitionStopAll(ctx, cancel);
-        }
-
-        internal static void ProcessorReleaseStart(IUnmanagedTarget target)
-        {
-            JNI.ProcessorReleaseStart(target.Context, target.Target);
-        }
-
-        internal static IUnmanagedTarget ProcessorProjection(IUnmanagedTarget target)
-        {
-            void* res = JNI.ProcessorProjection(target.Context, target.Target);
-
-            return target.ChangeTarget(res);
-        }
-
-        internal static IUnmanagedTarget ProcessorCache(IUnmanagedTarget target, string name)
-        {
-            sbyte* name0 = IgniteUtils.StringToUtf8Unmanaged(name);
-
-            try
-            {
-                void* res = JNI.ProcessorCache(target.Context, target.Target, name0);
-
-                return target.ChangeTarget(res);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(name0));
-            }
-        }
-
-        internal static IUnmanagedTarget ProcessorCreateCache(IUnmanagedTarget target, string name)
-        {
-            sbyte* name0 = IgniteUtils.StringToUtf8Unmanaged(name);
-
-            try
-            {
-                void* res = JNI.ProcessorCreateCache(target.Context, target.Target, name0);
-
-                return target.ChangeTarget(res);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(name0));
-            }
-        }
-
-        internal static IUnmanagedTarget ProcessorCreateCache(IUnmanagedTarget target, long memPtr)
-        {
-            void* res = JNI.ProcessorCreateCacheFromConfig(target.Context, target.Target, memPtr);
-
-            return target.ChangeTarget(res);
-        }
-
-        internal static IUnmanagedTarget ProcessorGetOrCreateCache(IUnmanagedTarget target, string name)
-        {
-            sbyte* name0 = IgniteUtils.StringToUtf8Unmanaged(name);
-
-            try
-            {
-                void* res = JNI.ProcessorGetOrCreateCache(target.Context, target.Target, name0);
-
-                return target.ChangeTarget(res);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(name0));
-            }
-        }
-
-        internal static IUnmanagedTarget ProcessorGetOrCreateCache(IUnmanagedTarget target, long memPtr)
-        {
-            void* res = JNI.ProcessorGetOrCreateCacheFromConfig(target.Context, target.Target, memPtr);
-
-            return target.ChangeTarget(res);
-        }
-
-        internal static IUnmanagedTarget ProcessorCreateNearCache(IUnmanagedTarget target, string name, long memPtr)
-        {
-            sbyte* name0 = IgniteUtils.StringToUtf8Unmanaged(name);
-
-            try
-            {
-                void* res = JNI.ProcessorCreateNearCache(target.Context, target.Target, name0, memPtr);
-
-                return target.ChangeTarget(res);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(name0));
-            }
-        }
-
-        internal static IUnmanagedTarget ProcessorGetOrCreateNearCache(IUnmanagedTarget target, string name, long memPtr)
-        {
-            sbyte* name0 = IgniteUtils.StringToUtf8Unmanaged(name);
-
-            try
-            {
-                void* res = JNI.ProcessorGetOrCreateNearCache(target.Context, target.Target, name0, memPtr);
-
-                return target.ChangeTarget(res);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(name0));
-            }
-        }
-
-        internal static void ProcessorDestroyCache(IUnmanagedTarget target, string name)
-        {
-            sbyte* name0 = IgniteUtils.StringToUtf8Unmanaged(name);
-
-            try
-            {
-                JNI.ProcessorDestroyCache(target.Context, target.Target, name0);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(name0));
-            }
-        }
-
-        internal static IUnmanagedTarget ProcessorAffinity(IUnmanagedTarget target, string name)
-        {
-            sbyte* name0 = IgniteUtils.StringToUtf8Unmanaged(name);
-
-            try
-            {
-                void* res = JNI.ProcessorAffinity(target.Context, target.Target, name0);
-
-                return target.ChangeTarget(res);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(name0));
-            }
-        }
-
-        internal static IUnmanagedTarget ProcessorDataStreamer(IUnmanagedTarget target, string name, bool keepBinary)
-        {
-            sbyte* name0 = IgniteUtils.StringToUtf8Unmanaged(name);
-
-            try
-            {
-                void* res = JNI.ProcessorDataStreamer(target.Context, target.Target, name0, keepBinary);
-
-                return target.ChangeTarget(res);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(name0));
-            }
-        }
-        
-        internal static IUnmanagedTarget ProcessorTransactions(IUnmanagedTarget target)
-        {
-            void* res = JNI.ProcessorTransactions(target.Context, target.Target);
-
-            return target.ChangeTarget(res);
-        }
-
-        internal static IUnmanagedTarget ProcessorCompute(IUnmanagedTarget target, IUnmanagedTarget prj)
-        {
-            void* res = JNI.ProcessorCompute(target.Context, target.Target, prj.Target);
-
-            return target.ChangeTarget(res);
-        }
-
-        internal static IUnmanagedTarget ProcessorMessage(IUnmanagedTarget target, IUnmanagedTarget prj)
-        {
-            void* res = JNI.ProcessorMessage(target.Context, target.Target, prj.Target);
-
-            return target.ChangeTarget(res);
-        }
-
-        internal static IUnmanagedTarget ProcessorEvents(IUnmanagedTarget target, IUnmanagedTarget prj)
-        {
-            void* res = JNI.ProcessorEvents(target.Context, target.Target, prj.Target);
-
-            return target.ChangeTarget(res);
-        }
-
-        internal static IUnmanagedTarget ProcessorServices(IUnmanagedTarget target, IUnmanagedTarget prj)
-        {
-            void* res = JNI.ProcessorServices(target.Context, target.Target, prj.Target);
-
-            return target.ChangeTarget(res);
-        }
-
-        internal static IUnmanagedTarget ProcessorExtensions(IUnmanagedTarget target)
-        {
-            void* res = JNI.ProcessorExtensions(target.Context, target.Target);
-
-            return target.ChangeTarget(res);
-        }
-
-        internal static IUnmanagedTarget ProcessorExtension(IUnmanagedTarget target, int id)
-        {
-            void* res = JNI.ProcessorExtension(target.Context, target.Target, id);
-
-            return target.ChangeTarget(res);
-        }
-
-        internal static IUnmanagedTarget ProcessorAtomicLong(IUnmanagedTarget target, string name, long initialValue, 
-            bool create)
-        {
-            var name0 = IgniteUtils.StringToUtf8Unmanaged(name);
-
-            try
-            {
-                var res = JNI.ProcessorAtomicLong(target.Context, target.Target, name0, initialValue, create);
-
-                return res == null ? null : target.ChangeTarget(res);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(name0));
-            }
-        }
-
-        internal static IUnmanagedTarget ProcessorAtomicSequence(IUnmanagedTarget target, string name, long initialValue, 
-            bool create)
-        {
-            var name0 = IgniteUtils.StringToUtf8Unmanaged(name);
-
-            try
-            {
-                var res = JNI.ProcessorAtomicSequence(target.Context, target.Target, name0, initialValue, create);
-
-                return res == null ? null : target.ChangeTarget(res);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(name0));
-            }
-        }
-
-        internal static IUnmanagedTarget ProcessorAtomicReference(IUnmanagedTarget target, string name, long memPtr, 
-            bool create)
-        {
-            var name0 = IgniteUtils.StringToUtf8Unmanaged(name);
-
-            try
-            {
-                var res = JNI.ProcessorAtomicReference(target.Context, target.Target, name0, memPtr, create);
-
-                return res == null ? null : target.ChangeTarget(res);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(name0));
-            }
-        }
-
-        internal static void ProcessorGetIgniteConfiguration(IUnmanagedTarget target, long memPtr)
-        {
-            JNI.ProcessorGetIgniteConfiguration(target.Context, target.Target, memPtr);
-        }
-
-        internal static void ProcessorGetCacheNames(IUnmanagedTarget target, long memPtr)
-        {
-            JNI.ProcessorGetCacheNames(target.Context, target.Target, memPtr);
-        }
-
-        internal static bool ProcessorLoggerIsLevelEnabled(IUnmanagedTarget target, int level)
-        {
-            return JNI.ProcessorLoggerIsLevelEnabled(target.Context, target.Target, level);
-        }
-
-        internal static void ProcessorLoggerLog(IUnmanagedTarget target, int level, string message, string category,
-            string errorInfo)
-        {
-            var message0 = IgniteUtils.StringToUtf8Unmanaged(message);
-            var category0 = IgniteUtils.StringToUtf8Unmanaged(category);
-            var errorInfo0 = IgniteUtils.StringToUtf8Unmanaged(errorInfo);
-
-            try
-            {
-                JNI.ProcessorLoggerLog(target.Context, target.Target, level, message0, category0, errorInfo0);
-            }
-            finally
-            {
-                Marshal.FreeHGlobal(new IntPtr(message0));
-                Marshal.FreeHGlobal(new IntPtr(category0));
-                Marshal.FreeHGlobal(new IntPtr(errorInfo0));
-            }
-        }
-
-        internal static IUnmanagedTarget ProcessorBinaryProcessor(IUnmanagedTarget target)
-        {
-            void* res = JNI.ProcessorBinaryProcessor(target.Context, target.Target);
-
-            return target.ChangeTarget(res);
-        }
-
         #endregion
 
         #region NATIVE METHODS: TARGET
@@ -443,6 +142,9 @@ namespace Apache.Ignite.Core.Impl.Unmanaged
         {
             void* res = JNI.TargetInStreamOutObject(target.Context, target.Target, opType, inMemPtr);
 
+            if (res == null)
+                return null;
+
             return target.ChangeTarget(res);
         }