You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by ag...@apache.org on 2017/01/11 17:27:35 UTC

[06/22] ignite git commit: gg-11414: refactoring after core review

gg-11414: refactoring after core review


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

Branch: refs/heads/ignite-3477
Commit: 0712a8139c3fd17f6d089ce3ace9bb221e488616
Parents: ccc1956
Author: Sergey Sidorov <ss...@gridgain.com>
Authored: Fri Nov 25 13:41:02 2016 +0300
Committer: Sergey Sidorov <ss...@gridgain.com>
Committed: Fri Nov 25 17:26:55 2016 +0300

----------------------------------------------------------------------
 .../cache/IgniteCacheOffheapManagerImpl.java    |  2 +-
 .../cache/database/tree/BPlusTree.java          | 50 ++----------
 .../apache/ignite/internal/util/IgniteTree.java | 24 +-----
 .../offheap/unsafe/GridOffHeapSnapTreeMap.java  | 82 +-------------------
 .../internal/util/snaptree/SnapTreeMap.java     | 76 +-----------------
 .../processors/database/BPlusTreeSelfTest.java  |  6 +-
 .../query/h2/opt/GridH2SpatialIndex.java        | 24 ++++--
 .../internal/processors/query/h2/H2Cursor.java  |  4 +
 .../query/h2/database/H2TreeIndex.java          |  6 +-
 .../query/h2/opt/GridH2IndexBase.java           |  6 +-
 .../query/h2/opt/GridH2TreeIndex.java           | 59 +++++++-------
 11 files changed, 66 insertions(+), 273 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/0712a813/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
index 861bb11..66896d2 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
@@ -897,7 +897,7 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
 
         /** {@inheritDoc} */
         @Override public GridCursor<? extends CacheDataRow> cursor() throws IgniteCheckedException {
-            return dataTree.findAll();
+            return dataTree.find(null, null);
         }
 
         /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/0712a813/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
index d60246e..57d420d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/BPlusTree.java
@@ -727,7 +727,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
      * @return Cursor.
      * @throws IgniteCheckedException If failed.
      */
-    public final GridCursor<T> find(L lower, L upper) throws IgniteCheckedException {
+    @Override public final GridCursor<T> find(L lower, L upper) throws IgniteCheckedException {
         checkDestroyed();
 
         try {
@@ -751,34 +751,12 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
         }
     }
 
-    public GridCursor<T> find(L lower, boolean lowerInclusive,
-                              L upper, boolean upperInclusive) throws IgniteCheckedException {
-        if (lower == null || upper == null)
-            throw new NullPointerException();
-
-        ForwardCursor cursor = new ForwardCursor(lower, upper);
-
-        if (!lowerInclusive)
-            cursor.lowerShift = 1;
-
-        if (!upperInclusive)
-            cursor.upperShift = -1;
-
-        cursor.find();
-
-        return cursor;
-    }
-
-    public GridCursor<T> findAll() throws IgniteCheckedException {
-        return find(null, null);
-    }
-
     /**
      * @param row Lookup row for exact match.
      * @return Found row.
      */
     @SuppressWarnings("unchecked")
-    public final T findOne(L row) throws IgniteCheckedException {
+    @Override public final T findOne(L row) throws IgniteCheckedException {
         checkDestroyed();
 
         try {
@@ -1270,14 +1248,10 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
      * @return Removed row.
      * @throws IgniteCheckedException If failed.
      */
-    public final T remove(L row) throws IgniteCheckedException {
+    @Override public final T remove(L row) throws IgniteCheckedException {
         return doRemove(row, false, null);
     }
 
-    @Override public T removeNode(L key) throws IgniteCheckedException {
-        return doRemove(key, false, null);
-    }
-
     /**
      * @param row Lookup row.
      * @param ceil If we can remove ceil row when we can not find exact.
@@ -1490,7 +1464,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
      * @return Size.
      * @throws IgniteCheckedException If failed.
      */
-    public final long size() throws IgniteCheckedException {
+    @Override public final long size() throws IgniteCheckedException {
         checkDestroyed();
 
         long pageId;
@@ -1530,14 +1504,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
     /**
      * {@inheritDoc}
      */
-    public final long treeSize() throws IgniteCheckedException {
-        return size();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    public final T put(T row) throws IgniteCheckedException {
+    @Override public final T put(T row) throws IgniteCheckedException {
         return put(row, null);
     }
 
@@ -3476,9 +3443,6 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
         /** */
         private final L upperBound;
 
-        /** */
-        private int upperShift = 1; // Initially it is -1 to handle multiple equal rows.
-
         /**
          * @param lowerBound Lower bound.
          * @param upperBound Upper bound.
@@ -3550,8 +3514,8 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
             // Compare with the last row on the page.
             int cmp = compare(io, buf, cnt - 1, upperBound);
 
-            if (cmp > 0 || (cmp == 0 && upperShift == -1)) {
-                int idx = findInsertionPoint(io, buf, low, cnt, upperBound, upperShift);
+            if (cmp > 0) {
+                int idx = findInsertionPoint(io, buf, low, cnt, upperBound, 1);
 
                 assert idx < 0;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/0712a813/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteTree.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteTree.java b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteTree.java
index 512792b..0c08cd9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteTree.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/IgniteTree.java
@@ -45,19 +45,6 @@ public interface IgniteTree<L, T> {
     T findOne(L key) throws IgniteCheckedException;
 
     /**
-     * Returns a cursor from lower to upper bounds.
-     *
-     * @param lower Lower bound or {@code null} if unbounded.
-     * @param lowerInclusive {@code true} if the low bound
-     *        is to be included in the returned view
-     * @param upper Upper bound or {@code null} if unbounded.
-     * @param upperInclusive {@code true} if the upper bound
-     *        is to be included in the returned view
-     * @return Cursor.
-     */
-    GridCursor<T> find(L lower, boolean lowerInclusive,  L upper, boolean upperInclusive) throws IgniteCheckedException;
-
-    /**
      * Returns a cursor from lower to upper bounds inclusive.
      *
      * @param lower Lower bound or {@code null} if unbounded.
@@ -67,24 +54,17 @@ public interface IgniteTree<L, T> {
     GridCursor<T> find(L lower, L upper) throws IgniteCheckedException;
 
     /**
-     * Returns a cursor over all values.
-     * @return Cursor.
-     * @throws IgniteCheckedException
-     */
-    GridCursor<T> findAll() throws IgniteCheckedException;
-
-    /**
      * Removes the mapping for a key from this tree if it is present.
      *
      * @param key key whose mapping is to be removed from the tree
      * @return the previous value associated with key, or null if there was no mapping for key.
      */
-    T removeNode(L key) throws IgniteCheckedException;
+    T remove(L key) throws IgniteCheckedException;
 
     /**
      * Returns the number of elements in this tree.
      *
      * @return the number of elements in this tree
      */
-    long treeSize() throws IgniteCheckedException;
+    long size() throws IgniteCheckedException;
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/0712a813/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridOffHeapSnapTreeMap.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridOffHeapSnapTreeMap.java b/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridOffHeapSnapTreeMap.java
index ab175de..6a97f9e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridOffHeapSnapTreeMap.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/offheap/unsafe/GridOffHeapSnapTreeMap.java
@@ -112,7 +112,7 @@ import org.jsr166.ConcurrentHashMap8;
 @SuppressWarnings("ALL")
 public class GridOffHeapSnapTreeMap<K extends GridOffHeapSmartPointer, V extends GridOffHeapSmartPointer>
     extends AbstractMap<K, V>
-    implements ConcurrentNavigableMap<K, V>, Cloneable, AutoCloseable, GridReservable, IgniteTree<K, V> {
+    implements ConcurrentNavigableMap<K, V>, Cloneable, AutoCloseable, GridReservable {
     /** This is a special value that indicates that an optimistic read failed. */
     private static final GridOffHeapSmartPointer SpecialRetry = new GridOffHeapSmartPointer() {
         @Override public long pointer() {
@@ -3825,52 +3825,10 @@ public class GridOffHeapSnapTreeMap<K extends GridOffHeapSmartPointer, V extends
         return new SubMap(this, null, null, false, null, null, false, true);
     }
 
-    //////////////// IgniteTree
-
-    @Override public V put(V value) throws IgniteCheckedException {
-        return put((K)value, value);
-    }
-
-    @Override public V findOne(K key) throws IgniteCheckedException {
-        return get(key);
-    }
-
-    @Override public GridCursor<V> findAll() throws IgniteCheckedException {
-        return find(null, null);
-    }
-
-    @Override public GridCursor<V> find(K lower, K upper) throws IgniteCheckedException {
-        return find(lower, true, upper, true);
-    }
-
-    @Override public GridCursor<V> find(K lower, boolean lowerInclusive,  K upper, boolean upperInclusive)
-        throws IgniteCheckedException {
-        if (lower == null || upper == null)
-            throw new NullPointerException();
-
-        final Comparable<? super K> fromCmp = comparable(lower);
-
-        if (fromCmp.compareTo(upper) > 0) {
-            throw new IllegalArgumentException();
-        }
-
-        SubMap subMap = new SubMap(this, lower, fromCmp, lowerInclusive, upper, comparable(upper), upperInclusive, false);
-
-        return new GridCursorIteratorWrapper<>(subMap.values().iterator());
-    }
-
-    @Override public V removeNode(K key) throws IgniteCheckedException {
-        return remove(key);
-    }
-
-    @Override public long treeSize() throws IgniteCheckedException {
-        return size();
-    }
-
     /**
      * Submap.
      */
-    private class SubMap extends AbstractMap<K, V> implements ConcurrentNavigableMap<K, V>, IgniteTree<K, V> {
+    private class SubMap extends AbstractMap<K, V> implements ConcurrentNavigableMap<K, V> {
         /** */
         private final GridOffHeapSnapTreeMap<K,V> m;
 
@@ -4476,42 +4434,6 @@ public class GridOffHeapSnapTreeMap<K extends GridOffHeapSmartPointer, V extends
         @Override public NavigableSet<K> descendingKeySet() {
             return descendingMap().navigableKeySet();
         }
-
-        /////////// IgniteTree
-
-        @Override public V put(V value) throws IgniteCheckedException {
-            return put((K)value, value);
-        }
-
-        @Override public V findOne(K key) throws IgniteCheckedException {
-            return get(key);
-        }
-
-        @Override public GridCursor<V> findAll() throws IgniteCheckedException {
-            return find(null, null);
-        }
-
-        @Override public GridCursor<V> find(K lower, K upper) throws IgniteCheckedException {
-            return find(lower, true, upper, true);
-        }
-
-        @Override public GridCursor<V> find(K lower, boolean lowerInclusive,  K upper, boolean upperInclusive)
-            throws IgniteCheckedException {
-            if (lower == null || upper == null)
-                throw new NullPointerException();
-
-            SubMap subMap = subMap(lower, lowerInclusive, upper, upperInclusive);
-
-            return new GridCursorIteratorWrapper(subMap.values().iterator());
-        }
-
-        @Override public V removeNode(K key) throws IgniteCheckedException {
-            return remove(key);
-        }
-
-        @Override public long treeSize() throws IgniteCheckedException {
-            return size();
-        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/0712a813/modules/core/src/main/java/org/apache/ignite/internal/util/snaptree/SnapTreeMap.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/util/snaptree/SnapTreeMap.java b/modules/core/src/main/java/org/apache/ignite/internal/util/snaptree/SnapTreeMap.java
index 79c110d..dce2fb8 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/util/snaptree/SnapTreeMap.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/util/snaptree/SnapTreeMap.java
@@ -107,7 +107,7 @@ import java.util.concurrent.ConcurrentNavigableMap;
  */
 @SuppressWarnings("ALL")
 public class SnapTreeMap<K, V> extends AbstractMap<K, V> implements ConcurrentNavigableMap<K, V>, Cloneable,
-    Serializable, IgniteTree<K, V> {
+    Serializable {
 
     /** */
     private static final long serialVersionUID = 0L;
@@ -2347,43 +2347,7 @@ public class SnapTreeMap<K, V> extends AbstractMap<K, V> implements ConcurrentNa
         return new SubMap(this, null, null, false, null, null, false, true);
     }
 
-    //////////////// IgniteTree
-
-    @Override public GridCursor<V> find(K lower, boolean lowerInclusive,
-        K upper, boolean upperInclusive) throws IgniteCheckedException {
-        if (lower == null || upper == null)
-            throw new NullPointerException();
-
-        return new GridCursorIteratorWrapper<>(subMap(lower, lowerInclusive, upper, upperInclusive)
-            .values().iterator());
-    }
-
-    public GridCursor<V> find(K lower, K upper) throws IgniteCheckedException {
-        return find(lower, true, upper, true);
-    }
-
-    public GridCursor<V> findAll() throws IgniteCheckedException {
-        return find(null, null);
-    }
-
-    @Override public V findOne(K key) throws IgniteCheckedException {
-        return get(key);
-    }
-
-    @Override public long treeSize() throws IgniteCheckedException {
-        return size();
-    }
-
-    @Override public V put(V value) throws IgniteCheckedException {
-        return put((K)value, value);
-    }
-
-    @Override public V removeNode(K key) throws IgniteCheckedException {
-        return remove(key);
-    }
-
-    private static class SubMap<K, V> extends AbstractMap<K, V> implements ConcurrentNavigableMap<K, V>, Serializable,
-        IgniteTree<K, V> {
+    private static class SubMap<K, V> extends AbstractMap<K, V> implements ConcurrentNavigableMap<K, V>, Serializable {
         /** */
         private static final long serialVersionUID = 0L;
 
@@ -2905,42 +2869,6 @@ public class SnapTreeMap<K, V> extends AbstractMap<K, V> implements ConcurrentNa
             minCmp = minKey == null ? null : m.comparable(minKey);
             maxCmp = maxKey == null ? null : m.comparable(maxKey);
         }
-
-        /////// IgniteTree
-
-        @Override public V findOne(K key) throws IgniteCheckedException {
-            return get(key);
-        }
-
-        @Override public GridCursor<V> find(K lower, boolean lowerInclusive,
-                                            K upper, boolean upperInclusive) throws IgniteCheckedException {
-
-            if (lower == null || upper == null)
-                throw new NullPointerException();
-
-            return new GridCursorIteratorWrapper<>(subMap(lower, lowerInclusive, upper, upperInclusive)
-                .values().iterator());
-        }
-
-        public GridCursor<V> find(K lower, K upper) throws IgniteCheckedException {
-            return find(lower, true, upper, true);
-        }
-
-        public GridCursor<V> findAll() throws IgniteCheckedException {
-            return find(null, null);
-        }
-
-        @Override public long treeSize() throws IgniteCheckedException {
-            return size();
-        }
-
-        @Override public V put(V value) throws IgniteCheckedException {
-            return put((K)value, value);
-        }
-
-        @Override public V removeNode(K key) throws IgniteCheckedException {
-            return remove(key);
-        }
     }
 
     //////// Serialization

http://git-wip-us.apache.org/repos/asf/ignite/blob/0712a813/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
index 88edaf1..4dcb7a9 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/database/BPlusTreeSelfTest.java
@@ -184,12 +184,8 @@ public class BPlusTreeSelfTest extends GridCommonAbstractTest {
             map.put(i, i);
         }
 
-        checkCursor(tree.findAll(), map.values().iterator());
+        checkCursor(tree.find(null, null), map.values().iterator());
         checkCursor(tree.find(10L, 70L), map.subMap(10L, true, 70L, true).values().iterator());
-        checkCursor(tree.find(10L, true, 50L, false), map.subMap(10L, true, 50L, false).values().iterator());
-        checkCursor(tree.find(10L, false, 50L, true), map.subMap(10L, false, 50L, true).values().iterator());
-        checkCursor(tree.find(10L, false, 50L, false), map.subMap(10L, false, 50L, false).values().iterator());
-        checkCursor(tree.find(10L, true, 50L, true), map.subMap(10L, true, 50L, true).values().iterator());
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/0712a813/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
----------------------------------------------------------------------
diff --git a/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java b/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
index ed91800..b6060b4 100644
--- a/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
+++ b/modules/geospatial/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2SpatialIndex.java
@@ -28,6 +28,11 @@ import java.util.Map;
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReadWriteLock;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
+
+import org.apache.ignite.*;
+import org.apache.ignite.internal.processors.query.h2.*;
+import org.apache.ignite.internal.util.*;
+import org.apache.ignite.internal.util.lang.*;
 import org.h2.engine.Session;
 import org.h2.index.Cursor;
 import org.h2.index.IndexType;
@@ -119,7 +124,7 @@ public class GridH2SpatialIndex extends GridH2IndexBase implements SpatialIndex
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override protected Object doTakeSnapshot() {
+    @Nullable @Override protected IgniteTree doTakeSnapshot() {
         return null; // TODO We do not support snapshots, but probably this is possible.
     }
 
@@ -258,7 +263,7 @@ public class GridH2SpatialIndex extends GridH2IndexBase implements SpatialIndex
         try {
             checkClosed();
 
-            return new GridH2Cursor(rowIterator(treeMap.keySet().iterator(), filter));
+            return new H2Cursor(rowIterator(treeMap.keySet().iterator(), filter));
         }
         finally {
             l.unlock();
@@ -280,9 +285,9 @@ public class GridH2SpatialIndex extends GridH2IndexBase implements SpatialIndex
      * @param filter Table filter.
      * @return Iterator over rows.
      */
-    private Iterator<GridH2Row> rowIterator(Iterator<SpatialKey> i, TableFilter filter) {
+    private GridCursor<GridH2Row> rowIterator(Iterator<SpatialKey> i, TableFilter filter) {
         if (!i.hasNext())
-            return Collections.emptyIterator();
+            return EMPTY_CURSOR;
 
         List<GridH2Row> rows = new ArrayList<>();
 
@@ -295,7 +300,7 @@ public class GridH2SpatialIndex extends GridH2IndexBase implements SpatialIndex
         }
         while (i.hasNext());
 
-        return filter(rows.iterator(), threadLocalFilter());
+        return filter(new GridCursorIteratorWrapper(rows.iterator()), threadLocalFilter());
     }
 
     /** {@inheritDoc} */
@@ -310,9 +315,12 @@ public class GridH2SpatialIndex extends GridH2IndexBase implements SpatialIndex
             if (!first)
                 throw DbException.throwInternalError("Spatial Index can only be fetch by ascending order");
 
-            Iterator<GridH2Row> iter = rowIterator(treeMap.keySet().iterator(), null);
+            GridCursor<GridH2Row> iter = rowIterator(treeMap.keySet().iterator(), null);
 
-            return new SingleRowCursor(iter.hasNext() ? iter.next() : null);
+            return new SingleRowCursor(iter.next() ? iter.get() : null);
+        }
+        catch (IgniteCheckedException e) {
+            throw DbException.convert(e);
         }
         finally {
             l.unlock();
@@ -339,7 +347,7 @@ public class GridH2SpatialIndex extends GridH2IndexBase implements SpatialIndex
             if (intersection == null)
                 return find(filter.getSession(), null, null);
 
-            return new GridH2Cursor(rowIterator(treeMap.findIntersectingKeys(getEnvelope(intersection, 0)), filter));
+            return new H2Cursor(rowIterator(treeMap.findIntersectingKeys(getEnvelope(intersection, 0)), filter));
         }
         finally {
             l.unlock();

http://git-wip-us.apache.org/repos/asf/ignite/blob/0712a813/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Cursor.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Cursor.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Cursor.java
index 95114a2..cc71813 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Cursor.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/H2Cursor.java
@@ -50,6 +50,10 @@ public class H2Cursor implements Cursor {
         this.filter = filter;
     }
 
+    public H2Cursor(GridCursor<GridH2Row> cursor) {
+        this(cursor, null);
+    }
+
     /** {@inheritDoc} */
     @Override public Row get() {
         try {

http://git-wip-us.apache.org/repos/asf/ignite/blob/0712a813/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
index b56b1ed..f685f3a 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/database/H2TreeIndex.java
@@ -207,10 +207,8 @@ public class H2TreeIndex extends GridH2IndexBase {
     }
 
     /** {@inheritDoc} */
-    @Nullable @Override protected Object doTakeSnapshot() {
-        assert false;
-
-        return this;
+    @Nullable @Override protected IgniteTree<SearchRow, GridH2Row> doTakeSnapshot() {
+        return tree;
     }
 
     protected IgniteTree<SearchRow, GridH2Row> treeForRead() {

http://git-wip-us.apache.org/repos/asf/ignite/blob/0712a813/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
index 84d3b6a..56c9edc 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2IndexBase.java
@@ -276,7 +276,7 @@ public abstract class GridH2IndexBase extends BaseIndex {
      *
      * @return Snapshot or {@code null}.
      */
-    @Nullable protected abstract Object doTakeSnapshot();
+    @Nullable protected abstract IgniteTree doTakeSnapshot();
 
     /**
      * @return Thread local snapshot.
@@ -456,12 +456,10 @@ public abstract class GridH2IndexBase extends BaseIndex {
 
                 if (msg.bounds() != null) {
                     // This is the first request containing all the search rows.
-                    Object snapshot0 = qctx.getSnapshot(idxId);
+                    IgniteTree snapshotTree = qctx.getSnapshot(idxId);
 
                     assert !msg.bounds().isEmpty() : "empty bounds";
 
-                    IgniteTree snapshotTree = (IgniteTree)snapshot0;
-
                     src = new RangeSource(msg.bounds(), snapshotTree, qctx.filter());
                 }
                 else {

http://git-wip-us.apache.org/repos/asf/ignite/blob/0712a813/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
----------------------------------------------------------------------
diff --git a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
index f442e4e..d1f2d28 100644
--- a/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
+++ b/modules/indexing/src/main/java/org/apache/ignite/internal/processors/query/h2/opt/GridH2TreeIndex.java
@@ -17,9 +17,7 @@
 
 package org.apache.ignite.internal.processors.query.h2.opt;
 
-import java.util.Comparator;
-import java.util.List;
-import java.util.NavigableMap;
+import java.util.*;
 import java.util.concurrent.ConcurrentSkipListMap;
 
 import org.apache.ignite.*;
@@ -50,7 +48,7 @@ import org.jetbrains.annotations.Nullable;
 @SuppressWarnings("ComparatorNotSerializable")
 public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridSearchRowPointer> {
     /** */
-    private final IgniteTree<GridSearchRowPointer, GridH2Row> tree;
+    private final IgniteNavigableMapTree tree;
 
     /** */
     private final boolean snapshotEnabled;
@@ -78,7 +76,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
             snapshotEnabled = desc == null || desc.snapshotableIndex();
 
             if (snapshotEnabled) {
-                tree = new SnapTreeMap<GridSearchRowPointer, GridH2Row>(this) {
+                tree = new IgniteNavigableMapTree(new SnapTreeMap<GridSearchRowPointer, GridH2Row>(this) {
                     @Override protected void afterNodeUpdate_nl(Node<GridSearchRowPointer, GridH2Row> node, Object val) {
                         if (val != null)
                             node.key = (GridSearchRowPointer)val;
@@ -90,7 +88,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
 
                         return super.comparable(key);
                     }
-                };
+                });
             }
             else {
                 tree = new IgniteNavigableMapTree(
@@ -114,7 +112,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
 
             snapshotEnabled = true;
 
-            tree = new GridOffHeapSnapTreeMap<GridSearchRowPointer, GridH2Row>(desc, desc, desc.memory(), desc.guard(), this) {
+            tree = new IgniteNavigableMapTree(new GridOffHeapSnapTreeMap<GridSearchRowPointer, GridH2Row>(desc, desc, desc.memory(), desc.guard(), this) {
                 @Override protected void afterNodeUpdate_nl(long node, GridH2Row val) {
                     final long oldKey = keyPtr(node);
 
@@ -135,19 +133,17 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
 
                     return super.comparable(key);
                 }
-            };
+            });
         }
 
         initDistributedJoinMessaging(tbl);
     }
 
     /** {@inheritDoc} */
-    @Override protected Object doTakeSnapshot() {
+    @Override protected IgniteTree doTakeSnapshot() {
         assert snapshotEnabled;
 
-        return tree instanceof SnapTreeMap ?
-            ((SnapTreeMap)tree).clone() :
-            ((GridOffHeapSnapTreeMap)tree).clone();
+        return tree.clone();
     }
 
     /** {@inheritDoc} */
@@ -167,9 +163,6 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
     @Override public void destroy() {
         assert threadLocalSnapshot() == null;
 
-        if (tree instanceof AutoCloseable)
-            U.closeQuiet((AutoCloseable)tree);
-
         super.destroy();
     }
 
@@ -180,7 +173,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
         // Fast path if we don't need to perform any filtering.
         if (f == null || f.forSpace((getTable()).spaceName()) == null)
             try {
-                return treeForRead().treeSize();
+                return treeForRead().size();
             } catch (IgniteCheckedException e) {
                 throw DbException.convert(e);
             }
@@ -338,7 +331,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
         try {
             // We take exclusive bounds because it is possible that one search row will be equal to multiple key rows
             // in tree and we must return them all.
-            return tree.find(first, false, last, false);
+            return tree.find(first, last);
         }
         catch (IgniteCheckedException e) {
             throw DbException.convert(e);
@@ -377,7 +370,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
     /** {@inheritDoc} */
     @Override public GridH2Row remove(SearchRow row) {
         try {
-            return tree.removeNode(comparable(row, 0));
+            return tree.remove(comparable(row, 0));
         }
         catch (IgniteCheckedException e) {
             throw DbException.convert(e);
@@ -487,7 +480,7 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
         long i = 0;
 
         try {
-            GridCursor<GridH2Row> cursor = tree.findAll();
+            GridCursor<GridH2Row> cursor = tree.find(null, null);
 
             while(cursor.next()) {
                 GridH2Row row = cursor.get();
@@ -524,33 +517,35 @@ public class GridH2TreeIndex extends GridH2IndexBase implements Comparator<GridS
             return tree.get(key);
         }
 
-        @Override public GridCursor<GridH2Row> find(GridSearchRowPointer lower, boolean lowerInclusive,
-                                                    GridSearchRowPointer upper, boolean upperInclusive)
+        @Override public GridCursor<GridH2Row> find(GridSearchRowPointer lower, GridSearchRowPointer upper)
             throws IgniteCheckedException {
             if (lower == null || upper == null)
                 throw new NullPointerException();
 
             NavigableMap<GridSearchRowPointer, GridH2Row> subMap =
-                tree.subMap(lower, lowerInclusive, upper, upperInclusive);
+                tree.subMap(lower, false, upper, false);
 
             return new GridCursorIteratorWrapper<GridH2Row>(subMap.values().iterator());
         }
 
-        public GridCursor<GridH2Row> find(GridSearchRowPointer lower, GridSearchRowPointer upper)
-            throws IgniteCheckedException {
-            return find(lower, true, upper, true);
+        @Override public GridH2Row remove(GridSearchRowPointer key) throws IgniteCheckedException {
+            return tree.remove(key);
         }
 
-        public GridCursor<GridH2Row> findAll() throws IgniteCheckedException {
-            return find(null, null);
+        @Override public long size() throws IgniteCheckedException {
+            return tree.size();
         }
 
-        @Override public GridH2Row removeNode(GridSearchRowPointer key) throws IgniteCheckedException {
-            return tree.remove(key);
-        }
+        @Override public IgniteNavigableMapTree clone() {
+            AbstractMap copy;
 
-        @Override public long treeSize() throws IgniteCheckedException {
-            return tree.size();
+            try {
+                copy = (AbstractMap) super.clone();
+            } catch (final CloneNotSupportedException e) {
+                throw DbException.convert(e);
+            }
+
+            return new IgniteNavigableMapTree((NavigableMap)copy);
         }
     }
 }
\ No newline at end of file