ignite-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From sboi...@apache.org
Subject ignite git commit: Merge remote-tracking branch 'remotes/community/ignite-db' into ignite-db-x-10884
Date Wed, 20 Apr 2016 13:03:03 GMT
Repository: ignite
Updated Branches:
  refs/heads/ignite-db-x-10884 38ead2a78 -> 35d26f4e4


Merge remote-tracking branch 'remotes/community/ignite-db' into ignite-db-x-10884

Conflicts:
	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRow.java
	modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/io/FreeIO.java
	modules/indexing/src/main/java/org/apache/ignite/internal/processors/cache/database/IgniteCacheH2DatabaseManager.java


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

Branch: refs/heads/ignite-db-x-10884
Commit: 35d26f4e4c2ba9a0b20a2fa214b9e777585b2ec6
Parents: 38ead2a
Author: sboikov <sboikov@gridgain.com>
Authored: Wed Apr 20 16:02:59 2016 +0300
Committer: sboikov <sboikov@gridgain.com>
Committed: Wed Apr 20 16:02:59 2016 +0300

----------------------------------------------------------------------
 .../processors/cache/GridCacheAdapter.java      |  13 +-
 .../cache/GridCacheClearAllRunnable.java        |   4 +-
 .../cache/IgniteCacheOffheapManager.java        | 153 +++++++++++++++++++
 .../cache/query/GridCacheQueryManager.java      |   6 +
 .../processors/query/GridQueryIndexing.java     |   4 +
 .../processors/query/GridQueryProcessor.java    |  17 +++
 .../cache/database/IgniteDbPutGetTest.java      |  19 +++
 .../processors/query/h2/IgniteH2Indexing.java   |  36 ++++-
 .../query/h2/database/H2TreeIndex.java          |   7 +
 9 files changed, 246 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/35d26f4e/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 7ee404c..bbbb096 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
@@ -3903,17 +3903,10 @@ public abstract class GridCacheAdapter<K, V> implements IgniteInternalCache<K,
V
         if (modes.primary || modes.backup) {
             AffinityTopologyVersion topVer = ctx.affinity().affinityTopologyVersion();
 
-            GridCacheSwapManager swapMgr = ctx.isNear() ? ctx.near().dht().context().swap()
: ctx.swap();
-
-            if (modes.swap)
-                size += swapMgr.swapEntriesCount(modes.primary, modes.backup, topVer);
+            IgniteCacheOffheapManager offheap = ctx.isNear() ? ctx.near().dht().context().offheap0()
: ctx.offheap0();
 
-            if (modes.offheap) {
-                if (ctx.isDatabaseEnabled())
-                    size += ctx.database().entriesCount(modes.primary, modes.backup, topVer);
-                else
-                    size += swapMgr.offheapEntriesCount(modes.primary, modes.backup, topVer);
-            }
+            if (modes.offheap)
+                size += offheap.entriesCount(modes.primary, modes.backup, topVer);
         }
 
         return size;

http://git-wip-us.apache.org/repos/asf/ignite/blob/35d26f4e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java
index b4a62c7..f627f4c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/GridCacheClearAllRunnable.java
@@ -87,8 +87,8 @@ public class GridCacheClearAllRunnable<K, V> implements Runnable {
 
         // Clear swapped entries.
         if (!ctx.isNear()) {
-            if (ctx.isDatabaseEnabled())
-                ctx.database().clear(readers);
+            // TODO GG-10884.
+            ctx.offheap0().clear(readers);
 
             if (ctx.swap().offHeapEnabled()) {
                 if (GridQueryProcessor.isEnabled(ctx.config())) {

http://git-wip-us.apache.org/repos/asf/ignite/blob/35d26f4e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
index b96446a..068a71f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManager.java
@@ -18,12 +18,17 @@
 package org.apache.ignite.internal.processors.cache;
 
 import java.nio.ByteBuffer;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.IgniteException;
+import org.apache.ignite.cluster.ClusterNode;
 import org.apache.ignite.internal.pagemem.FullPageId;
 import org.apache.ignite.internal.pagemem.Page;
 import org.apache.ignite.internal.pagemem.PageIdUtils;
 import org.apache.ignite.internal.pagemem.PageMemory;
+import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
 import org.apache.ignite.internal.processors.cache.database.IgniteCacheDatabaseSharedManager;
 import org.apache.ignite.internal.processors.cache.database.RowStore;
@@ -35,8 +40,12 @@ import org.apache.ignite.internal.processors.cache.database.tree.io.BPlusLeafIO;
 import org.apache.ignite.internal.processors.cache.database.tree.io.DataPageIO;
 import org.apache.ignite.internal.processors.cache.database.tree.io.IOVersions;
 import org.apache.ignite.internal.processors.cache.database.tree.io.PageIO;
+import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtInvalidPartitionException;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
+import org.apache.ignite.internal.util.lang.GridCursor;
 import org.apache.ignite.internal.util.typedef.F;
+import org.apache.ignite.internal.util.typedef.internal.S;
+import org.apache.ignite.internal.util.typedef.internal.U;
 import org.apache.ignite.lang.IgniteBiTuple;
 import org.jetbrains.annotations.Nullable;
 
@@ -147,6 +156,139 @@ public class IgniteCacheOffheapManager extends GridCacheManagerAdapter
{
     }
 
     /**
+     * Clears offheap entries.
+     *
+     * @param readers {@code True} to clear readers.
+     */
+    public void clear(boolean readers) {
+        if (!enabled)
+            return;
+
+        if (dataTree != null)
+            clear(dataTree, readers);
+
+        if (indexingEnabled) {
+            List<BPlusTree<?, ? extends CacheDataRow>> idxs = cctx.queries().pkIndexes();
+
+            for (BPlusTree<?, ? extends CacheDataRow> tree : idxs)
+                clear(tree, readers);
+        }
+    }
+
+    /**
+     * @param tree Tree.
+     * @param readers {@code True} to clear readers.
+     */
+    private void clear(BPlusTree<?, ? extends CacheDataRow> tree, boolean readers)
{
+        try {
+            GridCursor<? extends CacheDataRow> cur = tree.find(null, null);
+
+            Collection<KeyCacheObject> keys = new ArrayList<>();
+
+            while (cur.next()) {
+                CacheDataRow row = cur.get();
+
+                try {
+                    KeyCacheObject key = row.key() instanceof KeyCacheObject ? (KeyCacheObject)row.key()
:
+                        cctx.toCacheKeyObject(row.key().valueBytes(cctx.cacheObjectContext()));
+
+                    keys.add(key);
+                }
+                catch (IgniteCheckedException e) {
+                    U.error(log, "Failed to obtain cache key: " + row.key(), e);
+                }
+            }
+
+            GridCacheVersion obsoleteVer = null;
+
+            for (KeyCacheObject key : keys) {
+                try {
+                    if (obsoleteVer == null)
+                        obsoleteVer = cctx.versions().next();
+
+                    GridCacheEntryEx entry = cctx.cache().entryEx(key);
+
+                    entry.clear(obsoleteVer, readers, null);
+                }
+                catch (GridDhtInvalidPartitionException ignore) {
+                    // Ignore.
+                }
+                catch (IgniteCheckedException e) {
+                    U.error(log, "Failed to clear cache entry: " + key, e);
+                }
+            }
+        }
+        catch (IgniteCheckedException e) {
+            U.error(log, "Failed to clear cache entries.", e);
+        }
+    }
+
+    /**
+     * @param tree Tree.
+     * @param primary Include primary node keys.
+     * @param backup Include backup node keys.
+     * @param topVer Topology version.
+     * @return Entries count.
+     * @throws IgniteCheckedException If failed.
+     */
+    private long entriesCount(BPlusTree<?, ? extends CacheDataRow> tree,
+        boolean primary,
+        boolean backup,
+        AffinityTopologyVersion topVer) throws IgniteCheckedException {
+        GridCursor<? extends CacheDataRow> cur = tree.find(null, null);
+
+        ClusterNode locNode = cctx.localNode();
+
+        long cnt = 0;
+
+        while (cur.next()) {
+            CacheDataRow row = cur.get();
+
+            if (primary) {
+                if (cctx.affinity().primary(locNode, row.partition(), topVer)) {
+                    cnt++;
+
+                    continue;
+                }
+            }
+
+            if (backup) {
+                if (cctx.affinity().backup(locNode, row.partition(), topVer))
+                    cnt++;
+            }
+        }
+
+        return cnt;
+    }
+
+    /**
+     * @param primary Include primary node keys.
+     * @param backup Include backup node keys.
+     * @param topVer Topology version.
+     * @return Entries count.
+     * @throws IgniteCheckedException If failed.
+     */
+    public long entriesCount(boolean primary, boolean backup, AffinityTopologyVersion topVer)
+        throws IgniteCheckedException {
+        if (!enabled)
+            return 0;
+
+        long cnt = 0;
+
+        if (dataTree != null)
+            cnt += entriesCount(dataTree, primary, backup, topVer);
+
+        if (indexingEnabled) {
+            List<BPlusTree<?, ? extends CacheDataRow>> idxs = cctx.queries().pkIndexes();
+
+            for (BPlusTree<?, ? extends CacheDataRow> tree : idxs)
+                cnt += entriesCount(tree, primary, backup, topVer);
+        }
+
+        return cnt;
+    }
+
+    /**
      *
      */
     static class KeySearchRow {
@@ -159,6 +301,11 @@ public class IgniteCacheOffheapManager extends GridCacheManagerAdapter
{
         public KeySearchRow(CacheObject key) {
             this.key = key;
         }
+
+        /** {@inheritDoc} */
+        public String toString() {
+            return S.toString(KeySearchRow.class, this);
+        }
     }
 
     /**
@@ -186,6 +333,7 @@ public class IgniteCacheOffheapManager extends GridCacheManagerAdapter
{
          */
         public DataRow(CacheObject key, CacheObject val, GridCacheVersion ver, int part,
long link) {
             super(key);
+
             this.val = val;
             this.ver = ver;
             this.part = part;
@@ -221,6 +369,11 @@ public class IgniteCacheOffheapManager extends GridCacheManagerAdapter
{
         @Override public void link(long link) {
             this.link = link;
         }
+
+        /** {@inheritDoc} */
+        public String toString() {
+            return S.toString(DataRow.class, this);
+        }
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/35d26f4e/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
index 51f0fca..060f881 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/query/GridCacheQueryManager.java
@@ -65,6 +65,8 @@ import org.apache.ignite.internal.processors.cache.GridCacheSwapEntryImpl;
 import org.apache.ignite.internal.processors.cache.IgniteCacheExpiryPolicy;
 import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
+import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtCacheAdapter;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtLocalPartition;
 import org.apache.ignite.internal.processors.cache.distributed.dht.GridDhtUnreservedPartitionException;
@@ -428,6 +430,10 @@ public abstract class GridCacheQueryManager<K, V> extends GridCacheManagerAdapte
         }
     }
 
+    public List<BPlusTree<?, ? extends CacheDataRow>> pkIndexes() {
+        return qryProc.pkIndexes(space);
+    }
+
     /**
      * @param key Key.
      * @param val Value.

http://git-wip-us.apache.org/repos/asf/ignite/blob/35d26f4e/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
index a1c3524..8d53ab0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryIndexing.java
@@ -30,6 +30,8 @@ import org.apache.ignite.internal.processors.affinity.AffinityTopologyVersion;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
+import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree;
 import org.apache.ignite.internal.processors.cache.query.GridCacheTwoStepQuery;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.util.GridSpinBusyLock;
@@ -207,6 +209,8 @@ public interface GridQueryIndexing {
      */
     IgniteBiTuple<CacheObject,GridCacheVersion> read(String space, KeyCacheObject key,
int partId) throws IgniteCheckedException;
 
+    public List<BPlusTree<?, ? extends CacheDataRow>> pkIndexes(String space);
+
     /**
      * Will be called when entry with given key is swapped.
      *

http://git-wip-us.apache.org/repos/asf/ignite/blob/35d26f4e/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
index a350d93..76fe12e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/query/GridQueryProcessor.java
@@ -44,6 +44,8 @@ import org.apache.ignite.internal.processors.cache.GridCacheContext;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.processors.cache.QueryCursorImpl;
 import org.apache.ignite.internal.processors.cache.binary.CacheObjectBinaryProcessorImpl;
+import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
+import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree;
 import org.apache.ignite.internal.processors.cache.query.CacheQueryFuture;
 import org.apache.ignite.internal.processors.cache.query.CacheQueryType;
 import org.apache.ignite.internal.processors.cache.query.GridCacheTwoStepQuery;
@@ -728,6 +730,21 @@ public class GridQueryProcessor extends GridProcessorAdapter {
         }
     }
 
+    public List<BPlusTree<?, ? extends CacheDataRow>> pkIndexes(String space)
{
+        if (idx == null)
+            return null;
+
+        if (!busyLock.enterBusy())
+            throw new IllegalStateException("Failed to write to index (grid is stopping).");
+
+        try {
+            return idx.pkIndexes(space);
+        }
+        finally {
+            busyLock.leaveBusy();
+        }
+    }
+
     /**
      * @throws IgniteCheckedException If failed.
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/35d26f4e/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/database/IgniteDbPutGetTest.java
----------------------------------------------------------------------
diff --git a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/database/IgniteDbPutGetTest.java
b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/database/IgniteDbPutGetTest.java
index fe39d30..a83422d 100644
--- a/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/database/IgniteDbPutGetTest.java
+++ b/modules/core/src/test/java/org/apache/ignite/internal/processors/cache/database/IgniteDbPutGetTest.java
@@ -77,6 +77,25 @@ public class IgniteDbPutGetTest extends GridCommonAbstractTest {
     /**
      * @throws Exception If failed.
      */
+    public void testSizeClear() throws Exception {
+        Ignite ignite = ignite(0);
+
+        IgniteCache<Integer, Integer> cache = ignite.cache(null);
+
+        cache.put(1, 1);
+        cache.put(2, 2);
+
+        assertEquals(2, cache.size());
+
+        cache.clear();
+
+        assertNull(cache.get(1));
+        assertNull(cache.get(2));
+    }
+
+    /**
+     * @throws Exception If failed.
+     */
     public void testPutGet() throws Exception {
         Ignite ignite = ignite(0);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/35d26f4e/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 463fbeb..a3695c2 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
@@ -77,7 +77,9 @@ import org.apache.ignite.internal.processors.cache.GridCacheSharedContext;
 import org.apache.ignite.internal.processors.cache.IgniteInternalCache;
 import org.apache.ignite.internal.processors.cache.KeyCacheObject;
 import org.apache.ignite.internal.processors.cache.QueryCursorImpl;
+import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
 import org.apache.ignite.internal.processors.cache.database.IgniteCacheDatabaseSharedManager;
+import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree;
 import org.apache.ignite.internal.processors.cache.query.GridCacheTwoStepQuery;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 import org.apache.ignite.internal.processors.query.GridQueryFieldMetadata;
@@ -628,6 +630,27 @@ public class IgniteH2Indexing implements GridQueryIndexing {
     }
 
     /** {@inheritDoc} */
+    @Override public List<BPlusTree<?, ? extends CacheDataRow>> pkIndexes(String
spaceName) {
+        Schema schema = schemas.get(schema(spaceName));
+
+        if (schema == null)
+            return Collections.emptyList();
+
+        List<BPlusTree<?, ? extends CacheDataRow>> res = null;
+
+        for (TableDescriptor tbl : schema.tbls.values()) {
+            if (tbl.pkTreeIdx != null) {
+                if (res == null)
+                    res = new ArrayList<>();
+
+                res.add(tbl.pkTreeIdx.tree());
+            }
+        }
+
+        return res != null ? res : Collections.<BPlusTree<?, ? extends CacheDataRow>>emptyList();
+    }
+
+    /** {@inheritDoc} */
     @Override public void onSwap(@Nullable String spaceName, KeyCacheObject key, int partId)
throws IgniteCheckedException {
         Schema schema = schemas.get(schema(spaceName));
 
@@ -1935,6 +1958,9 @@ public class IgniteH2Indexing implements GridQueryIndexing {
         /** */
         private GridLuceneIndex luceneIdx;
 
+        /** */
+        private H2TreeIndex pkTreeIdx;
+
         /**
          * @param schema Schema.
          * @param type Type descriptor.
@@ -2116,7 +2142,7 @@ public class IgniteH2Indexing implements GridQueryIndexing {
                 log.info("Creating cache index [cacheId=" + cctx.cacheId() + ", idxName="
+ name +
                     ", rootPageId=" + page.get1() + ", allocated=" + page.get2() + ']');
 
-            return new H2TreeIndex(
+            H2TreeIndex idx = new H2TreeIndex(
                 cctx,
                 dbMgr.pageMemory(),
                 page.get1(),
@@ -2127,6 +2153,14 @@ public class IgniteH2Indexing implements GridQueryIndexing {
                 name,
                 pk,
                 cols);
+
+            if (pk) {
+                assert pkTreeIdx == null : pkTreeIdx;
+
+                pkTreeIdx = idx;
+            }
+
+            return idx;
         }
 
         /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/35d26f4e/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 5960586..13a12dc 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
@@ -97,6 +97,13 @@ public class H2TreeIndex extends GridH2IndexBase {
         };
     }
 
+    /**
+     * @return Tree.
+     */
+    public H2Tree tree() {
+        return tree;
+    }
+
     /** {@inheritDoc} */
     @Override public Cursor find(Session ses, SearchRow lower, SearchRow upper) {
         try {


Mime
View raw message