# ignite-58

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

Branch: refs/heads/ignite-sql-tests
Commit: 6de2cedf2f58a2ecca64078ca27274849808f884
Parents: 53d1b80
Author: sboikov <semen.boi...@inria.fr>
Authored: Thu Feb 5 07:06:03 2015 +0300
Committer: sboikov <semen.boi...@inria.fr>
Committed: Thu Feb 5 07:06:03 2015 +0300

----------------------------------------------------------------------
 .../apache/ignite/cache/CacheProjection.java    |   7 +
 .../internal/managers/GridManagerAdapter.java   |   2 +-
 .../processors/cache/GridCacheAdapter.java      | 179 +++++++++++++++++-
 .../processors/cache/GridCacheEntryEx.java      |  12 ++
 .../processors/cache/GridCacheMapEntry.java     |  36 +++-
 .../cache/GridCacheProjectionImpl.java          |   5 +
 .../processors/cache/GridCacheProxyImpl.java    |  12 ++
 .../processors/cache/GridCacheSwapManager.java  |  41 ++++-
 .../processors/cache/IgniteCacheProxy.java      |   9 +-
 .../processors/cache/GridCacheTestEntryEx.java  |   6 +
 .../cache/IgniteCacheAtomicPeekTest.java        |  49 +++++
 .../cache/IgniteCachePeekAbstractTest.java      | 183 +++++++++++++++++++
 .../processors/query/h2/IgniteH2Indexing.java   |   2 +-
 13 files changed, 524 insertions(+), 19 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/modules/core/src/main/java/org/apache/ignite/cache/CacheProjection.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/cache/CacheProjection.java 
b/modules/core/src/main/java/org/apache/ignite/cache/CacheProjection.java
index 2cf10aa..6ca3008 100644
--- a/modules/core/src/main/java/org/apache/ignite/cache/CacheProjection.java
+++ b/modules/core/src/main/java/org/apache/ignite/cache/CacheProjection.java
@@ -473,6 +473,13 @@ public interface CacheProjection<K, V> extends 
Iterable<CacheEntry<K, V>> {
     @Nullable public V peek(K key);
 
     /**
+     * @param key Key.
+     * @param peekModes Peek modes.
+     * @return Value.
+     */
+    @Nullable public V localPeek(K key, CachePeekMode[] peekModes) throws 
IgniteCheckedException;
+
+    /**
      * Peeks at cached value using optional set of peek modes. This method 
will sequentially
      * iterate over given peek modes in the order passed in, and try to peek 
at value using
      * each peek mode. Once a {@code non-null} value is found, it will be 
immediately returned.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/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 32baa8c..db69d94 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
@@ -538,7 +538,7 @@ public abstract class GridManagerAdapter<T extends 
IgniteSpi> implements GridMan
                             if (cctx.isNear())
                                 cctx = cctx.near().dht().context();
 
-                            GridCacheSwapEntry e = cctx.swap().read(key);
+                            GridCacheSwapEntry e = cctx.swap().read(key, true, 
true);
 
                             return e != null ? (V)e.value() : null;
                         }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/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 393a3fc..0b3372c 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
@@ -667,6 +667,183 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
     }
 
     /** {@inheritDoc} */
+    @SuppressWarnings("ForLoopReplaceableByForEach")
+    @Nullable @Override public V localPeek(K key, CachePeekMode[] peekModes) 
throws IgniteCheckedException {
+        A.notNull(key, "key");
+
+        assert peekModes != null;
+
+        if (keyCheck)
+            validateCacheKey(key);
+
+        ctx.checkSecurity(GridSecurityPermission.CACHE_READ);
+
+        boolean near = false;
+        boolean primary = false;
+        boolean backup = false;
+
+        boolean heap = false;
+        boolean offheap = false;
+        boolean swap = false;
+
+        if (peekModes.length == 0) {
+            near = true;
+            primary = true;
+            backup = true;
+
+            heap = true;
+            offheap = true;
+            swap = true;
+        }
+        else {
+            for (int i = 0; i < peekModes.length; i++) {
+                CachePeekMode peekMode = peekModes[i];
+
+                A.notNull(peekMode, "peekMode");
+
+                switch (peekMode) {
+                    case ALL:
+                        break;
+
+                    case BACKUP:
+                        backup = true;
+
+                        break;
+
+                    case PRIMARY:
+                        primary = true;
+
+                        break;
+
+                    case NEAR:
+                        near = true;
+
+                        break;
+
+                    case ONHEAP:
+                        heap = true;
+
+                        break;
+
+                    case OFFHEAP:
+                        offheap = true;
+
+                        break;
+
+                    case SWAP:
+                        swap = true;
+
+                        break;
+
+                    default:
+                        assert false : peekMode;
+                }
+            }
+        }
+
+        if (!(heap || offheap || swap)) {
+            heap = true;
+            offheap = true;
+            swap = true;
+        }
+
+        if (!(primary || backup || near)) {
+            primary = true;
+            backup = true;
+            near = true;
+        }
+
+        assert heap || offheap || swap;
+        assert primary || backup || near;
+
+        try {
+            if (ctx.portableEnabled())
+                key = (K)ctx.marshalToPortable(key);
+
+            long topVer = ctx.affinity().affinityTopologyVersion();
+
+            int part = ctx.affinity().partition(key);
+
+            boolean nearKey;
+
+            if (!(near && primary && backup)) {
+                boolean keyPrimary = ctx.affinity().primary(ctx.localNode(), 
part, topVer);
+
+                if (keyPrimary) {
+                    if (!primary)
+                        return null;
+
+                    nearKey = false;
+                }
+                else {
+                    boolean keyBackup = 
ctx.affinity().belongs(ctx.localNode(), part, topVer);
+
+                    if (keyBackup) {
+                        if (!backup)
+                            return null;
+
+                        nearKey = false;
+                    }
+                    else {
+                        if (!near)
+                            return null;
+
+                        nearKey = true;
+
+                        // Swap and offheap are disabled for near cache.
+                        offheap = false;
+                        swap = false;
+                    }
+                }
+            }
+            else {
+                nearKey = !ctx.affinity().belongs(ctx.localNode(), part, 
topVer);
+
+                if (nearKey) {
+                    // Swap and offheap are disabled for near cache.
+                    offheap = false;
+                    swap = false;
+                }
+            }
+
+            if (nearKey && !ctx.isNear())
+                return null;
+
+            V val = null;
+
+            if (heap) {
+                GridCacheEntryEx<K, V> e = peekEx(key);
+
+                if (e != null) {
+                    val = e.peek(heap, offheap, swap, topVer);
+
+                    offheap = false;
+                    swap = false;
+                }
+            }
+
+            if (offheap || swap) {
+                GridCacheSwapManager<K, V> swapMgr = ctx.isNear() ? 
ctx.near().dht().context().swap() : ctx.swap();
+
+                GridCacheSwapEntry<V> swapEntry = swapMgr.read(key, offheap, 
swap);
+
+                val = swapEntry != null ? swapEntry.value() : null;
+            }
+
+            if (ctx.portableEnabled())
+                val = (V)ctx.unwrapPortableIfNeeded(val, ctx.keepPortable());
+
+            return val;
+        }
+        catch (GridCacheEntryRemovedException ignore) {
+            if (log.isDebugEnabled())
+                log.debug("Got removed entry during 'peek': " + key);
+
+            return null;
+        }
+    }
+
+    /** {@inheritDoc} */
     @Override public V peek(K key) {
         return peek(key, (IgnitePredicate<CacheEntry<K, V>>)null);
     }
@@ -871,7 +1048,7 @@ public abstract class GridCacheAdapter<K, V> implements 
GridCache<K, V>,
      * @throws IgniteCheckedException In case of any errors.
      */
     @Nullable private GridTuple<V> peekSwap(K key) throws 
IgniteCheckedException {
-        GridCacheSwapEntry<V> e = ctx.swap().read(key);
+        GridCacheSwapEntry<V> e = ctx.swap().read(key, true, true);
 
         return e != null ? F.t(e.value()) : null;
     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
index 72cb9a7..808336a 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheEntryEx.java
@@ -590,6 +590,18 @@ public interface GridCacheEntryEx<K, V> {
     /**
      * Peeks into entry without loading value or updating statistics.
      *
+     * @param heap Read from heap flag.
+     * @param offheap Read from offheap flag.
+     * @param swap Read from swap flag.
+     * @return Value.
+     * @throws GridCacheEntryRemovedException If entry has been removed.
+     */
+    @Nullable public V peek(boolean heap, boolean offheap, boolean swap, long 
topVer)
+        throws GridCacheEntryRemovedException, IgniteCheckedException;
+
+    /**
+     * Peeks into entry without loading value or updating statistics.
+     *
      * @param modes Peek modes.
      * @param filter Optional filter.
      * @return Value.

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
index 8fa46f2..0006c30 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheMapEntry.java
@@ -507,7 +507,7 @@ public abstract class GridCacheMapEntry<K, V> implements 
GridCacheEntryEx<K, V>
                     }
                 }
                 else
-                    e = detached() ? cctx.swap().read(this, true) : 
cctx.swap().readAndRemove(this);
+                    e = detached() ? cctx.swap().read(this, true, true, true) 
: cctx.swap().readAndRemove(this);
 
                 if (log.isDebugEnabled())
                     log.debug("Read swap entry [swapEntry=" + e + ", 
cacheEntry=" + this + ']');
@@ -2691,6 +2691,38 @@ public abstract class GridCacheMapEntry<K, V> implements 
GridCacheEntryEx<K, V>
     }
 
     /** {@inheritDoc} */
+    @Nullable @Override public V peek(boolean heap,
+        boolean offheap,
+        boolean swap,
+        long topVer)
+        throws GridCacheEntryRemovedException, IgniteCheckedException
+    {
+        assert heap || offheap || swap;
+
+        try {
+            if (heap) {
+                GridTuple<V> val = peekGlobal(false, topVer, null);
+
+                if (val != null)
+                    return val.get();
+            }
+
+            if (offheap || swap) {
+                GridCacheSwapEntry<V>  e = cctx.swap().read(this, false, 
offheap, swap);
+
+                return e != null ? e.value() : null;
+            }
+
+            return null;
+        }
+        catch (GridCacheFilterFailedException ignored) {
+            assert false;
+
+            return null;
+        }
+    }
+
+    /** {@inheritDoc} */
     @Override public V peek(Collection<GridCachePeekMode> modes, 
IgnitePredicate<CacheEntry<K, V>>[] filter)
         throws GridCacheEntryRemovedException {
         assert modes != null;
@@ -2949,7 +2981,7 @@ public abstract class GridCacheMapEntry<K, V> implements 
GridCacheEntryEx<K, V>
                 return null;
         }
 
-        GridCacheSwapEntry<V> e = cctx.swap().read(this, false);
+        GridCacheSwapEntry<V> e = cctx.swap().read(this, false, true, true);
 
         return e != null ? F.t(e.value()) : null;
     }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProjectionImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProjectionImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProjectionImpl.java
index 905444b..241c3c7 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProjectionImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProjectionImpl.java
@@ -1000,6 +1000,11 @@ public class GridCacheProjectionImpl<K, V> implements 
GridCacheProjectionEx<K, V
     }
 
     /** {@inheritDoc} */
+    @Nullable @Override public V localPeek(K key, CachePeekMode[] peekModes) 
throws IgniteCheckedException {
+        return cache.localPeek(key, peekModes);
+    }
+
+    /** {@inheritDoc} */
     @Override public V peek(K key, @Nullable Collection<GridCachePeekMode> 
modes) throws IgniteCheckedException {
         V val = cache.peek(key, modes);
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java
index b20628e..cf6b683 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheProxyImpl.java
@@ -1217,6 +1217,18 @@ public class GridCacheProxyImpl<K, V> implements 
GridCacheProxy<K, V>, Externali
     }
 
     /** {@inheritDoc} */
+    @Nullable @Override public V localPeek(K key, CachePeekMode[] peekModes) 
throws IgniteCheckedException {
+        GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
+
+        try {
+            return delegate.localPeek(key, peekModes);
+        }
+        finally {
+            gate.leave(prev);
+        }
+    }
+
+    /** {@inheritDoc} */
     @Nullable @Override public V peek(K key, @Nullable 
Collection<GridCachePeekMode> modes) throws IgniteCheckedException {
         GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
 

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/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 4f8b9dd..6a42b8c 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
@@ -429,14 +429,21 @@ public class GridCacheSwapManager<K, V> extends 
GridCacheManagerAdapter<K, V> {
      * @throws IgniteCheckedException If failed.
      */
     @SuppressWarnings({"unchecked"})
-    @Nullable GridCacheSwapEntry<V> read(K key, byte[] keyBytes, boolean 
entryLocked) throws IgniteCheckedException {
+    @Nullable private GridCacheSwapEntry<V> read(K key,
+        byte[] keyBytes,
+        int part,
+        boolean entryLocked,
+        boolean readOffheap,
+        boolean readSwap)
+        throws IgniteCheckedException
+    {
+        assert readOffheap || readSwap;
+
         if (!offheapEnabled && !swapEnabled)
             return null;
 
         checkIteratorQueue();
 
-        int part = cctx.affinity().partition(key);
-
         KeySwapListener<K, V> lsnr = null;
 
         try {
@@ -447,14 +454,14 @@ public class GridCacheSwapManager<K, V> extends 
GridCacheManagerAdapter<K, V> {
             }
 
             // First check off-heap store.
-            if (offheapEnabled) {
+            if (readOffheap && offheapEnabled) {
                 byte[] bytes = offheap.get(spaceName, part, key, keyBytes);
 
                 if (bytes != null)
                     return swapEntry(unmarshalSwapEntry(bytes));
             }
 
-            if (!swapEnabled)
+            if (!swapEnabled || !readSwap)
                 return null;
 
             assert key != null;
@@ -589,11 +596,21 @@ public class GridCacheSwapManager<K, V> extends 
GridCacheManagerAdapter<K, V> {
      * @return Read value.
      * @throws IgniteCheckedException If read failed.
      */
-    @Nullable GridCacheSwapEntry<V> read(GridCacheEntryEx<K, V> entry, boolean 
locked) throws IgniteCheckedException {
+    @Nullable GridCacheSwapEntry<V> read(GridCacheEntryEx<K, V> entry,
+        boolean locked,
+        boolean readOffheap,
+        boolean readSwap)
+        throws IgniteCheckedException
+    {
         if (!offheapEnabled && !swapEnabled)
             return null;
 
-        return read(entry.key(), entry.getOrMarshalKeyBytes(), locked);
+        return read(entry.key(),
+            entry.getOrMarshalKeyBytes(),
+            entry.partition(),
+            locked,
+            readOffheap,
+            readSwap);
     }
 
     /**
@@ -628,11 +645,17 @@ public class GridCacheSwapManager<K, V> extends 
GridCacheManagerAdapter<K, V> {
      * @return Read value.
      * @throws IgniteCheckedException If read failed.
      */
-    @Nullable public GridCacheSwapEntry<V> read(K key) throws 
IgniteCheckedException {
+    @Nullable public GridCacheSwapEntry<V> read(K key,
+        boolean readOffheap,
+        boolean readSwap)
+        throws IgniteCheckedException
+    {
         if (!offheapEnabled && !swapEnabled)
             return null;
 
-        return read(key, CU.marshal(cctx.shared(), key), false);
+        int part = cctx.affinity().partition(key);
+
+        return read(key, CU.marshal(cctx.shared(), key), part, false, 
readOffheap, readSwap);
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
index 43d231e..190cb04 100644
--- 
a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
+++ 
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheProxy.java
@@ -265,14 +265,13 @@ public class IgniteCacheProxy<K, V> extends 
IgniteAsyncSupportAdapter<IgniteCach
 
     /** {@inheritDoc} */
     @Nullable @Override public V localPeek(K key, CachePeekMode... peekModes) {
-        // TODO IGNITE-1.
-        if (peekModes.length != 0)
-            throw new UnsupportedOperationException();
-
         GridCacheProjectionImpl<K, V> prev = gate.enter(prj);
 
         try {
-            return delegate.peek(key);
+            return delegate.localPeek(key, peekModes);
+        }
+        catch (IgniteCheckedException e) {
+            throw cacheException(e);
         }
         finally {
             gate.leave(prev);

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
index 8c7e59d..6720f4e 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/GridCacheTestEntryEx.java
@@ -823,4 +823,10 @@ public class GridCacheTestEntryEx<K, V> extends 
GridMetadataAwareAdapter impleme
     @Override public long startVersion() {
         return 0;
     }
+
+    /** {@inheritDoc} */
+    @Nullable @Override public V peek(boolean heap, boolean offheap, boolean 
swap, long topVer)
+        throws GridCacheEntryRemovedException, IgniteCheckedException {
+        return null;
+    }
 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAtomicPeekTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAtomicPeekTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAtomicPeekTest.java
new file mode 100644
index 0000000..c2085ec
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCacheAtomicPeekTest.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.ignite.internal.processors.cache;
+
+import org.apache.ignite.cache.*;
+
+import static org.apache.ignite.cache.CacheAtomicWriteOrderMode.*;
+import static org.apache.ignite.cache.CacheAtomicityMode.*;
+import static org.apache.ignite.cache.CacheMode.*;
+
+/**
+ *
+ */
+public class IgniteCacheAtomicPeekTest extends IgniteCachePeekAbstractTest {
+    /** {@inheritDoc} */
+    @Override protected int gridCount() {
+        return 4;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheMode cacheMode() {
+        return PARTITIONED;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicityMode atomicityMode() {
+        return ATOMIC;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheAtomicWriteOrderMode atomicWriteOrderMode() {
+        return PRIMARY;
+    }
+}

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePeekAbstractTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePeekAbstractTest.java
 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePeekAbstractTest.java
new file mode 100644
index 0000000..f8aaaca
--- /dev/null
+++ 
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/IgniteCachePeekAbstractTest.java
@@ -0,0 +1,183 @@
+/*
+ * 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.*;
+import org.apache.ignite.cache.*;
+import org.apache.ignite.cache.affinity.*;
+import org.apache.ignite.cache.eviction.fifo.*;
+import org.apache.ignite.configuration.*;
+import org.apache.ignite.spi.*;
+import org.apache.ignite.spi.swapspace.inmemory.*;
+
+import java.util.*;
+
+import static org.apache.ignite.cache.CacheDistributionMode.*;
+import static org.apache.ignite.cache.CachePeekMode.*;
+
+/**
+ *
+ */
+public abstract class IgniteCachePeekAbstractTest extends 
IgniteCacheAbstractTest {
+    /** */
+    private static final int HEAP_ENTRIES = 10;
+
+    /** {@inheritDoc} */
+    @Override protected IgniteConfiguration getConfiguration(String gridName) 
throws Exception {
+        IgniteConfiguration cfg = super.getConfiguration(gridName);
+
+        cfg.setSwapSpaceSpi(new GridTestSwapSpaceSpi());
+
+        return cfg;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheDistributionMode distributionMode() {
+        return PARTITIONED_ONLY;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected CacheConfiguration cacheConfiguration(String gridName) 
throws Exception {
+        CacheConfiguration ccfg = super.cacheConfiguration(gridName);
+
+        ccfg.setMemoryMode(CacheMemoryMode.ONHEAP_TIERED);
+
+        ccfg.setOffHeapMaxMemory(512);
+
+        ccfg.setBackups(1);
+
+        if (gridName.equals(getTestGridName(0)))
+            ccfg.setDistributionMode(NEAR_PARTITIONED);
+
+        ccfg.setEvictionPolicy(new CacheFifoEvictionPolicy(HEAP_ENTRIES));
+
+        return ccfg;
+    }
+
+    /** {@inheritDoc} */
+    @Override protected boolean swapEnabled() {
+        return true;
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    public void testLocalPeek() throws Exception {
+        checkStorage();
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    private void checkAffinity() throws Exception {
+        IgniteCache<Integer, String> cache0 = jcache(0);
+
+        Integer key = nearKey(cache0);
+
+        final String val = "1";
+
+        cache0.put(key, val);
+
+        assertEquals(val, cache(0).peek(key));
+        assertEquals(val, cache0.localPeek(key, NEAR));
+        assertEquals(val, cache0.localPeek(key, ALL));
+        assertNull(cache0.localPeek(key, PRIMARY));
+        assertNull(cache0.localPeek(key, BACKUP));
+
+        CacheAffinity<Integer> aff = ignite(0).affinity(null);
+
+        for (int i = 1; i < gridCount(); i++) {
+            IgniteCache<Integer, String> cache = jcache(i);
+
+            assertNull(cache.localPeek(key, NEAR));
+
+            if (aff.isPrimary(ignite(i).cluster().localNode(), key)) {
+                assertEquals(val, cache.localPeek(key, PRIMARY));
+                assertEquals(val, cache.localPeek(key, ALL));
+                assertNull(cache.localPeek(key, BACKUP));
+                assertNull(cache.localPeek(key, NEAR));
+            }
+            else if (aff.isBackup(ignite(i).cluster().localNode(), key)) {
+                assertEquals(val, cache.localPeek(key, BACKUP));
+                assertEquals(val, cache.localPeek(key, ALL));
+                assertNull(cache.localPeek(key, PRIMARY));
+                assertNull(cache.localPeek(key, NEAR));
+            }
+            else {
+                assertNull(cache.localPeek(key, ALL));
+                assertNull(cache.localPeek(key, PRIMARY));
+                assertNull(cache.localPeek(key, BACKUP));
+                assertNull(cache.localPeek(key, NEAR));
+            }
+        }
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
+    private void checkStorage() throws Exception {
+        IgniteCache<Integer, String> cache0 = jcache(0);
+
+        List<Integer> keys = primaryKeys(cache0, 100, 10_000);
+
+        final String val = "test_value";
+
+        for (Integer key : keys)
+            cache0.put(key, val);
+
+        GridTestSwapSpaceSpi swap = 
(GridTestSwapSpaceSpi)ignite(0).configuration().getSwapSpaceSpi();
+
+        Set<Integer> swapKeys = new HashSet<>();
+
+        final String spaceName = "gg-swap-cache-dflt";
+
+        IgniteSpiCloseableIterator<Integer> it = swap.keyIterator(spaceName, 
null);
+
+        assertNotNull(it);
+
+        while (it.hasNext())
+            assertTrue(swapKeys.add(it.next()));
+
+        assertFalse(swapKeys.isEmpty());
+
+        assertTrue(swapKeys.size() + HEAP_ENTRIES < 100);
+
+        List<Integer> offheapKeys = new ArrayList<>(keys);
+
+        for (Integer key : swapKeys) {
+            assertEquals(val, cache0.localPeek(key, SWAP));
+
+            assertNull(cache0.localPeek(key, ONHEAP));
+            assertNull(cache0.localPeek(key, OFFHEAP));
+
+            offheapKeys.remove(key);
+        }
+
+        for (int i = 0; i < HEAP_ENTRIES; i++) {
+            Integer key = keys.get(keys.size() - i - 1);
+
+            assertFalse(swapKeys.contains(key));
+            assertEquals(val, cache0.localPeek(key, ONHEAP));
+
+            assertNull(cache0.localPeek(key, SWAP));
+            assertNull(cache0.localPeek(key, OFFHEAP));
+
+            offheapKeys.remove(key);
+        }
+    }
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/6de2cedf/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 cb774d0..50015a4 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
@@ -1994,7 +1994,7 @@ public class IgniteH2Indexing implements 
GridQueryIndexing {
             if (cctx.isNear())
                 cctx = cctx.near().dht().context();
 
-            GridCacheSwapEntry e = cctx.swap().read(key);
+            GridCacheSwapEntry e = cctx.swap().read(key, true, true);
 
             return e != null ? e.value() : null;
         }

Reply via email to