# 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)); } }