# ignite-51

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

Branch: refs/heads/ignite-51
Commit: 416f6375b2da915b15e6e491814e782b7d666bbe
Parents: eb251dd
Author: sboikov <semen.boi...@inria.fr>
Authored: Fri Feb 27 22:26:56 2015 +0300
Committer: sboikov <semen.boi...@inria.fr>
Committed: Sat Feb 28 01:18:56 2015 +0300

----------------------------------------------------------------------
 .../internal/managers/GridManagerAdapter.java   |  2 +-
 .../affinity/GridAffinityAssignmentCache.java   | 10 +--
 .../processors/cache/CacheObjectAdapter.java    | 68 +++++++++++++++
 .../processors/cache/CacheObjectImpl.java       | 59 ++++---------
 .../processors/cache/GridCacheAdapter.java      | 23 +++---
 .../processors/cache/GridCacheContext.java      |  6 +-
 .../processors/cache/GridCacheStoreManager.java | 20 ++---
 .../processors/cache/GridCacheSwapManager.java  | 10 +--
 .../processors/cache/KeyCacheObject.java        |  3 +
 .../processors/cache/KeyCacheObjectImpl.java    | 39 +++------
 .../processors/cache/UserCacheObjectImpl.java   | 28 ++++---
 .../cache/UserKeyCacheObjectImpl.java           | 18 ++--
 .../distributed/dht/GridDhtCacheAdapter.java    |  2 +-
 .../distributed/dht/GridDhtTxPrepareFuture.java |  4 +-
 .../dht/GridPartitionedGetFuture.java           |  4 +-
 .../dht/atomic/GridDhtAtomicCache.java          | 16 ++--
 .../dht/atomic/GridNearAtomicUpdateFuture.java  |  6 +-
 .../dht/colocated/GridDhtColocatedCache.java    |  2 +-
 .../local/atomic/GridLocalAtomicCache.java      | 27 +++---
 .../continuous/CacheContinuousQueryManager.java | 10 +--
 .../cache/transactions/IgniteTxAdapter.java     |  4 +-
 .../cache/transactions/IgniteTxEntry.java       | 10 ++-
 .../transactions/IgniteTxLocalAdapter.java      | 20 ++---
 .../datastructures/DataStructuresProcessor.java |  2 +-
 .../portable/GridPortableProcessor.java         | 12 ++-
 .../IgniteCacheObjectProcessorAdapter.java      | 85 +++++++++++++++++++
 .../portable/os/GridOsPortableProcessor.java    |  6 +-
 .../cache/GridCacheAbstractFullApiSelfTest.java | 87 ++++++++++++++++++++
 .../cache/GridCacheOffHeapSelfTest.java         |  4 +-
 ...pyOnGetDisabledMultiNodeFullApiSelfTest.java | 36 ++++++++
 .../IgniteCacheFullApiSelfTestSuite.java        |  1 +
 .../processors/query/h2/IgniteH2Indexing.java   |  2 +-
 .../cache/GridCacheOffHeapAndSwapSelfTest.java  |  2 +-
 .../processors/cache/GridCacheSwapSelfTest.java |  4 +-
 34 files changed, 442 insertions(+), 190 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/managers/GridManagerAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/GridManagerAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/GridManagerAdapter.java
index 2159976..cd134ec 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/managers/GridManagerAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/managers/GridManagerAdapter.java
@@ -500,7 +500,7 @@ public abstract class GridManagerAdapter<T extends 
IgniteSpi> implements GridMan
 
                             GridCacheSwapEntry e = 
cctx.swap().read(cctx.toCacheKeyObject(key), true, true);
 
-                            return e != null ? CU.<V>value(e.value(), cctx) : 
null;
+                            return e != null ? CU.<V>value(e.value(), cctx, 
true) : null;
                         }
                         catch (IgniteCheckedException e) {
                             throw U.convertException(e);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
index 0247e67..51da1da 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/affinity/GridAffinityAssignmentCache.java
@@ -297,14 +297,8 @@ public class GridAffinityAssignmentCache {
      */
     public int partition(Object key) {
         // TODO IGNITE-51.
-        if (ctx.portableEnabled()) {
-            try {
-                key = ctx.marshalToPortable(key);
-            }
-            catch (IgniteException e) {
-                U.error(log, "Failed to marshal key to portable: " + key, e);
-            }
-        }
+        if (key instanceof CacheObject)
+            key = ((CacheObject)key).value(ctx, false);
 
         return aff.partition(affMapper.affinityKey(key));
     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectAdapter.java
new file mode 100644
index 0000000..f38f027
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectAdapter.java
@@ -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.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.internal.*;
+import org.apache.ignite.internal.util.tostring.*;
+import org.jetbrains.annotations.*;
+
+import java.io.*;
+
+/**
+ *
+ */
+public abstract class CacheObjectAdapter implements CacheObject, 
Externalizable {
+    /** */
+    @GridToStringInclude
+    @GridDirectTransient
+    protected Object val;
+
+    /** */
+    protected byte[] valBytes;
+
+    /** {@inheritDoc} */
+    @Nullable @Override public <T> T getField(String name) {
+        // TODO IGNITE-51.
+        return null;
+    }
+
+    /**
+     * @return {@code True} need to copy value returned to user.
+     */
+    protected boolean needCopy(GridCacheContext ctx) {
+        return ctx.config().isCopyOnGet() && val != null && 
!ctx.portable().immutable(val);
+    }
+
+    /** {@inheritDoc} */
+    @Override public void writeExternal(ObjectOutput out) throws IOException {
+        assert false;
+    }
+
+    /** {@inheritDoc} */
+    @Override public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
+        assert false;
+    }
+
+    /** {@inheritDoc} */
+    public String toString() {
+        if (byteArray())
+            return getClass().getSimpleName() + " [val=<byte array>, len=" + 
((byte[])val).length + ']';
+        else
+            return getClass().getSimpleName() + " [val=" + val + ", 
hasValBytes=" + (valBytes != null) + ']';
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectImpl.java
index fbc2bde..252f51b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/CacheObjectImpl.java
@@ -18,27 +18,17 @@
 package org.apache.ignite.internal.processors.cache;
 
 import org.apache.ignite.*;
-import org.apache.ignite.internal.*;
-import org.apache.ignite.internal.util.tostring.*;
 import org.apache.ignite.internal.util.typedef.internal.*;
 import org.apache.ignite.plugin.extensions.communication.*;
 import org.jetbrains.annotations.*;
 
-import java.io.*;
 import java.nio.*;
+import java.util.*;
 
 /**
  *
  */
-public class CacheObjectImpl implements CacheObject, Externalizable {
-    /** */
-    @GridToStringInclude
-    @GridDirectTransient
-    protected Object val;
-
-    /** */
-    protected byte[] valBytes;
-
+public class CacheObjectImpl extends CacheObjectAdapter {
     /**
      *
      */
@@ -58,20 +48,25 @@ public class CacheObjectImpl implements CacheObject, 
Externalizable {
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public <T> T getField(String name) {
-        // TODO IGNITE-51.
-        return null;
-    }
-
-    /** {@inheritDoc} */
     @SuppressWarnings("unchecked")
-    @Nullable @Override public <T> T value(GridCacheContext ctx) {
-        if (val != null)
-            return (T)val;
-
-        assert valBytes != null;
+    @Nullable @Override public <T> T value(GridCacheContext ctx, boolean cpy) {
+        cpy = cpy && needCopy(ctx);
 
         try {
+            if (cpy) {
+                byte[] bytes = valueBytes(ctx);
+
+                if (byteArray())
+                    return (T)Arrays.copyOf(bytes, bytes.length);
+                else
+                    return ctx.marshaller().unmarshal(valBytes, 
U.gridClassLoader());
+            }
+
+            if (val != null)
+                return (T)val;
+
+            assert valBytes != null;
+
             val = ctx.marshaller().unmarshal(valBytes, U.gridClassLoader());
         }
         catch (IgniteCheckedException e) {
@@ -201,25 +196,7 @@ public class CacheObjectImpl implements CacheObject, 
Externalizable {
     }
 
     /** {@inheritDoc} */
-    @Override public void writeExternal(ObjectOutput out) throws IOException {
-        assert false;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
-        assert false;
-    }
-
-    /** {@inheritDoc} */
     @Override public CacheObject prepareForCache(GridCacheContext ctx) {
         return this;
     }
-
-    /** {@inheritDoc} */
-    public String toString() {
-        if (val instanceof byte[])
-            return getClass().getSimpleName() + " [val=<byte array>, len=" + 
((byte[])val).length + ']';
-        else
-            return getClass().getSimpleName() + " [val=" + val + ", 
hasValBytes=" + (valBytes != null) + ']';
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
index a641e23..8abc75f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheAdapter.java
@@ -216,7 +216,7 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
             @Nullable @Override public Object 
applyx(IgniteInternalFuture<GridCacheReturn<CacheObject>> fut)
                 throws IgniteCheckedException
             {
-                return CU.value(fut.get().value(), ctx);
+                return CU.value(fut.get().value(), ctx, true);
             }
 
             @Override public String toString() {
@@ -2328,7 +2328,7 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
                                 misses.put(key, ver);
                             }
                             else {
-                                ctx.addResult(map, key, val, skipVals, 
keepCacheObjects, deserializePortable);
+                                ctx.addResult(map, key, val, skipVals, 
keepCacheObjects, deserializePortable, true);
 
                                 if (tx == null || (!tx.implicit() && 
tx.isolation() == READ_COMMITTED))
                                     ctx.evicts().touch(entry, topVer);
@@ -2408,7 +2408,8 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
                                                         cacheVal,
                                                         skipVals,
                                                         keepCacheObjects,
-                                                        deserializePortable);
+                                                        deserializePortable,
+                                                        false);
                                                 }
 
                                                 if (tx0 == null || 
(!tx0.implicit() &&
@@ -2542,7 +2543,7 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
             @Override public V op(IgniteTxLocalAdapter tx) throws 
IgniteCheckedException {
                 CacheObject prev = tx.putAllAsync(ctx, F.t(key, val), true, 
cached, ttl, filter).get().value();
 
-                return CU.value(prev, ctx);
+                return CU.value(prev, ctx, false);
             }
 
             @Override public String toString() {
@@ -2962,7 +2963,7 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
             @Override public V op(IgniteTxLocalAdapter tx) throws 
IgniteCheckedException {
                 CacheObject prev = tx.putAllAsync(ctx, F.t(key, val), true, 
null, -1, ctx.noPeekArray()).get().value();
 
-                return CU.value(prev, ctx);
+                return CU.value(prev, ctx, true);
             }
 
             @Override public String toString() {
@@ -3081,7 +3082,7 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
             @Override public V op(IgniteTxLocalAdapter tx) throws 
IgniteCheckedException {
                 CacheObject prev = tx.putAllAsync(ctx, F.t(key, val), true, 
null, -1, ctx.hasPeekArray()).get().value();
 
-                return CU.value(prev, ctx);
+                return CU.value(prev, ctx, true);
             }
 
             @Override public String toString() {
@@ -3329,7 +3330,7 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
             @Override public V op(IgniteTxLocalAdapter tx) throws 
IgniteCheckedException {
                 CacheObject ret = tx.removeAllAsync(ctx, 
Collections.singletonList(key), entry, true, filter).get().value();
 
-                V retVal = CU.value(ret, ctx);
+                V retVal = CU.value(ret, ctx, true);
 
                 if (ctx.config().getInterceptor() != null)
                     return 
(V)ctx.config().getInterceptor().onBeforeRemove(key, retVal).get2();
@@ -3573,7 +3574,7 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
 
                 CacheObject val = (CacheObject)ret.value();
 
-                ret.value(CU.value(val, ctx));
+                ret.value(CU.value(val, ctx, true));
 
                 return ret;
             }
@@ -3648,7 +3649,7 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
 
                 CacheObject val = (CacheObject)ret.value();
 
-                ret.value(CU.value(val, ctx));
+                ret.value(CU.value(val, ctx, true));
 
                 return ret;
             }
@@ -3692,7 +3693,7 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
 
                         CacheObject val = (CacheObject)ret.value();
 
-                        ret.value(CU.value(val, ctx));
+                        ret.value(CU.value(val, ctx, true));
 
                         return ret;
                     }
@@ -3742,7 +3743,7 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
 
                         CacheObject val = (CacheObject)ret.value();
 
-                        ret.value(CU.value(val, ctx));
+                        ret.value(CU.value(val, ctx, true));
 
                         return ret;
                     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
index 084c984..478fcb4 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheContext.java
@@ -1770,7 +1770,7 @@ public class GridCacheContext<K, V> implements 
Externalizable {
         if (obj instanceof CacheObject)
             return (CacheObject)obj;
 
-        return portable().toCacheObject(obj);
+        return portable().toCacheObject(this, obj);
     }
 
     /**
@@ -1781,7 +1781,7 @@ public class GridCacheContext<K, V> implements 
Externalizable {
         if (obj instanceof KeyCacheObject)
             return (KeyCacheObject)obj;
 
-        return portable().toCacheKeyObject(obj);
+        return portable().toCacheKeyObject(this, obj);
     }
 
     /**
@@ -1882,7 +1882,7 @@ public class GridCacheContext<K, V> implements 
Externalizable {
         assert val != null;
 
         if (!keepCacheObjects) {
-            Object key0 = key.value(this, cpy);
+            Object key0 = key.value(this, false);
             Object val0 = skipVals ? true : val.value(this, cpy);
 
             if (portableEnabled() && deserializePortable) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheStoreManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheStoreManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheStoreManager.java
index 6a7450c..1b1e50c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheStoreManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheStoreManager.java
@@ -267,7 +267,7 @@ public class GridCacheStoreManager extends 
GridCacheManagerAdapter {
                 // Never load internal keys from store as they are never 
persisted.
                 return null;
 
-            Object storeKey = key.value(cctx);
+            Object storeKey = key.value(cctx, false);
 
             if (convertPortable)
                 storeKey = cctx.unwrapPortableIfNeeded(storeKey, false);
@@ -412,14 +412,14 @@ public class GridCacheStoreManager extends 
GridCacheManagerAdapter {
             if (convertPortable) {
                 keys0 = F.viewReadOnly(keys, new C1<KeyCacheObject, Object>() {
                     @Override public Object apply(KeyCacheObject key) {
-                        return cctx.unwrapPortableIfNeeded(key.value(cctx), 
false);
+                        return cctx.unwrapPortableIfNeeded(key.value(cctx, 
false), false);
                     }
                 });
             }
             else {
                 keys0 = F.viewReadOnly(keys, new C1<KeyCacheObject, Object>() {
                     @Override public Object apply(KeyCacheObject key) {
-                        return key.value(cctx);
+                        return key.value(cctx, false);
                     }
                 });
             }
@@ -562,8 +562,8 @@ public class GridCacheStoreManager extends 
GridCacheManagerAdapter {
             if (key.internal())
                 return true;
 
-            Object storeKey = key.value(cctx);
-            Object storeVal = val.value(cctx);
+            Object storeKey = key.value(cctx, false);
+            Object storeVal = val.value(cctx, false);
 
             if (convertPortable) {
                 storeKey = cctx.unwrapPortableIfNeeded(storeKey, false);
@@ -678,7 +678,7 @@ public class GridCacheStoreManager extends 
GridCacheManagerAdapter {
             if (key.internal())
                 return false;
 
-            Object storeKey = key.value(cctx);
+            Object storeKey = key.value(cctx, false);
 
             if (convertPortable)
                 storeKey = cctx.unwrapPortableIfNeeded(storeKey, false);
@@ -738,14 +738,14 @@ public class GridCacheStoreManager extends 
GridCacheManagerAdapter {
             if (convertPortable) {
                 keys0 = F.viewReadOnly(keys, new C1<KeyCacheObject, Object>() {
                     @Override public Object apply(KeyCacheObject key) {
-                        return cctx.unwrapPortableIfNeeded(key.value(cctx), 
false);
+                        return cctx.unwrapPortableIfNeeded(key.value(cctx, 
false), false);
                     }
                 });
             }
             else {
                 keys0 = F.viewReadOnly(keys, new C1<KeyCacheObject, Object>() {
                     @Override public Object apply(KeyCacheObject key) {
-                        return key.value(cctx);
+                        return key.value(cctx, false);
                     }
                 });
             }
@@ -1049,8 +1049,8 @@ public class GridCacheStoreManager extends 
GridCacheManagerAdapter {
                         if (rmvd != null && rmvd.contains(k))
                             continue;
 
-                        Object storeKey = e.getKey().value(cctx);
-                        Object storeVal = e.getValue().get1().value(cctx);
+                        Object storeKey = e.getKey().value(cctx, false);
+                        Object storeVal = e.getValue().get1().value(cctx, 
false);
 
                         if (convertPortable) {
                             storeKey = cctx.unwrapPortableIfNeeded(storeKey, 
false);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java
index 26c5366..8dd66d1 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheSwapManager.java
@@ -465,7 +465,7 @@ public class GridCacheSwapManager extends 
GridCacheManagerAdapter {
             assert key != null;
 
             byte[] valBytes = swapMgr.read(spaceName,
-                new SwapKey(key.value(cctx), part, key.valueBytes(cctx)),
+                new SwapKey(key.value(cctx, false), part, 
key.valueBytes(cctx)),
                 cctx.deploy().globalLoader());
 
             return valBytes != null;
@@ -1093,7 +1093,7 @@ public class GridCacheSwapManager extends 
GridCacheManagerAdapter {
         checkIteratorQueue();
 
         swapMgr.write(spaceName,
-            new SwapKey(key.value(cctx), part, key.valueBytes(cctx)),
+            new SwapKey(key.value(cctx, false), part, key.valueBytes(cctx)),
             entry,
             cctx.deploy().globalLoader());
 
@@ -1308,7 +1308,7 @@ public class GridCacheSwapManager extends 
GridCacheManagerAdapter {
      */
     public Iterator<KeyCacheObject> offHeapKeyIterator(boolean primary, 
boolean backup, long topVer) {
         // TODO IGNITE-51.
-        return null;
+        return new GridEmptyCloseableIterator<>();
     }
 
     /**
@@ -1317,7 +1317,7 @@ public class GridCacheSwapManager extends 
GridCacheManagerAdapter {
     public Iterator<KeyCacheObject> swapKeyIterator(boolean primary, boolean 
backup, long topVer)
         throws IgniteCheckedException {
         // TODO IGNITE-51.
-        return null;
+        return new GridEmptyCloseableIterator<>();
     }
 
     /**
@@ -1384,7 +1384,7 @@ public class GridCacheSwapManager extends 
GridCacheManagerAdapter {
 
                             swapEntry(e);
 
-                            return e.value().value(cctx);
+                            return e.value().value(cctx, false);
                         }
                         catch (IgniteCheckedException ex) {
                             throw new IgniteException(ex);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObject.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObject.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObject.java
index 8a96a32..66021a2 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObject.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObject.java
@@ -26,5 +26,8 @@ public interface KeyCacheObject extends CacheObject {
      */
     public int hashCode();
 
+    /**
+     * @return {@code True} if internal cache key.
+     */
     public boolean internal();
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObjectImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObjectImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObjectImpl.java
index 72f8f3e..6edac0b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObjectImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/KeyCacheObjectImpl.java
@@ -24,13 +24,12 @@ import org.apache.ignite.internal.util.typedef.internal.*;
 import org.apache.ignite.plugin.extensions.communication.*;
 import org.jetbrains.annotations.*;
 
-import java.io.*;
 import java.nio.*;
 
 /**
  *
  */
-public class KeyCacheObjectImpl implements KeyCacheObject, Externalizable {
+public class KeyCacheObjectImpl extends CacheObjectAdapter implements 
KeyCacheObject {
     /** */
     @GridToStringInclude
     @GridDirectTransient
@@ -59,8 +58,6 @@ public class KeyCacheObjectImpl implements KeyCacheObject, 
Externalizable {
 
     /** {@inheritDoc} */
     @Override public boolean byteArray() {
-        assert false;
-
         return false;
     }
 
@@ -80,14 +77,19 @@ public class KeyCacheObjectImpl implements KeyCacheObject, 
Externalizable {
 
     /** {@inheritDoc} */
     @SuppressWarnings("unchecked")
-    @Nullable @Override public <T> T value(GridCacheContext ctx) {
-        return (T)val;
-    }
+    @Nullable @Override public <T> T value(GridCacheContext ctx, boolean cpy) {
+        cpy = cpy && needCopy(ctx);
+
+        if (cpy) {
+            try {
+                return (T)ctx.marshaller().unmarshal(valBytes, 
ctx.deploy().globalLoader());
+            }
+            catch (IgniteCheckedException e) {
+                throw new IgniteException("Failed to unmarshal object.", e);
+            }
+        }
 
-    /** {@inheritDoc} */
-    @Nullable @Override public <T> T getField(String name) {
-        // TODO IGNITE-51.
-        return null;
+        return (T)val;
     }
 
     /** {@inheritDoc} */
@@ -178,19 +180,4 @@ public class KeyCacheObjectImpl implements KeyCacheObject, 
Externalizable {
 
         return val.equals(other.val);
     }
-
-    /** {@inheritDoc} */
-    @Override public void writeExternal(ObjectOutput out) throws IOException {
-        assert false;
-    }
-
-    /** {@inheritDoc} */
-    @Override public void readExternal(ObjectInput in) throws IOException, 
ClassNotFoundException {
-        assert false;
-    }
-
-    /** {@inheritDoc} */
-    public String toString() {
-        return S.toString(KeyCacheObjectImpl.class, this);
-    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/UserCacheObjectImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/UserCacheObjectImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/UserCacheObjectImpl.java
index 966e7ba..759407c 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/UserCacheObjectImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/UserCacheObjectImpl.java
@@ -35,21 +35,25 @@ public class UserCacheObjectImpl extends CacheObjectImpl {
 
     /** {@inheritDoc} */
     @Override public CacheObject prepareForCache(GridCacheContext ctx) {
-        if (val instanceof byte[]) {
-            byte[] byteArr = (byte[])val;
+        if (needCopy(ctx)) {
+            if (val instanceof byte[]) {
+                byte[] byteArr = (byte[])val;
 
-            return new CacheObjectImpl(Arrays.copyOf(byteArr, byteArr.length), 
null);
-        }
-        else {
-            try {
-                if (valBytes == null)
-                    valBytes = CU.marshal(ctx.shared(), val);
-
-                return new CacheObjectImpl(null, valBytes);
+                return new CacheObjectImpl(Arrays.copyOf(byteArr, 
byteArr.length), null);
             }
-            catch (IgniteCheckedException e) {
-                throw new IgniteException("Failed to marshal object: " + val, 
e);
+            else {
+                try {
+                    if (valBytes == null)
+                        valBytes = CU.marshal(ctx.shared(), val);
+
+                    return new CacheObjectImpl(null, valBytes);
+                }
+                catch (IgniteCheckedException e) {
+                    throw new IgniteException("Failed to marshal object: " + 
val, e);
+                }
             }
         }
+        else
+            return new CacheObjectImpl(val, valBytes);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/UserKeyCacheObjectImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/UserKeyCacheObjectImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/UserKeyCacheObjectImpl.java
index b0fd9b2..fc2f9c0 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/UserKeyCacheObjectImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/UserKeyCacheObjectImpl.java
@@ -32,14 +32,18 @@ public class UserKeyCacheObjectImpl extends 
KeyCacheObjectImpl {
 
     /** {@inheritDoc} */
     @Override public CacheObject prepareForCache(GridCacheContext ctx) {
-        try {
-            if (valBytes == null)
-                valBytes = ctx.marshaller().marshal(val);
+        if (needCopy(ctx)) {
+            try {
+                if (valBytes == null)
+                    valBytes = ctx.marshaller().marshal(val);
 
-            return new KeyCacheObjectImpl(ctx.marshaller().unmarshal(valBytes, 
ctx.deploy().globalLoader()), valBytes);
-        }
-        catch (IgniteCheckedException e) {
-            throw new IgniteException("Failed to marshal object: " + val, e);
+                return new 
KeyCacheObjectImpl(ctx.marshaller().unmarshal(valBytes, 
ctx.deploy().globalLoader()), valBytes);
+            }
+            catch (IgniteCheckedException e) {
+                throw new IgniteException("Failed to marshal object: " + val, 
e);
+            }
         }
+        else
+            return new KeyCacheObjectImpl(val, valBytes);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java
index d5d5a29..6b97816 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtCacheAdapter.java
@@ -438,7 +438,7 @@ public abstract class GridDhtCacheAdapter<K, V> extends 
GridDistributedCacheAdap
         long topVer,
         boolean replicate,
         @Nullable ExpiryPolicy plc) {
-        if (p != null && !p.apply(key.<K>value(ctx), (V)val))
+        if (p != null && !p.apply(key.<K>value(ctx, false), (V)val))
             return;
 
         try {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
index 9344b2c..7d991ee 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridDhtTxPrepareFuture.java
@@ -318,8 +318,8 @@ public final class GridDhtTxPrepareFuture<K, V> extends 
GridCompoundIdentityFutu
                             Object procRes = null;
                             Exception err = null;
 
-                            Object keyVal = key.value(cacheCtx);
-                            Object val0 = CU.value(val, cacheCtx);
+                            Object keyVal = key.value(cacheCtx, false);
+                            Object val0 = CU.value(val, cacheCtx, false);
 
                             for (T2<EntryProcessor<Object, Object, Object>, 
Object[]> t : txEntry.entryProcessors()) {
                                 try {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
index d080e32..96777c9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/GridPartitionedGetFuture.java
@@ -462,7 +462,7 @@ public class GridPartitionedGetFuture<K, V> extends 
GridCompoundIdentityFuture<M
                                     colocated.removeIfObsolete(key);
                             }
                             else {
-                                cctx.addResult(locVals, key, v, skipVals, 
false, deserializePortable);
+                                cctx.addResult(locVals, key, v, skipVals, 
false, deserializePortable, true);
 
                                 return false;
                             }
@@ -537,7 +537,7 @@ public class GridPartitionedGetFuture<K, V> extends 
GridCompoundIdentityFuture<M
             Map<K, V> map = new GridLeanMap<>(keysSize);
 
             for (GridCacheEntryInfo info : infos)
-                cctx.addResult(map, info.key(), info.value(), skipVals, false, 
deserializePortable);
+                cctx.addResult(map, info.key(), info.value(), skipVals, false, 
deserializePortable, false);
 
             return map;
         }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/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 ec06a70..ecedc04 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
@@ -961,7 +961,7 @@ public class GridDhtAtomicCache<K, V> extends 
GridDhtCacheAdapter<K, V> {
                                 success = false;
                             }
                             else
-                                ctx.addResult(locVals, cacheKey, v, skipVals, 
false, deserializePortable);
+                                ctx.addResult(locVals, cacheKey, v, skipVals, 
false, deserializePortable, false);
                         }
                         else
                             success = false;
@@ -1340,8 +1340,8 @@ public class GridDhtAtomicCache<K, V> extends 
GridDhtCacheAdapter<K, V> {
                         taskName,
                         null);
 
-                    Object keyVal = entry.key().value(ctx);
-                    Object oldVal = CU.value(old, ctx);
+                    Object keyVal = entry.key().value(ctx, false);
+                    Object oldVal = CU.value(old, ctx, false);
                     Object updatedVal = null;
 
                     CacheInvokeEntry<Object, Object> invokeEntry = new 
CacheInvokeEntry<>(ctx,
@@ -1481,9 +1481,9 @@ public class GridDhtAtomicCache<K, V> extends 
GridDhtCacheAdapter<K, V> {
                             taskName,
                             null);
 
-                        Object val = 
ctx.config().getInterceptor().onBeforePut(entry.key().value(ctx),
-                            CU.value(old, ctx),
-                            updated.value(ctx));
+                        Object val = 
ctx.config().getInterceptor().onBeforePut(entry.key().value(ctx, false),
+                            CU.value(old, ctx, false),
+                            updated.value(ctx, false));
 
                         if (val == null)
                             continue;
@@ -1517,8 +1517,8 @@ public class GridDhtAtomicCache<K, V> extends 
GridDhtCacheAdapter<K, V> {
                             null);
 
                         IgniteBiTuple<Boolean, ?> interceptorRes = 
ctx.config().getInterceptor().onBeforeRemove(
-                            entry.key().value(ctx),
-                            CU.value(old, ctx));
+                            entry.key().value(ctx, false),
+                            CU.value(old, ctx, false));
 
                         if (ctx.cancelRemove(interceptorRes))
                             continue;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/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 d34901f..e2b974c 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
@@ -330,7 +330,7 @@ public class GridNearAtomicUpdateFuture extends 
GridFutureAdapter<Object> implem
         if (op != TRANSFORM) {
             CacheObject val = (CacheObject)ret.value();
 
-            ret.value(CU.value(val, cctx));
+            ret.value(CU.value(val, cctx, false));
         }
 
         Object retval = res == null ? null : rawRetval ? ret : this.retval ? 
ret.value() : ret.success();
@@ -897,9 +897,9 @@ public class GridNearAtomicUpdateFuture extends 
GridFutureAdapter<Object> implem
 
             for (CacheInvokeDirectResult res : results) {
                 CacheInvokeResult<?> res0 = res.error() == null ?
-                    new CacheInvokeResult<>(CU.value(res.result(), cctx)) : 
new CacheInvokeResult<>(res.error());
+                    new CacheInvokeResult<>(CU.value(res.result(), cctx, 
false)) : new CacheInvokeResult<>(res.error());
 
-                map0.put(res.key().value(cctx), res0);
+                map0.put(res.key().value(cctx, false), res0);
             }
 
             if (opRes != null) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
index 15befd9..2c5d45d 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/distributed/dht/colocated/GridDhtColocatedCache.java
@@ -300,7 +300,7 @@ public class GridDhtColocatedCache<K, V> extends 
GridDhtTransactionalCacheAdapte
                                 success = false;
                             }
                             else
-                                ctx.addResult(locVals, cacheKey, v, skipVals, 
false, deserializePortable);
+                                ctx.addResult(locVals, cacheKey, v, skipVals, 
false, deserializePortable, true);
                         }
                         else
                             success = false;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
index 8433d11..833f8c9 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/local/atomic/GridLocalAtomicCache.java
@@ -653,17 +653,8 @@ public class GridLocalAtomicCache<K, V> extends 
GridCacheAdapter<K, V> {
                             taskName,
                             expiry);
 
-                        if (v != null) {
-                            K key0 = key;
-                            Object val = v.value(ctx);
-
-                            if (ctx.portableEnabled() && deserializePortable) {
-                                val = ctx.unwrapPortableIfNeeded(val, false);
-                                key0 = (K)ctx.unwrapPortableIfNeeded(key, 
false);
-                            }
-
-                            vals.put(key0, (V)val);
-                        }
+                        if (v != null)
+                            ctx.addResult(vals, cacheKey, v, skipVals, false, 
deserializePortable, true);
                         else
                             success = false;
                     }
@@ -1184,8 +1175,8 @@ public class GridLocalAtomicCache<K, V> extends 
GridCacheAdapter<K, V> {
                             taskName,
                             null);
 
-                        Object keyVal = entry.key().value(ctx);
-                        Object oldVal = CU.value(old, ctx);
+                        Object keyVal = entry.key().value(ctx, false);
+                        Object oldVal = CU.value(old, ctx, false);
 
                         CacheInvokeEntry<Object, Object> invokeEntry = new 
CacheInvokeEntry<>(ctx, keyVal, oldVal);
 
@@ -1297,7 +1288,7 @@ public class GridLocalAtomicCache<K, V> extends 
GridCacheAdapter<K, V> {
 
                             Object interceptorVal = 
ctx.config().getInterceptor().onBeforePut(
                                 entry.key(),
-                                CU.value(old, ctx),
+                                CU.value(old, ctx, false),
                                 val);
 
                             if (interceptorVal == null)
@@ -1330,7 +1321,7 @@ public class GridLocalAtomicCache<K, V> extends 
GridCacheAdapter<K, V> {
 
                             IgniteBiTuple<Boolean, ?> interceptorRes = 
ctx.config().getInterceptor().onBeforeRemove(
                                 entry.key(),
-                                CU.value(old, ctx));
+                                CU.value(old, ctx, false));
 
                             if (ctx.cancelRemove(interceptorRes))
                                 continue;
@@ -1478,9 +1469,11 @@ public class GridLocalAtomicCache<K, V> extends 
GridCacheAdapter<K, V> {
 
                 if (intercept) {
                     if (op == UPDATE)
-                        
ctx.config().getInterceptor().onAfterPut(entry.key().value(ctx), 
writeVal.value(ctx));
+                        
ctx.config().getInterceptor().onAfterPut(entry.key().value(ctx, false),
+                                writeVal.value(ctx, false));
                     else
-                        
ctx.config().getInterceptor().onAfterRemove(entry.key().value(ctx), 
CU.value(t.get2(), ctx));
+                        
ctx.config().getInterceptor().onAfterRemove(entry.key().value(ctx, false),
+                                CU.value(t.get2(), ctx, false));
                 }
             }
             catch (GridCacheEntryRemovedException ignore) {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
index 17648b6..b5f8666 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/continuous/CacheContinuousQueryManager.java
@@ -182,10 +182,10 @@ public class CacheContinuousQueryManager<K, V> extends 
GridCacheManagerAdapter<K
                 }
             }
 
-            CacheContinuousQueryEntry<K, V> e0 = new 
CacheContinuousQueryEntry<>(key.<K>value(cctx),
-                CU.<V>value(newVal, cctx),
+            CacheContinuousQueryEntry<K, V> e0 = new 
CacheContinuousQueryEntry<>(key.<K>value(cctx, false),
+                CU.<V>value(newVal, cctx, false),
                 newBytes,
-                lsnr.oldValueRequired() ? CU.<V>value(oldVal, cctx) : null,
+                lsnr.oldValueRequired() ? CU.<V>value(oldVal, cctx, false) : 
null,
                 lsnr.oldValueRequired() ? oldBytes : null);
 
             CacheContinuousQueryEvent<K, V> evt = new 
CacheContinuousQueryEvent<>(
@@ -235,10 +235,10 @@ public class CacheContinuousQueryManager<K, V> extends 
GridCacheManagerAdapter<K
                 }
 
                // TODO IGNITE-51.
-               CacheContinuousQueryEntry<K, V> e0 = new 
CacheContinuousQueryEntry<>(key.<K>value(cctx),
+               CacheContinuousQueryEntry<K, V> e0 = new 
CacheContinuousQueryEntry<>(key.<K>value(cctx, false),
                     null,
                     null,
-                    lsnr.oldValueRequired() ? CU.<V>value(oldVal, cctx) : null,
+                    lsnr.oldValueRequired() ? CU.<V>value(oldVal, cctx, false) 
: null,
                     lsnr.oldValueRequired() ? oldBytes : null);
 
                 CacheContinuousQueryEvent<K, V> evt = new 
CacheContinuousQueryEvent<>(

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
index 363a5fd..c26ca4b 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxAdapter.java
@@ -1225,9 +1225,9 @@ public abstract class IgniteTxAdapter extends 
GridMetadataAwareAdapter
 
                 boolean modified = false;
 
-                Object key = txEntry.key().value(txEntry.context());
+                Object key = txEntry.key().value(txEntry.context(), false);
 
-                Object val = cacheVal != null ? 
cacheVal.value(txEntry.context()) : null;
+                Object val = CU.value(cacheVal, txEntry.context(), false);
 
                 for (T2<EntryProcessor<Object, Object, Object>, Object[]> t : 
txEntry.entryProcessors()) {
                     CacheInvokeEntry<Object, Object> invokeEntry = new 
CacheInvokeEntry<>(txEntry.context(), key, val);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
index ea44edf..c45968f 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxEntry.java
@@ -554,8 +554,8 @@ public class IgniteTxEntry implements GridPeerDeployAware, 
Externalizable, Optim
      */
     @SuppressWarnings("unchecked")
     public CacheObject applyEntryProcessors(CacheObject cacheVal) {
-        Object key = CU.value(this.key, ctx);
-        Object val = CU.value(cacheVal, ctx);
+        Object key = CU.value(this.key, ctx, false);
+        Object val = CU.value(cacheVal, ctx, false);
 
         for (T2<EntryProcessor<Object, Object, Object>, Object[]> t : 
entryProcessors()) {
             try {
@@ -580,9 +580,13 @@ public class IgniteTxEntry implements GridPeerDeployAware, 
Externalizable, Optim
 //        return val;
     }
 
+    /**
+     * @param cacheVal Value.
+     * @return New value.
+     */
     public <V> V applyEntryProcessors(V cacheVal) {
         Object val = cacheVal;
-        Object key = CU.value(this.key, ctx);
+        Object key = CU.value(this.key, ctx, false);
 
         for (T2<EntryProcessor<Object, Object, Object>, Object[]> t : 
entryProcessors()) {
             try {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
index dfa81a0..1e17daf 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/transactions/IgniteTxLocalAdapter.java
@@ -576,7 +576,7 @@ public abstract class IgniteTxLocalAdapter extends 
IgniteTxAdapter
                             }
 
                             if (intercept) {
-                                Object oldVal = 
CU.value(e.cached().rawGetOrUnmarshal(true), cacheCtx);
+                                Object oldVal = 
CU.value(e.cached().rawGetOrUnmarshal(true), cacheCtx, false);
 
                                 IgniteBiTuple<Boolean, Object> t = 
cacheCtx.config().getInterceptor()
                                     .onBeforeRemove(key, oldVal);
@@ -1168,7 +1168,7 @@ public abstract class IgniteTxLocalAdapter extends 
IgniteTxAdapter
                         val = txEntry.applyEntryProcessors(val);
 
                     if (val != null) {
-                        Object val0 = val.value(cacheCtx);
+                        Object val0 = val.value(cacheCtx, true);
 
                         if (cacheCtx.portableEnabled())
                             val0 = cacheCtx.unwrapPortableIfNeeded(val0, 
!deserializePortable);
@@ -1273,7 +1273,7 @@ public abstract class IgniteTxLocalAdapter extends 
IgniteTxAdapter
                                 accessPlc);
 
                             if (val != null) {
-                                Object val0 = val.value(cacheCtx);
+                                Object val0 = val.value(cacheCtx, false);
 
                                 if (cacheCtx.portableEnabled())
                                     val0 = 
cacheCtx.unwrapPortableIfNeeded(val0, !deserializePortable);
@@ -1507,7 +1507,7 @@ public abstract class IgniteTxLocalAdapter extends 
IgniteTxAdapter
                                 cacheCtx.evicts().touch(e, topologyVersion());
 
                                 if (visibleVal != null)
-                                    map.put(key.<K>value(cacheCtx), 
(V)CU.skipValue(visibleVal, skipVals));
+                                    map.put(key.<K>value(cacheCtx, false), 
(V)CU.skipValue(visibleVal, skipVals));
                             }
                             else {
                                 assert txEntry != null;
@@ -1515,7 +1515,7 @@ public abstract class IgniteTxLocalAdapter extends 
IgniteTxAdapter
                                 txEntry.setAndMarkValid(cacheVal);
 
                                 if (visibleVal != null)
-                                    map.put(key.<K>value(cacheCtx), 
(V)visibleVal);
+                                    map.put(key.<K>value(cacheCtx, false), 
(V)visibleVal);
                             }
 
                             loaded.add(key);
@@ -1636,7 +1636,7 @@ public abstract class IgniteTxLocalAdapter extends 
IgniteTxAdapter
 
                         // Load keys only after the locks have been acquired.
                         for (KeyCacheObject cacheKey : lockKeys) {
-                            K keyVal = cacheKey.<K>value(cacheCtx);
+                            K keyVal = cacheKey.<K>value(cacheCtx, false);
 
                             if (retMap.containsKey(keyVal))
                                 // We already have a return value.
@@ -1677,7 +1677,7 @@ public abstract class IgniteTxLocalAdapter extends 
IgniteTxAdapter
 
                                         txEntry.setAndMarkValid(val);
 
-                                        Object val0 = val.value(cacheCtx);
+                                        Object val0 = val.value(cacheCtx, 
false);
 
                                         if 
(!F.isEmpty(txEntry.entryProcessors()))
                                             val0 = 
txEntry.applyEntryProcessors(val0);
@@ -1769,7 +1769,7 @@ public abstract class IgniteTxLocalAdapter extends 
IgniteTxAdapter
                 if (!missed.isEmpty()) {
                     if (!readCommitted())
                         for (Iterator<KeyCacheObject> it = 
missed.keySet().iterator(); it.hasNext(); ) {
-                            K keyVal = it.next().value(cacheCtx);
+                            K keyVal = it.next().value(cacheCtx, false);
 
                             if (retMap.containsKey(keyVal))
                                 it.remove();
@@ -2432,8 +2432,8 @@ public abstract class IgniteTxLocalAdapter extends 
IgniteTxAdapter
     private void addInvokeResult(IgniteTxEntry txEntry, CacheObject cacheVal, 
GridCacheReturn<?> ret) {
         GridCacheContext ctx = txEntry.context();
 
-        Object keyVal = txEntry.key().value(ctx);
-        Object val = CU.value(cacheVal, ctx);
+        Object keyVal = txEntry.key().value(ctx, false);
+        Object val = CU.value(cacheVal, ctx, false);
 
         try {
             Object res = null;

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java
index eab6b6a..55cf140 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/datastructures/DataStructuresProcessor.java
@@ -1008,7 +1008,7 @@ public final class DataStructuresProcessor extends 
GridProcessorAdapter {
                     GridCacheInternal key = (GridCacheInternal)entry.key();
 
                     // TODO IGNITE-51.
-                    Object val0 = CU.value(entry.value(), entry.context());
+                    Object val0 = CU.value(entry.value(), entry.context(), 
false);
 
                     if (val0 instanceof GridCacheCountDownLatchValue) {
                         // Notify latch on changes.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/GridPortableProcessor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/GridPortableProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/GridPortableProcessor.java
index 825d692..0f246cd 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/GridPortableProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/GridPortableProcessor.java
@@ -18,6 +18,7 @@
 package org.apache.ignite.internal.processors.portable;
 
 import org.apache.ignite.*;
+import org.apache.ignite.cache.*;
 import org.apache.ignite.cluster.*;
 import org.apache.ignite.internal.client.marshaller.*;
 import org.apache.ignite.internal.processors.*;
@@ -151,11 +152,18 @@ public interface GridPortableProcessor extends 
GridProcessor {
      * @param obj Object.
      * @return Cache object.
      */
-    @Nullable public CacheObject toCacheObject(@Nullable Object obj);
+    @Nullable public CacheObject toCacheObject(GridCacheContext ctx, @Nullable 
Object obj);
 
     /**
      * @param obj Key value.
      * @return Cache key object.
      */
-    public KeyCacheObject toCacheKeyObject(Object obj);
+    public KeyCacheObject toCacheKeyObject(GridCacheContext ctx, Object obj);
+
+    /**
+     * @param obj Value.
+     * @return {@code True} if object is of known immutable type of it is 
marked
+     *          with {@link IgniteImmutable} annotation.
+     */
+    public boolean immutable(Object obj);
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/IgniteCacheObjectProcessorAdapter.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/IgniteCacheObjectProcessorAdapter.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/IgniteCacheObjectProcessorAdapter.java
new file mode 100644
index 0000000..55b56b6
--- /dev/null
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/IgniteCacheObjectProcessorAdapter.java
@@ -0,0 +1,85 @@
+/*
+ * 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.portable;
+
+import org.apache.ignite.cache.*;
+import org.apache.ignite.internal.*;
+import org.apache.ignite.internal.processors.*;
+import org.apache.ignite.internal.util.*;
+import org.apache.ignite.lang.*;
+
+import java.math.*;
+import java.util.*;
+
+/**
+ *
+ */
+public abstract class IgniteCacheObjectProcessorAdapter extends 
GridProcessorAdapter implements GridPortableProcessor {
+    /** Immutable classes. */
+    private static final Collection<Class<?>> IMMUTABLE_CLS = new HashSet<>();
+
+    /** */
+    private final GridBoundedConcurrentLinkedHashMap<Class<?>, Boolean> 
reflectionCache =
+            new GridBoundedConcurrentLinkedHashMap<>(1024, 1024);
+
+    /**
+     *
+     */
+    static {
+        IMMUTABLE_CLS.add(String.class);
+        IMMUTABLE_CLS.add(Boolean.class);
+        IMMUTABLE_CLS.add(Byte.class);
+        IMMUTABLE_CLS.add(Short.class);
+        IMMUTABLE_CLS.add(Character.class);
+        IMMUTABLE_CLS.add(Integer.class);
+        IMMUTABLE_CLS.add(Long.class);
+        IMMUTABLE_CLS.add(Float.class);
+        IMMUTABLE_CLS.add(Double.class);
+        IMMUTABLE_CLS.add(UUID.class);
+        IMMUTABLE_CLS.add(IgniteUuid.class);
+        IMMUTABLE_CLS.add(BigDecimal.class);
+    }
+
+    /**
+     * @param ctx Context.
+     */
+    public IgniteCacheObjectProcessorAdapter(GridKernalContext ctx) {
+        super(ctx);
+    }
+
+    /** {@inheritDoc} */
+    @Override public boolean immutable(Object obj) {
+        assert obj != null;
+
+        Class<?> cls = obj.getClass();
+
+        if (IMMUTABLE_CLS.contains(cls))
+            return true;
+
+        Boolean immutable = reflectionCache.get(cls);
+
+        if (immutable != null)
+            return immutable;
+
+        immutable = IgniteUtils.hasAnnotation(cls, IgniteImmutable.class);
+
+        reflectionCache.putIfAbsent(cls, immutable);
+
+        return immutable;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/os/GridOsPortableProcessor.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/os/GridOsPortableProcessor.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/os/GridOsPortableProcessor.java
index ce81f31..14fd763 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/os/GridOsPortableProcessor.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/portable/os/GridOsPortableProcessor.java
@@ -31,7 +31,7 @@ import java.nio.*;
 /**
  * No-op implementation of {@link GridPortableProcessor}.
  */
-public class GridOsPortableProcessor extends GridProcessorAdapter implements 
GridPortableProcessor {
+public class GridOsPortableProcessor extends IgniteCacheObjectProcessorAdapter 
{
     /**
      * @param ctx Kernal context.
      */
@@ -125,12 +125,12 @@ public class GridOsPortableProcessor extends 
GridProcessorAdapter implements Gri
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public KeyCacheObject toCacheKeyObject(@Nullable 
Object obj) {
+    @Nullable public KeyCacheObject toCacheKeyObject(GridCacheContext ctx, 
Object obj) {
         return new UserKeyCacheObjectImpl(obj);
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override public CacheObject toCacheObject(@Nullable Object obj) 
{
+    @Nullable @Override public CacheObject toCacheObject(GridCacheContext ctx, 
@Nullable Object obj) {
         return new UserCacheObjectImpl(obj);
     }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFullApiSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFullApiSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFullApiSelfTest.java
index 96b1a32..1aa7c96 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFullApiSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheAbstractFullApiSelfTest.java
@@ -3921,6 +3921,93 @@ public abstract class GridCacheAbstractFullApiSelfTest 
extends GridCacheAbstract
     }
 
     /**
+     *
+     */
+    public void testCopyOnGet() {
+        IgniteCache<Integer, TestMutableObj> mutObjCache = 
ignite(0).jcache(null);
+        IgniteCache<Integer, TestImmutableObj> immObjCache = 
ignite(0).jcache(null);
+
+        CacheConfiguration cfg = 
mutObjCache.getConfiguration(CacheConfiguration.class);
+
+        boolean cpyOnGet = cfg.isCopyOnGet();
+
+        CacheAffinity<Integer> aff = ignite(0).affinity(null);
+
+        boolean near = cfg.getDistributionMode() == 
CacheDistributionMode.NEAR_PARTITIONED ||
+                cfg.getDistributionMode() == CacheDistributionMode.NEAR_ONLY;
+
+        ClusterNode locNode = ignite(0).cluster().localNode();
+
+        for (int i = 0; i < 100; i++) {
+            boolean primary = aff.isPrimary(locNode, i);
+            boolean backup = aff.isBackup(locNode, i);
+            boolean loc = near || primary || backup;
+
+            TestMutableObj putObj0 = new TestMutableObj(i);
+
+            mutObjCache.put(i, putObj0);
+
+            TestMutableObj getObj0 = mutObjCache.get(i);
+
+            assertEquals(i, getObj0.val);
+
+            if (!cpyOnGet && loc)
+                assertSame(putObj0, getObj0);
+            else
+                assertNotSame(putObj0, getObj0);
+
+            TestImmutableObj putObj1 = new TestImmutableObj(i);
+
+            immObjCache.put(i, putObj1);
+
+            TestImmutableObj getObj1 = immObjCache.get(i);
+
+            assertEquals(i, getObj1.val);
+
+            if (loc)
+                assertSame("Same expected [key=" + i + ", primary=" + primary 
+ ", backup=" + backup + ']',
+                    putObj1,
+                    getObj1);
+            else
+                assertNotSame(
+                        "Not same expected [key=" + i + ", primary=" + primary 
+ ", backup=" + backup + ']',
+                        putObj1,
+                        getObj1);
+        }
+    }
+
+    /**
+     *
+     */
+    public static class TestMutableObj {
+       /** */
+       public int val;
+
+        /**
+         * @param val Value.
+         */
+        public TestMutableObj(int val) {
+            this.val = val;
+        }
+    }
+
+    /**
+     *
+     */
+    @IgniteImmutable
+    public static class TestImmutableObj {
+       /** */
+       public int val;
+
+        /**
+         * @param val Value.
+         */
+        public TestImmutableObj(int val) {
+            this.val = val;
+        }
+    }
+
+    /**
      * If hasNext() is called repeatedly, it should return the same result.
      */
     private void checkIteratorHasNext() {

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapSelfTest.java
index 166e8a0..da487ce 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapSelfTest.java
@@ -566,10 +566,10 @@ public class GridCacheOffHeapSelfTest extends 
GridCommonAbstractTest {
             assert entry != null;
             assert entry.key() != null;
 
-            CacheValue val = CU.value(entry.rawGet(), entry.context());
+            CacheValue val = CU.value(entry.rawGet(), entry.context(), false);
 
             assertNotNull("Value null for key: " + i, val);
-            assertEquals(entry.key().value(entry.context()), 
(Integer)val.value());
+            assertEquals(entry.key().value(entry.context(), false), 
(Integer)val.value());
 
             assertEquals(entry.version(), versions.get(i));
         }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicCopyOnGetDisabledMultiNodeFullApiSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicCopyOnGetDisabledMultiNodeFullApiSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicCopyOnGetDisabledMultiNodeFullApiSelfTest.java
new file mode 100644
index 0000000..204412e
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/distributed/near/GridCacheAtomicCopyOnGetDisabledMultiNodeFullApiSelfTest.java
@@ -0,0 +1,36 @@
+/*
+ * 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.near;
+
+import org.apache.ignite.configuration.*;
+
+/**
+ *
+ */
+public class GridCacheAtomicCopyOnGetDisabledMultiNodeFullApiSelfTest extends 
GridCacheAtomicMultiNodeFullApiSelfTest {
+    /** {@inheritDoc} */
+    @Override protected CacheConfiguration cacheConfiguration(String gridName) 
throws Exception {
+        CacheConfiguration ccfg = super.cacheConfiguration(gridName);
+
+        assert ccfg.isCopyOnGet();
+
+        ccfg.setCopyOnGet(false);
+
+        return ccfg;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFullApiSelfTestSuite.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFullApiSelfTestSuite.java
 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFullApiSelfTestSuite.java
index d64cf5b..fd311be 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFullApiSelfTestSuite.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/testsuites/IgniteCacheFullApiSelfTestSuite.java
@@ -69,6 +69,7 @@ public class IgniteCacheFullApiSelfTestSuite extends 
TestSuite {
 
         suite.addTestSuite(GridCachePartitionedMultiNodeFullApiSelfTest.class);
         suite.addTestSuite(GridCacheAtomicMultiNodeFullApiSelfTest.class);
+        
suite.addTestSuite(GridCacheAtomicCopyOnGetDisabledMultiNodeFullApiSelfTest.class);
         
suite.addTestSuite(GridCacheAtomicPrimaryWriteOrderMultiNodeFullApiSelfTest.class);
         
suite.addTestSuite(GridCachePartitionedMultiNodeP2PDisabledFullApiSelfTest.class);
         
suite.addTestSuite(GridCacheAtomicMultiNodeP2PDisabledFullApiSelfTest.class);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
index 640a978..3002673 100644
--- 
a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
+++ 
b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/IgniteH2Indexing.java
@@ -2089,7 +2089,7 @@ public class IgniteH2Indexing implements 
GridQueryIndexing {
             // TODO IGNITE-51.
             GridCacheSwapEntry e = 
cctx.swap().read(cctx.toCacheKeyObject(key), true, true);
 
-            return e != null ? e.value().value(cctx) : null;
+            return e != null ? e.value().value(cctx, false) : null;
         }
 
         /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapAndSwapSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapAndSwapSelfTest.java
 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapAndSwapSelfTest.java
index 6134281..544d445 100644
--- 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapAndSwapSelfTest.java
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheOffHeapAndSwapSelfTest.java
@@ -271,7 +271,7 @@ public class GridCacheOffHeapAndSwapSelfTest extends 
GridCommonAbstractTest {
             assert entry != null;
             assert entry.key() != null;
 
-            Long val = entry.rawGet().value(entry.context());
+            Long val = entry.rawGet().value(entry.context(), false);
 
             assertNotNull("Value null for key: " + i, val);
             assertEquals(entry.key(), val);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/416f6375/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheSwapSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheSwapSelfTest.java
 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheSwapSelfTest.java
index 826df6a..34240e1 100644
--- 
a/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheSwapSelfTest.java
+++ 
b/modules/indexing/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheSwapSelfTest.java
@@ -641,10 +641,10 @@ public class GridCacheSwapSelfTest extends 
GridCommonAbstractTest {
             assert entry != null;
             assert entry.key() != null;
 
-            CacheValue val = CU.value(entry.rawGet(), entry.context());
+            CacheValue val = CU.value(entry.rawGet(), entry.context(), false);
 
             assert val != null;
-            assert CU.value(entry.key(), entry.context()) == val.value();
+            assert CU.value(entry.key(), entry.context(), false) == 
val.value();
             assert entry.version().equals(versions.get(i));
         }
     }

Reply via email to