You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ignite.apache.org by sb...@apache.org on 2016/12/21 15:25:32 UTC

[2/2] ignite git commit: ignite-gg-11810

ignite-gg-11810


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

Branch: refs/heads/ignite-11810
Commit: 8fcac6f29c0fdad1b6af4acad232a5b24a71bbb7
Parents: 53e2cd2
Author: sboikov <sb...@gridgain.com>
Authored: Wed Dec 21 17:34:38 2016 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Wed Dec 21 18:25:19 2016 +0300

----------------------------------------------------------------------
 .../apache/ignite/internal/pagemem/Page.java    |  15 +++
 .../ignite/internal/pagemem/PageMemory.java     |   2 +-
 .../ignite/internal/pagemem/PageUtils.java      |  66 ++++++++++++
 .../internal/pagemem/impl/PageNoStoreImpl.java  |  40 +++++++-
 .../wal/record/delta/MetaPageAddRootRecord.java |   2 +-
 .../wal/record/delta/MetaPageCutRootRecord.java |   2 +-
 .../record/delta/MetaPageInitRootRecord.java    |   2 +-
 .../cache/database/DataStructure.java           |  18 ++--
 .../cache/database/freelist/FreeListImpl.java   |   4 +-
 .../cache/database/freelist/PagesList.java      | 100 +++++++++----------
 .../database/freelist/io/PagesListMetaIO.java   |  41 ++++----
 .../database/freelist/io/PagesListNodeIO.java   |  56 +++++------
 .../cache/database/tree/BPlusTree.java          |  14 +--
 .../cache/database/tree/io/BPlusIO.java         |  73 ++++++--------
 .../cache/database/tree/io/BPlusInnerIO.java    |  32 +++---
 .../cache/database/tree/io/BPlusLeafIO.java     |   6 +-
 .../cache/database/tree/io/BPlusMetaIO.java     |  38 +++----
 .../cache/database/tree/io/CacheVersionIO.java  |  32 +++---
 .../cache/database/tree/io/DataPageIO.java      |  16 +--
 .../cache/database/tree/io/IOVersions.java      |   4 +-
 .../cache/database/tree/io/PageIO.java          |  50 +++++-----
 .../cache/database/tree/io/PageMetaIO.java      |  61 ++++++-----
 .../database/tree/io/PagePartitionMetaIO.java   |  39 ++++----
 .../cache/database/tree/io/TrackingPageIO.java  |  49 ++++-----
 .../cache/database/tree/util/PageHandler.java   |  79 +++++++--------
 .../database/tree/util/PageLockListener.java    |   8 +-
 .../apache/ignite/internal/util/GridUnsafe.java |   2 +-
 27 files changed, 480 insertions(+), 371 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/pagemem/Page.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/Page.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/Page.java
index e08fad6..89848cc 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/Page.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/Page.java
@@ -44,6 +44,11 @@ public interface Page extends AutoCloseable {
     public ByteBuffer getForRead();
 
     /**
+     * @return Pointer for modifying the page.
+     */
+    public long getForReadPointer();
+
+    /**
      * Releases reserved page. Released page can be evicted from RAM after flushing modifications to disk.
      */
     public void releaseRead();
@@ -54,11 +59,21 @@ public interface Page extends AutoCloseable {
     public ByteBuffer getForWrite();
 
     /**
+     * @return ByteBuffer for modifying the page.
+     */
+    public long getForWritePointer();
+
+    /**
      * @return ByteBuffer for modifying the page of {@code null} if failed to get write lock.
      */
     @Nullable public ByteBuffer tryGetForWrite();
 
     /**
+     * @return ByteBuffer for modifying the page of {@code null} if failed to get write lock.
+     */
+    public long tryGetForWritePointer();
+
+    /**
      * Releases reserved page. Released page can be evicted from RAM after flushing modifications to disk.
      */
     public void releaseWrite(boolean markDirty);

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java
index 53b37f6..27c090e 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageMemory.java
@@ -25,7 +25,7 @@ import org.apache.ignite.lifecycle.LifecycleAware;
  */
 public interface PageMemory extends LifecycleAware, PageIdAllocator {
     /** */
-    ByteOrder NATIVE_BYTE_ORDER = ByteOrder.nativeOrder();
+    public ByteOrder NATIVE_BYTE_ORDER = ByteOrder.nativeOrder();
 
     /**
      * Gets the page associated with the given page ID. Each page obtained with this method must be released by

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java
new file mode 100644
index 0000000..69719e1
--- /dev/null
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/PageUtils.java
@@ -0,0 +1,66 @@
+/*
+ * 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.pagemem;
+
+import org.apache.ignite.internal.util.GridUnsafe;
+import sun.misc.Unsafe;
+
+/**
+ *
+ */
+@SuppressWarnings("deprecation")
+public class PageUtils {
+    /** */
+    private static final Unsafe unsafe = GridUnsafe.UNSAFE;
+
+    public static byte getByte(long buf, int off) {
+        return unsafe.getByte(buf, off);
+    }
+
+    public static short getShort(long buf, int off) {
+        return unsafe.getShort(buf, off);
+    }
+
+    public static int getInt(long buf, int off) {
+        return unsafe.getInt(buf, off);
+    }
+
+    public static long getLong(long buf, int off) {
+        return unsafe.getLong(buf, off);
+    }
+
+    public static void putBytes(long buf, int off, byte[] bytes) {
+        unsafe.copyMemory(bytes, GridUnsafe.BYTE_ARR_OFF, null, buf + off, bytes.length);
+    }
+
+    public static void putByte(long buf, int off, byte v) {
+        unsafe.putByte(buf, off, v);
+    }
+
+    public static void putShort(long buf, int off, short v) {
+        unsafe.putShort(buf, off, v);
+    }
+
+    public static void putInt(long buf, int off, int v) {
+        unsafe.putInt(buf, off, v);
+    }
+
+    public static void putLong(long buf, int off, long v) {
+        unsafe.putLong(buf, off, v);
+    }
+}

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageNoStoreImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageNoStoreImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageNoStoreImpl.java
index 404c0b2..0ad206b 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageNoStoreImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageNoStoreImpl.java
@@ -26,6 +26,7 @@ import org.apache.ignite.internal.util.OffheapReadWriteLock;
 import org.apache.ignite.internal.util.typedef.internal.SB;
 
 import java.nio.ByteBuffer;
+import org.jetbrains.annotations.Nullable;
 
 /**
  *
@@ -70,6 +71,10 @@ public class PageNoStoreImpl implements Page {
         buf = pageMem.wrapPointer(absPtr + PageMemoryNoStoreImpl.PAGE_OVERHEAD, pageMem.pageSize());
     }
 
+    private long pointer() {
+        return absPtr + PageMemoryNoStoreImpl.PAGE_OVERHEAD;
+    }
+
     /** {@inheritDoc} */
     @Override public long id() {
         return pageId;
@@ -89,6 +94,14 @@ public class PageNoStoreImpl implements Page {
     }
 
     /** {@inheritDoc} */
+    @Override public long getForReadPointer() {
+        if (pageMem.readLockPage(absPtr, PageIdUtils.tag(pageId)))
+            return pointer();
+
+        return 0L;
+    }
+
+    /** {@inheritDoc} */
     @Override public void releaseRead() {
         pageMem.readUnlockPage(absPtr);
     }
@@ -107,8 +120,31 @@ public class PageNoStoreImpl implements Page {
     }
 
     /** {@inheritDoc} */
-    @Override public ByteBuffer tryGetForWrite() {
+    @Override public long getForWritePointer() {
         int tag =  noTagCheck ? OffheapReadWriteLock.TAG_LOCK_ALWAYS :  PageIdUtils.tag(pageId);
+        boolean locked = pageMem.writeLockPage(absPtr, tag);
+
+        if (!locked && !noTagCheck)
+            return 0L;
+
+        assert locked;
+
+        return pointer();
+    }
+
+    /** {@inheritDoc} */
+    @Override public long tryGetForWritePointer() {
+        int tag = noTagCheck ? OffheapReadWriteLock.TAG_LOCK_ALWAYS :  PageIdUtils.tag(pageId);
+
+        if (pageMem.tryWriteLockPage(absPtr, tag))
+            return pointer();
+
+        return 0L;
+    }
+
+    /** {@inheritDoc} */
+    @Override public ByteBuffer tryGetForWrite() {
+        int tag = noTagCheck ? OffheapReadWriteLock.TAG_LOCK_ALWAYS :  PageIdUtils.tag(pageId);
 
         if (pageMem.tryWriteLockPage(absPtr, tag))
             return reset(buf);
@@ -118,7 +154,7 @@ public class PageNoStoreImpl implements Page {
 
     /** {@inheritDoc} */
     @Override public void releaseWrite(boolean markDirty) {
-        long updatedPageId = PageIO.getPageId(buf);
+        long updatedPageId = PageIO.getPageId(pointer());
 
         pageMem.writeUnlockPage(absPtr, PageIdUtils.tag(updatedPageId));
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageAddRootRecord.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageAddRootRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageAddRootRecord.java
index 75aaca4..a84933c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageAddRootRecord.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageAddRootRecord.java
@@ -43,7 +43,7 @@ public class MetaPageAddRootRecord extends PageDeltaRecord {
     @Override public void applyDelta(ByteBuffer buf) throws IgniteCheckedException {
         BPlusMetaIO io = BPlusMetaIO.VERSIONS.forPage(buf);
 
-        io.addRoot(buf, rootId);
+        io.addRoot(0, buf, rootId);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageCutRootRecord.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageCutRootRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageCutRootRecord.java
index ba1d04d..1145736 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageCutRootRecord.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageCutRootRecord.java
@@ -37,7 +37,7 @@ public class MetaPageCutRootRecord extends PageDeltaRecord {
     @Override public void applyDelta(ByteBuffer buf) throws IgniteCheckedException {
         BPlusMetaIO io = BPlusMetaIO.VERSIONS.forPage(buf);
 
-        io.cutRoot(buf);
+        io.cutRoot(0, buf);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageInitRootRecord.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageInitRootRecord.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageInitRootRecord.java
index a9d2677..96bc949 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageInitRootRecord.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/wal/record/delta/MetaPageInitRootRecord.java
@@ -44,7 +44,7 @@ public class MetaPageInitRootRecord extends PageDeltaRecord {
         throws IgniteCheckedException {
         BPlusMetaIO io = BPlusMetaIO.VERSIONS.forPage(buf);
 
-        io.initRoot(buf, rootId);
+        io.initRoot(0, buf, rootId);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/DataStructure.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/DataStructure.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/DataStructure.java
index 5fd64b0..26df029 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/DataStructure.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/DataStructure.java
@@ -133,7 +133,7 @@ public abstract class DataStructure implements PageLockListener {
      * @param page Page.
      * @return Buffer.
      */
-    protected final ByteBuffer tryWriteLock(Page page) {
+    protected final long tryWriteLock(Page page) {
         return PageHandler.writeLock(page, this, true);
     }
 
@@ -142,7 +142,7 @@ public abstract class DataStructure implements PageLockListener {
      * @param page Page.
      * @return Buffer.
      */
-    protected final ByteBuffer writeLock(Page page) {
+    protected final long writeLock(Page page) {
         return PageHandler.writeLock(page, this, false);
     }
 
@@ -151,7 +151,7 @@ public abstract class DataStructure implements PageLockListener {
      * @param buf Buffer.
      * @param dirty Dirty page.
      */
-    protected final void writeUnlock(Page page, ByteBuffer buf, boolean dirty) {
+    protected final void writeUnlock(Page page, long buf, boolean dirty) {
         PageHandler.writeUnlock(page, buf, this, dirty);
     }
 
@@ -159,7 +159,7 @@ public abstract class DataStructure implements PageLockListener {
      * @param page Page.
      * @return Buffer.
      */
-    protected final ByteBuffer readLock(Page page) {
+    protected final long readLock(Page page) {
         return PageHandler.readLock(page, this);
     }
 
@@ -167,7 +167,7 @@ public abstract class DataStructure implements PageLockListener {
      * @param page Page.
      * @param buf Buffer.
      */
-    protected final void readUnlock(Page page, ByteBuffer buf) {
+    protected final void readUnlock(Page page, long buf) {
         PageHandler.readUnlock(page, buf, this);
     }
 
@@ -177,12 +177,12 @@ public abstract class DataStructure implements PageLockListener {
     }
 
     /** {@inheritDoc} */
-    @Override public void onWriteLock(Page page, ByteBuffer buf) {
+    @Override public void onWriteLock(Page page, long buf) {
         // No-op.
     }
 
     /** {@inheritDoc} */
-    @Override public void onWriteUnlock(Page page, ByteBuffer buf) {
+    @Override public void onWriteUnlock(Page page, long buf) {
         // No-op.
     }
 
@@ -192,12 +192,12 @@ public abstract class DataStructure implements PageLockListener {
     }
 
     /** {@inheritDoc} */
-    @Override public void onReadLock(Page page, ByteBuffer buf) {
+    @Override public void onReadLock(Page page, long buf) {
         // No-op.
     }
 
     /** {@inheritDoc} */
-    @Override public void onReadUnlock(Page page, ByteBuffer buf) {
+    @Override public void onReadUnlock(Page page, long buf) {
         // No-op.
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
index 6a29027..af20d15 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/FreeListImpl.java
@@ -72,7 +72,7 @@ public class FreeListImpl extends PagesList implements FreeList, ReuseList {
     /** */
     private final PageHandler<CacheDataRow, Integer> writeRow =
         new PageHandler<CacheDataRow, Integer>() {
-            @Override public Integer run(Page page, PageIO iox, ByteBuffer buf, CacheDataRow row, int written)
+            @Override public Integer run(Page page, PageIO iox, long buf, CacheDataRow row, int written)
                 throws IgniteCheckedException {
                 DataPageIO io = (DataPageIO)iox;
 
@@ -380,7 +380,7 @@ public class FreeListImpl extends PagesList implements FreeList, ReuseList {
     @Override public void addForRecycle(ReuseBag bag) throws IgniteCheckedException {
         assert reuseList == this: "not allowed to be a reuse list";
 
-        put(bag, null, null, REUSE_BUCKET);
+        put(bag, null, 0L, REUSE_BUCKET);
     }
 
     /** {@inheritDoc} */

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
index cc85412..8311b65 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/PagesList.java
@@ -85,7 +85,7 @@ public abstract class PagesList extends DataStructure {
 
     /** */
     private final PageHandler<Void, Boolean> cutTail = new PageHandler<Void, Boolean>() {
-        @Override public Boolean run(Page page, PageIO pageIo, ByteBuffer buf, Void ignore, int bucket)
+        @Override public Boolean run(Page page, PageIO pageIo, long buf, Void ignore, int bucket)
             throws IgniteCheckedException {
             assert getPageId(buf) == page.id();
 
@@ -149,9 +149,9 @@ public abstract class PagesList extends DataStructure {
 
                 while (nextPageId != 0) {
                     try (Page page = page(nextPageId)) {
-                        ByteBuffer buf = readLock(page); // No concurrent recycling on init.
+                        long buf = readLock(page); // No concurrent recycling on init.
 
-                        assert buf != null;
+                        assert buf != 0L;
 
                         try {
                             PagesListMetaIO io = PagesListMetaIO.VERSIONS.forPage(buf);
@@ -198,7 +198,7 @@ public abstract class PagesList extends DataStructure {
         assert metaPageId != 0;
 
         Page curPage = null;
-        ByteBuffer curBuf = null;
+        long curBuf = 0L;
         PagesListMetaIO curIo = null;
 
         long nextPageId = metaPageId;
@@ -211,7 +211,7 @@ public abstract class PagesList extends DataStructure {
                     int tailIdx = 0;
 
                     while (tailIdx < tails.length) {
-                        int written = curPage != null ? curIo.addTails(curBuf, bucket, tails, tailIdx) : 0;
+                        int written = curPage != null ? curIo.addTails(pageMem.pageSize(), curBuf, bucket, tails, tailIdx) : 0;
 
                         if (written == 0) {
                             if (nextPageId == 0L) {
@@ -257,7 +257,7 @@ public abstract class PagesList extends DataStructure {
 
         while (nextPageId != 0L) {
             try (Page page = page(nextPageId)) {
-                ByteBuffer buf = writeLock(page);
+                long buf = writeLock(page);
 
                 try {
                     PagesListMetaIO io = PagesListMetaIO.VERSIONS.forPage(buf);
@@ -277,7 +277,7 @@ public abstract class PagesList extends DataStructure {
      * @param page Page.
      * @param buf Buffer.
      */
-    private void releaseAndClose(Page page, ByteBuffer buf) {
+    private void releaseAndClose(Page page, long buf) {
         if (page != null) {
             try {
                 // No special WAL record because we most likely changed the whole page.
@@ -318,7 +318,7 @@ public abstract class PagesList extends DataStructure {
      * @param nextId Next page ID.
      * @param next Next page buffer.
      */
-    private void setupNextPage(PagesListNodeIO io, long prevId, ByteBuffer prev, long nextId, ByteBuffer next) {
+    private void setupNextPage(PagesListNodeIO io, long prevId, long prev, long nextId, long next) {
         assert io.getNextId(prev) == 0L;
 
         io.initNewPage(next, nextId);
@@ -462,7 +462,7 @@ public abstract class PagesList extends DataStructure {
                 long pageId = tail.tailId;
 
                 try (Page page = page(pageId)) {
-                    ByteBuffer buf = readLock(page); // No correctness guaranties.
+                    long buf = readLock(page); // No correctness guaranties.
 
                     try {
                         PagesListNodeIO io = PagesListNodeIO.VERSIONS.forPage(buf);
@@ -489,9 +489,9 @@ public abstract class PagesList extends DataStructure {
      * @param bucket Bucket.
      * @throws IgniteCheckedException If failed.
      */
-    protected final void put(ReuseBag bag, Page dataPage, ByteBuffer dataPageBuf, int bucket)
+    protected final void put(ReuseBag bag, Page dataPage, long dataPageBuf, int bucket)
         throws IgniteCheckedException {
-        assert bag == null ^ dataPageBuf == null;
+        assert bag == null ^ dataPageBuf == 0L;
 
         for (int lockAttempt = 0; ;) {
             Stripe stripe = getPageForPut(bucket);
@@ -499,9 +499,9 @@ public abstract class PagesList extends DataStructure {
             long tailId = stripe.tailId;
 
             try (Page tail = page(tailId)) {
-                ByteBuffer buf = writeLockPage(tail, bucket, lockAttempt++); // Explicit check.
+                long buf = writeLockPage(tail, bucket, lockAttempt++); // Explicit check.
 
-                if (buf == null)
+                if (buf == 0L)
                     continue;
 
                 assert PageIO.getPageId(buf) == tailId : "bufPageId = " + PageIO.getPageId(buf) + ", tailId = " + tailId;
@@ -547,10 +547,10 @@ public abstract class PagesList extends DataStructure {
     private boolean putDataPage(
         long pageId,
         Page page,
-        ByteBuffer buf,
+        long buf,
         PagesListNodeIO io,
         Page dataPage,
-        ByteBuffer dataPageBuf,
+        long dataPageBuf,
         int bucket
     ) throws IgniteCheckedException {
         if (io.getNextId(buf) != 0L)
@@ -558,7 +558,7 @@ public abstract class PagesList extends DataStructure {
 
         long dataPageId = dataPage.id();
 
-        int idx = io.addPage(buf, dataPageId);
+        int idx = io.addPage(pageMem.pageSize(), buf, dataPageId);
 
         if (idx == -1)
             handlePageFull(pageId, page, buf, io, dataPage, dataPageBuf, bucket);
@@ -589,10 +589,10 @@ public abstract class PagesList extends DataStructure {
     private void handlePageFull(
         long pageId,
         Page page,
-        ByteBuffer buf,
+        long buf,
         PagesListNodeIO io,
         Page dataPage,
-        ByteBuffer dataPageBuf,
+        long dataPageBuf,
         int bucket
     ) throws IgniteCheckedException {
         long dataPageId = dataPage.id();
@@ -627,9 +627,9 @@ public abstract class PagesList extends DataStructure {
             long nextId = allocatePage(null);
 
             try (Page next = page(nextId)) {
-                ByteBuffer nextBuf = writeLock(next); // Newly allocated page.
+                long nextBuf = writeLock(next); // Newly allocated page.
 
-                assert nextBuf != null;
+                assert nextBuf != 0L;
 
                 try {
                     setupNextPage(io, pageId, buf, nextId, nextBuf);
@@ -637,7 +637,7 @@ public abstract class PagesList extends DataStructure {
                     if (isWalDeltaRecordNeeded(wal, page))
                         wal.log(new PagesListSetNextRecord(cacheId, pageId, nextId));
 
-                    int idx = io.addPage(nextBuf, dataPageId);
+                    int idx = io.addPage(pageMem.pageSize(), nextBuf, dataPageId);
 
                     // Here we should never write full page, because it is known to be new.
                     next.fullPageWalRecordPolicy(FALSE);
@@ -683,7 +683,7 @@ public abstract class PagesList extends DataStructure {
     private boolean putReuseBag(
         final long pageId,
         Page page,
-        final ByteBuffer buf,
+        final long buf,
         PagesListNodeIO io,
         ReuseBag bag,
         int bucket
@@ -692,21 +692,21 @@ public abstract class PagesList extends DataStructure {
             return false; // Splitted.
 
         long nextId;
-        ByteBuffer prevBuf = buf;
+        long prevBuf = buf;
         long prevId = pageId;
 
         List<Page> locked = null; // TODO may be unlock right away and do not keep all these pages locked?
-        List<ByteBuffer> lockedBufs = null;
+        List<Long> lockedBufs = null;
 
         try {
             while ((nextId = bag.pollFreePage()) != 0L) {
-                int idx = io.addPage(prevBuf, nextId);
+                int idx = io.addPage(pageMem.pageSize(), prevBuf, nextId);
 
                 if (idx == -1) { // Attempt to add page failed: the node page is full.
                     try (Page next = page(nextId)) {
-                        ByteBuffer nextBuf = writeLock(next); // Page from reuse bag can't be concurrently recycled.
+                        long nextBuf = writeLock(next); // Page from reuse bag can't be concurrently recycled.
 
-                        assert nextBuf != null;
+                        assert nextBuf != 0L;
 
                         if (locked == null) {
                             lockedBufs = new ArrayList<>(2);
@@ -783,11 +783,11 @@ public abstract class PagesList extends DataStructure {
      * @return Buffer if page is locket of {@code null} if can retry lock.
      * @throws IgniteCheckedException If failed.
      */
-    @Nullable private ByteBuffer writeLockPage(Page page, int bucket, int lockAttempt)
+    private long writeLockPage(Page page, int bucket, int lockAttempt)
         throws IgniteCheckedException {
-        ByteBuffer buf = tryWriteLock(page);
+        long buf = tryWriteLock(page);
 
-        if (buf != null)
+        if (buf != 0L)
             return buf;
 
         if (lockAttempt == TRY_LOCK_ATTEMPTS) {
@@ -796,11 +796,11 @@ public abstract class PagesList extends DataStructure {
             if (stripes == null || stripes.length < MAX_STRIPES_PER_BUCKET) {
                 addStripe(bucket, false);
 
-                return null;
+                return 0L;
             }
         }
 
-        return lockAttempt < TRY_LOCK_ATTEMPTS ? null : writeLock(page); // Must be explicitly checked further.
+        return lockAttempt < TRY_LOCK_ATTEMPTS ? 0L : writeLock(page); // Must be explicitly checked further.
     }
 
     /**
@@ -819,9 +819,9 @@ public abstract class PagesList extends DataStructure {
             long tailId = stripe.tailId;
 
             try (Page tail = page(tailId)) {
-                ByteBuffer tailBuf = writeLockPage(tail, bucket, lockAttempt++); // Explicit check.
+                long tailBuf = writeLockPage(tail, bucket, lockAttempt++); // Explicit check.
 
-                if (tailBuf == null)
+                if (tailBuf == 0L)
                     continue;
 
                 assert PageIO.getPageId(tailBuf) == tailId : "tailId = " + tailId + ", tailBufId = " + PageIO.getPageId(tailBuf);
@@ -929,7 +929,7 @@ public abstract class PagesList extends DataStructure {
      * @throws IgniteCheckedException If failed.
      * @return {@code True} if page was removed.
      */
-    protected final boolean removeDataPage(Page dataPage, ByteBuffer dataPageBuf, DataPageIO dataIO, int bucket)
+    protected final boolean removeDataPage(Page dataPage, long dataPageBuf, DataPageIO dataIO, int bucket)
         throws IgniteCheckedException {
         long dataPageId = dataPage.id();
 
@@ -943,9 +943,9 @@ public abstract class PagesList extends DataStructure {
 
             long recycleId = 0L;
 
-            ByteBuffer buf = writeLock(page); // Explicit check.
+            long buf = writeLock(page); // Explicit check.
 
-            if (buf == null)
+            if (buf == 0L)
                 return false;
 
             boolean rmvd = false;
@@ -1003,7 +1003,7 @@ public abstract class PagesList extends DataStructure {
      * @return Page ID to recycle.
      * @throws IgniteCheckedException If failed.
      */
-    private long mergeNoNext(long pageId, Page page, ByteBuffer buf, long prevId, int bucket)
+    private long mergeNoNext(long pageId, Page page, long buf, long prevId, int bucket)
         throws IgniteCheckedException {
         // If we do not have a next page (we are tail) and we are on reuse bucket,
         // then we can leave as is as well, because it is normal to have an empty tail page here.
@@ -1040,11 +1040,11 @@ public abstract class PagesList extends DataStructure {
             try (Page next = nextId == 0L ? null : page(nextId)) {
                 boolean write = false;
 
-                ByteBuffer nextBuf = next == null ? null : writeLock(next); // Explicit check.
-                ByteBuffer buf = writeLock(page); // Explicit check.
+                long nextBuf = next == null ? 0L : writeLock(next); // Explicit check.
+                long buf = writeLock(page); // Explicit check.
 
-                if (buf == null) {
-                    if (nextBuf != null) // Unlock next page if needed.
+                if (buf == 0L) {
+                    if (nextBuf != 0L) // Unlock next page if needed.
                         writeUnlock(next, nextBuf, false);
 
                     return 0L; // Someone has merged or taken our empty page concurrently. Nothing to do here.
@@ -1057,7 +1057,7 @@ public abstract class PagesList extends DataStructure {
                         return 0L; // No need to merge anymore.
 
                     // Check if we see a consistent state of the world.
-                    if (io.getNextId(buf) == nextId && (nextId == 0L) == (nextBuf == null)) {
+                    if (io.getNextId(buf) == nextId && (nextId == 0L) == (nextBuf == 0L)) {
                         long recycleId = doMerge(pageId, page, buf, io, next, nextId, nextBuf, bucket);
 
                         write = true;
@@ -1069,7 +1069,7 @@ public abstract class PagesList extends DataStructure {
                     nextId = io.getNextId(buf);
                 }
                 finally {
-                    if (nextBuf != null)
+                    if (nextBuf != 0L)
                         writeUnlock(next, nextBuf, write);
 
                     writeUnlock(page, buf, write);
@@ -1093,11 +1093,11 @@ public abstract class PagesList extends DataStructure {
     private long doMerge(
         long pageId,
         Page page,
-        ByteBuffer buf,
+        long buf,
         PagesListNodeIO io,
         Page next,
         long nextId,
-        ByteBuffer nextBuf,
+        long nextBuf,
         int bucket
     ) throws IgniteCheckedException {
         long prevId = io.getPreviousId(buf);
@@ -1139,12 +1139,12 @@ public abstract class PagesList extends DataStructure {
         long pageId,
         long nextId,
         Page next,
-        ByteBuffer nextBuf)
+        long nextBuf)
         throws IgniteCheckedException {
         try (Page prev = page(prevId)) {
-            ByteBuffer prevBuf = writeLock(prev); // No check, we keep a reference.
+            long prevBuf = writeLock(prev); // No check, we keep a reference.
 
-            assert prevBuf != null;
+            assert prevBuf != 0L;
 
             try {
                 PagesListNodeIO prevIO = PagesListNodeIO.VERSIONS.forPage(prevBuf);
@@ -1177,7 +1177,7 @@ public abstract class PagesList extends DataStructure {
      * @return Rotated page ID.
      * @throws IgniteCheckedException If failed.
      */
-    private long recyclePage(long pageId, Page page, ByteBuffer buf) throws IgniteCheckedException {
+    private long recyclePage(long pageId, Page page, long buf) throws IgniteCheckedException {
         pageId = PageIdUtils.rotatePageId(pageId);
 
         PageIO.setPageId(buf, pageId);

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/io/PagesListMetaIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/io/PagesListMetaIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/io/PagesListMetaIO.java
index b525a01..6ac8cde 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/io/PagesListMetaIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/io/PagesListMetaIO.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.processors.cache.database.freelist.io;
 
-import java.nio.ByteBuffer;
 import java.util.Map;
+import org.apache.ignite.internal.pagemem.PageUtils;
 import org.apache.ignite.internal.processors.cache.database.freelist.PagesList;
 import org.apache.ignite.internal.processors.cache.database.tree.io.IOVersions;
 import org.apache.ignite.internal.processors.cache.database.tree.io.PageIO;
@@ -53,7 +53,7 @@ public class PagesListMetaIO extends PageIO {
     }
 
     /** {@inheritDoc} */
-    @Override public void initNewPage(ByteBuffer buf, long pageId) {
+    @Override public void initNewPage(long buf, long pageId) {
         super.initNewPage(buf, pageId);
 
         setCount(buf, 0);
@@ -64,55 +64,56 @@ public class PagesListMetaIO extends PageIO {
      * @param buf Buffer.
      * @return Stored items count.
      */
-    private int getCount(ByteBuffer buf) {
-        return buf.getShort(CNT_OFF);
+    private int getCount(long buf) {
+        return PageUtils.getShort(buf, CNT_OFF);
     }
 
     /**
      * @param buf Buffer,
      * @param cnt Stored items count.
      */
-    private void setCount(ByteBuffer buf, int cnt) {
+    private void setCount(long buf, int cnt) {
         assert cnt >= 0 && cnt <= Short.MAX_VALUE : cnt;
 
-        buf.putShort(CNT_OFF, (short)cnt);
+        PageUtils.putShort(buf, CNT_OFF, (short)cnt);
     }
 
     /**
      * @param buf Buffer.
      * @return Next meta page ID.
      */
-    public long getNextMetaPageId(ByteBuffer buf) {
-        return buf.getLong(NEXT_META_PAGE_OFF);
+    public long getNextMetaPageId(long buf) {
+        return PageUtils.getLong(buf, NEXT_META_PAGE_OFF);
     }
 
     /**
      * @param buf Buffer.
      * @param metaPageId Next meta page ID.
      */
-    public void setNextMetaPageId(ByteBuffer buf, long metaPageId) {
-        buf.putLong(NEXT_META_PAGE_OFF, metaPageId);
+    public void setNextMetaPageId(long buf, long metaPageId) {
+        PageUtils.putLong(buf, NEXT_META_PAGE_OFF, metaPageId);
     }
 
     /**
      * @param buf Buffer.
      */
-    public void resetCount(ByteBuffer buf) {
+    public void resetCount(long buf) {
         setCount(buf, 0);
     }
 
     /**
+     * @param pageSize Page size.
      * @param buf Buffer.
      * @param bucket Bucket number.
      * @param tails Tails.
      * @param tailsOff Tails offset.
      * @return Number of items written.
      */
-    public int addTails(ByteBuffer buf, int bucket, PagesList.Stripe[] tails, int tailsOff) {
+    public int addTails(int pageSize, long buf, int bucket, PagesList.Stripe[] tails, int tailsOff) {
         assert bucket >= 0 && bucket <= Short.MAX_VALUE : bucket;
 
         int cnt = getCount(buf);
-        int cap = getCapacity(buf);
+        int cap = getCapacity(pageSize, buf);
 
         if (cnt == cap)
             return 0;
@@ -122,8 +123,8 @@ public class PagesListMetaIO extends PageIO {
         int write = Math.min(cap - cnt, tails.length - tailsOff);
 
         for (int i = 0; i < write; i++) {
-            buf.putShort(off, (short)bucket);
-            buf.putLong(off + 2, tails[tailsOff].tailId);
+            PageUtils.putShort(buf, off, (short)bucket);
+            PageUtils.putLong(buf, off + 2, tails[tailsOff].tailId);
 
             tailsOff++;
 
@@ -139,7 +140,7 @@ public class PagesListMetaIO extends PageIO {
      * @param buf Buffer.
      * @param res Results map.
      */
-    public void getBucketsData(ByteBuffer buf, Map<Integer, GridLongList> res) {
+    public void getBucketsData(long buf, Map<Integer, GridLongList> res) {
         int cnt = getCount(buf);
 
         assert cnt >= 0 && cnt <= Short.MAX_VALUE : cnt;
@@ -150,10 +151,10 @@ public class PagesListMetaIO extends PageIO {
         int off = offset(0);
 
         for (int i = 0; i < cnt; i++) {
-            Integer bucket = (int)buf.getShort(off);
+            Integer bucket = (int)PageUtils.getShort(buf, off);
             assert bucket >= 0 && bucket <= Short.MAX_VALUE : bucket;
 
-            long tailId = buf.getLong(off + 2);
+            long tailId = PageUtils.getLong(buf, off + 2);
             assert tailId != 0;
 
             GridLongList list = res.get(bucket);
@@ -171,8 +172,8 @@ public class PagesListMetaIO extends PageIO {
      * @param buf Buffer.
      * @return Maximum number of items which can be stored in buffer.
      */
-    private int getCapacity(ByteBuffer buf) {
-        return (buf.capacity() - ITEMS_OFF) / ITEM_SIZE;
+    private int getCapacity(int pageSize, long buf) {
+        return (pageSize - ITEMS_OFF) / ITEM_SIZE;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/io/PagesListNodeIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/io/PagesListNodeIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/io/PagesListNodeIO.java
index 2349fa1..c92e4a9 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/io/PagesListNodeIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/freelist/io/PagesListNodeIO.java
@@ -17,14 +17,14 @@
 
 package org.apache.ignite.internal.processors.cache.database.freelist.io;
 
-import java.nio.ByteBuffer;
+import org.apache.ignite.internal.pagemem.PageUtils;
 import org.apache.ignite.internal.processors.cache.database.tree.io.IOVersions;
 import org.apache.ignite.internal.processors.cache.database.tree.io.PageIO;
 
 import static org.apache.ignite.internal.processors.cache.database.tree.util.PageHandler.copyMemory;
 
 /**
- * TODO optimize: now we have slow {@link #removePage(ByteBuffer, long)}
+ * TODO optimize: now we have slow {@link #removePage(long, long)}
  */
 public class PagesListNodeIO extends PageIO {
     /** */
@@ -52,7 +52,7 @@ public class PagesListNodeIO extends PageIO {
     }
 
     /** {@inheritDoc} */
-    @Override public void initNewPage(ByteBuffer buf, long pageId) {
+    @Override public void initNewPage(long buf, long pageId) {
         super.initNewPage(buf, pageId);
 
         setEmpty(buf);
@@ -64,7 +64,7 @@ public class PagesListNodeIO extends PageIO {
     /**
      * @param buf Buffer.
      */
-    private void setEmpty(ByteBuffer buf) {
+    private void setEmpty(long buf) {
         setCount(buf, 0);
     }
 
@@ -72,32 +72,32 @@ public class PagesListNodeIO extends PageIO {
      * @param buf Buffer.
      * @return Next page ID.
      */
-    public long getNextId(ByteBuffer buf) {
-        return buf.getLong(NEXT_PAGE_ID_OFF);
+    public long getNextId(long buf) {
+        return PageUtils.getLong(buf, NEXT_PAGE_ID_OFF);
     }
 
     /**
      * @param buf Buffer.
      * @param nextId Next page ID.
      */
-    public void setNextId(ByteBuffer buf, long nextId) {
-        buf.putLong(NEXT_PAGE_ID_OFF, nextId);
+    public void setNextId(long buf, long nextId) {
+        PageUtils.putLong(buf, NEXT_PAGE_ID_OFF, nextId);
     }
 
     /**
      * @param buf Buffer.
      * @return Previous page ID.
      */
-    public long getPreviousId(ByteBuffer buf) {
-        return buf.getLong(PREV_PAGE_ID_OFF);
+    public long getPreviousId(long buf) {
+        return PageUtils.getLong(buf, PREV_PAGE_ID_OFF);
     }
 
     /**
      * @param buf Page buffer.
      * @param prevId Previous  page ID.
      */
-    public void setPreviousId(ByteBuffer buf, long prevId) {
-        buf.putLong(PREV_PAGE_ID_OFF, prevId);
+    public void setPreviousId(long buf, long prevId) {
+        PageUtils.putLong(buf, PREV_PAGE_ID_OFF, prevId);
     }
 
     /**
@@ -106,8 +106,8 @@ public class PagesListNodeIO extends PageIO {
      * @param buf Page buffer to get count from.
      * @return Total number of entries.
      */
-    public int getCount(ByteBuffer buf) {
-        return buf.getShort(CNT_OFF);
+    public int getCount(long buf) {
+        return PageUtils.getShort(buf, CNT_OFF);
     }
 
     /**
@@ -116,20 +116,20 @@ public class PagesListNodeIO extends PageIO {
      * @param buf Page buffer to write to.
      * @param cnt Count.
      */
-    private void setCount(ByteBuffer buf, int cnt) {
+    private void setCount(long buf, int cnt) {
         assert cnt >= 0 && cnt <= Short.MAX_VALUE : cnt;
 
-        buf.putShort(CNT_OFF, (short)cnt);
+        PageUtils.putShort(buf, CNT_OFF, (short)cnt);
     }
 
     /**
      * Gets capacity of this page in items.
      *
-     * @param buf Page buffer to get capacity.
+     * @param pageSize Page size.
      * @return Capacity of this page in items.
      */
-    private int getCapacity(ByteBuffer buf) {
-        return (buf.capacity() - PAGE_IDS_OFF) >>> 3; // /8
+    private int getCapacity(int pageSize) {
+        return (pageSize - PAGE_IDS_OFF) >>> 3; // /8
     }
 
     /**
@@ -145,8 +145,8 @@ public class PagesListNodeIO extends PageIO {
      * @param idx Item index.
      * @return Item at the given index.
      */
-    private long getAt(ByteBuffer buf, int idx) {
-        return buf.getLong(offset(idx));
+    private long getAt(long buf, int idx) {
+        return PageUtils.getLong(buf, offset(idx));
     }
 
     /**
@@ -154,8 +154,8 @@ public class PagesListNodeIO extends PageIO {
      * @param idx Item index.
      * @param pageId Item value to write.
      */
-    private void setAt(ByteBuffer buf, int idx, long pageId) {
-        buf.putLong(offset(idx), pageId);
+    private void setAt(long buf, int idx, long pageId) {
+        PageUtils.putLong(buf, offset(idx), pageId);
     }
 
     /**
@@ -165,10 +165,10 @@ public class PagesListNodeIO extends PageIO {
      * @param pageId Page ID.
      * @return Total number of items in this page.
      */
-    public int addPage(ByteBuffer buf, long pageId) {
+    public int addPage(int pageSize, long buf, long pageId) {
         int cnt = getCount(buf);
 
-        if (cnt == getCapacity(buf))
+        if (cnt == getCapacity(pageSize))
             return -1;
 
         setAt(buf, cnt, pageId);
@@ -183,7 +183,7 @@ public class PagesListNodeIO extends PageIO {
      * @param buf Page buffer.
      * @return Removed page ID.
      */
-    public long takeAnyPage(ByteBuffer buf) {
+    public long takeAnyPage(long buf) {
         int cnt = getCount(buf);
 
         if (cnt == 0)
@@ -201,7 +201,7 @@ public class PagesListNodeIO extends PageIO {
      * @param dataPageId Page ID to remove.
      * @return {@code true} if page was in the list and was removed, {@code false} otherwise.
      */
-    public boolean removePage(ByteBuffer buf, long dataPageId) {
+    public boolean removePage(long buf, long dataPageId) {
         assert dataPageId != 0;
 
         int cnt = getCount(buf);
@@ -224,7 +224,7 @@ public class PagesListNodeIO extends PageIO {
      * @param buf Page buffer.
      * @return {@code true} if there are no items in this page.
      */
-    public boolean isEmpty(ByteBuffer buf) {
+    public boolean isEmpty(long buf) {
         return getCount(buf) == 0;
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/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 0e41307..6ea1bff 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
@@ -409,7 +409,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure {
             // We may need to replace inner key or want to merge this leaf with sibling after the remove -> keep lock.
             if (needReplaceInner ||
                 // We need to make sure that we have back or forward to be able to merge.
-                ((r.fwdId != 0 || r.backId != 0) && mayMerge(cnt - 1, io.getMaxCount(buf)))) {
+                ((r.fwdId != 0 || r.backId != 0) && mayMerge(cnt - 1, io.getMaxCount(pageMem.pageSize(), buf)))) {
                 // If we have backId then we've already locked back page, nothing to do here.
                 if (r.fwdId != 0 && r.backId == 0) {
                     Result res = r.lockForward(0);
@@ -528,7 +528,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure {
 
             assert lvl == io.getRootLevel(buf); // Can drop only root.
 
-            io.cutRoot(buf);
+            io.cutRoot(pageMem.pageSize(), buf);
 
             if (needWalDeltaRecord(meta))
                 wal.log(new MetaPageCutRootRecord(cacheId, meta.id()));
@@ -548,7 +548,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure {
 
             assert lvl == io.getLevelsCount(buf);
 
-            io.addRoot(buf, rootPageId);
+            io.addRoot(pageMem.pageSize(), buf, rootPageId);
 
             if (needWalDeltaRecord(meta))
                 wal.log(new MetaPageAddRootRecord(cacheId, meta.id(), rootPageId));
@@ -566,7 +566,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure {
             // Safe cast because we should never recycle meta page until the tree is destroyed.
             BPlusMetaIO io = (BPlusMetaIO)iox;
 
-            io.initRoot(buf, rootId);
+            io.initRoot(pageMem.pageSize(), buf, rootId);
 
             if (needWalDeltaRecord(meta))
                 wal.log(new MetaPageInitRootRecord(cacheId, meta.id(), rootId));
@@ -2185,7 +2185,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure {
          */
         private L insert(Page page, BPlusIO<L> io, ByteBuffer buf, int idx, int lvl)
             throws IgniteCheckedException {
-            int maxCnt = io.getMaxCount(buf);
+            int maxCnt = io.getMaxCount(pageMem.pageSize(), buf);
             int cnt = io.getCount(buf);
 
             if (cnt == maxCnt) // Need to split page.
@@ -2625,7 +2625,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure {
                         // Exit: we are done.
                     }
                     else if (tail.sibling != null &&
-                        tail.getCount() + tail.sibling.getCount() < tail.io.getMaxCount(tail.buf)) {
+                        tail.getCount() + tail.sibling.getCount() < tail.io.getMaxCount(pageMem.pageSize(), tail.buf)) {
                         // Release everything lower than tail, we've already merged this path.
                         doReleaseTail(tail.down);
                         tail.down = null;
@@ -2940,7 +2940,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure {
 
             boolean emptyBranch = needMergeEmptyBranch == TRUE || needMergeEmptyBranch == READY;
 
-            if (!left.io.merge(prnt.io, prnt.buf, prntIdx, left.buf, right.buf, emptyBranch))
+            if (!left.io.merge(pageMem.pageSize(), prnt.io, prnt.buf, prntIdx, left.buf, right.buf, emptyBranch))
                 return false;
 
             // Invalidate indexes after successful merge.

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java
index 5fc3d25..6c739a5 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusIO.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.processors.cache.database.tree.io;
 
-import java.nio.ByteBuffer;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.pagemem.PageUtils;
 import org.apache.ignite.internal.processors.cache.database.tree.BPlusTree;
 
 /**
@@ -72,7 +72,7 @@ public abstract class BPlusIO<L> extends PageIO {
     }
 
     /** {@inheritDoc} */
-    @Override public void initNewPage(ByteBuffer buf, long pageId) {
+    @Override public void initNewPage(long buf, long pageId) {
         super.initNewPage(buf, pageId);
 
         setCount(buf, 0);
@@ -84,16 +84,16 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param buf Buffer.
      * @return Forward page ID.
      */
-    public final long getForward(ByteBuffer buf) {
-        return buf.getLong(FORWARD_OFF);
+    public final long getForward(long buf) {
+        return PageUtils.getLong(buf, FORWARD_OFF);
     }
 
     /**
      * @param buf Buffer.
      * @param pageId Forward page ID.
      */
-    public final void setForward(ByteBuffer buf, long pageId) {
-        buf.putLong(FORWARD_OFF, pageId);
+    public final void setForward(long buf, long pageId) {
+        PageUtils.putLong(buf, FORWARD_OFF, pageId);
 
         assert getForward(buf) == pageId;
     }
@@ -102,16 +102,16 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param buf Buffer.
      * @return Remove ID.
      */
-    public final long getRemoveId(ByteBuffer buf) {
-        return buf.getLong(REMOVE_ID_OFF);
+    public final long getRemoveId(long buf) {
+        return PageUtils.getLong(buf, REMOVE_ID_OFF);
     }
 
     /**
      * @param buf Buffer.
      * @param rmvId Remove ID.
      */
-    public final void setRemoveId(ByteBuffer buf, long rmvId) {
-        buf.putLong(REMOVE_ID_OFF, rmvId);
+    public final void setRemoveId(long buf, long rmvId) {
+        PageUtils.putLong(buf, REMOVE_ID_OFF, rmvId);
 
         assert getRemoveId(buf) == rmvId;
     }
@@ -120,8 +120,8 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param buf Buffer.
      * @return Items count in the page.
      */
-    public final int getCount(ByteBuffer buf) {
-        int cnt = buf.getShort(CNT_OFF) & 0xFFFF;
+    public final int getCount(long buf) {
+        int cnt = PageUtils.getShort(buf, CNT_OFF) & 0xFFFF;
 
         assert cnt >= 0: cnt;
 
@@ -132,17 +132,17 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param buf Buffer.
      * @param cnt Count.
      */
-    public final void setCount(ByteBuffer buf, int cnt) {
+    public final void setCount(long buf, int cnt) {
         assert cnt >= 0: cnt;
 
-        buf.putShort(CNT_OFF, (short)cnt);
+        PageUtils.putShort(buf, CNT_OFF, (short)cnt);
 
         assert getCount(buf) == cnt;
     }
 
     /**
      * @return {@code true} If we can get the full row from this page using
-     * method {@link BPlusTree#getRow(BPlusIO, ByteBuffer, int)}.
+     * method {@link BPlusTree#getRow(BPlusIO, long, int)}.
      * Must always be {@code true} for leaf pages.
      */
     public final boolean canGetRow() {
@@ -160,7 +160,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param buf Buffer.
      * @return Max items count.
      */
-    public abstract int getMaxCount(ByteBuffer buf);
+    public abstract int getMaxCount(int pageSize, long buf);
 
     /**
      * Store the needed info about the row in the page. Leaf and inner pages can store different info.
@@ -171,7 +171,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param rowBytes Row bytes.
      * @throws IgniteCheckedException If failed.
      */
-    public final void store(ByteBuffer buf, int idx, L row, byte[] rowBytes) throws IgniteCheckedException {
+    public final void store(long buf, int idx, L row, byte[] rowBytes) throws IgniteCheckedException {
         int off = offset(idx);
 
         if (rowBytes == null)
@@ -194,7 +194,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param row Lookup or full row.
      * @throws IgniteCheckedException If failed.
      */
-    public abstract void storeByOffset(ByteBuffer buf, int off, L row) throws IgniteCheckedException;
+    public abstract void storeByOffset(long buf, int off, L row) throws IgniteCheckedException;
 
     /**
      * Store row info from the given source.
@@ -206,7 +206,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param srcIdx Source index.
      * @throws IgniteCheckedException If failed.
      */
-    public abstract void store(ByteBuffer dst, int dstIdx, BPlusIO<L> srcIo, ByteBuffer src, int srcIdx)
+    public abstract void store(long dst, int dstIdx, BPlusIO<L> srcIo, long src, int srcIdx)
         throws IgniteCheckedException;
 
     /**
@@ -218,7 +218,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @return Lookup row.
      * @throws IgniteCheckedException If failed.
      */
-    public abstract L getLookupRow(BPlusTree<L, ?> tree, ByteBuffer buf, int idx) throws IgniteCheckedException;
+    public abstract L getLookupRow(BPlusTree<L, ?> tree, long buf, int idx) throws IgniteCheckedException;
 
     /**
      * Copy items from source buffer to destination buffer.
@@ -232,7 +232,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param cpLeft Copy leftmost link (makes sense only for inner pages).
      * @throws IgniteCheckedException If failed.
      */
-    public abstract void copyItems(ByteBuffer src, ByteBuffer dst, int srcIdx, int dstIdx, int cnt, boolean cpLeft)
+    public abstract void copyItems(long src, long dst, int srcIdx, int dstIdx, int cnt, boolean cpLeft)
         throws IgniteCheckedException;
 
     // Methods for B+Tree logic.
@@ -245,7 +245,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param rightId Page ID which will be to the right child for the inserted item.
      * @throws IgniteCheckedException If failed.
      */
-    public void insert(ByteBuffer buf, int idx, L row, byte[] rowBytes, long rightId)
+    public void insert(long buf, int idx, L row, byte[] rowBytes, long rightId)
         throws IgniteCheckedException {
         int cnt = getCount(buf);
 
@@ -266,9 +266,9 @@ public abstract class BPlusIO<L> extends PageIO {
      * @throws IgniteCheckedException If failed.
      */
     public void splitForwardPage(
-        ByteBuffer buf,
+        long buf,
         long fwdId,
-        ByteBuffer fwdBuf,
+        long fwdBuf,
         int mid,
         int cnt
     ) throws IgniteCheckedException {
@@ -291,7 +291,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param mid Bisection index.
      * @param fwdId New forward page ID.
      */
-    public void splitExistingPage(ByteBuffer buf, int mid, long fwdId) {
+    public void splitExistingPage(long buf, int mid, long fwdId) {
         setCount(buf, mid);
         setForward(buf, fwdId);
     }
@@ -302,7 +302,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param cnt Count.
      * @throws IgniteCheckedException If failed.
      */
-    public void remove(ByteBuffer buf, int idx, int cnt) throws IgniteCheckedException {
+    public void remove(long buf, int idx, int cnt) throws IgniteCheckedException {
         cnt--;
 
         copyItems(buf, buf, idx + 1, idx, cnt - idx, false);
@@ -320,11 +320,12 @@ public abstract class BPlusIO<L> extends PageIO {
      * @throws IgniteCheckedException If failed.
      */
     public boolean merge(
+        int pageSize,
         BPlusIO<L> prntIo,
-        ByteBuffer prnt,
+        long prnt,
         int prntIdx,
-        ByteBuffer left,
-        ByteBuffer right,
+        long left,
+        long right,
         boolean emptyBranch
     ) throws IgniteCheckedException {
         int prntCnt = prntIo.getCount(prnt);
@@ -337,7 +338,7 @@ public abstract class BPlusIO<L> extends PageIO {
         if (!isLeaf() && !emptyBranch)
             newCnt++;
 
-        if (newCnt > getMaxCount(left)) {
+        if (newCnt > getMaxCount(pageSize, left)) {
             assert !emptyBranch;
 
             return false;
@@ -373,15 +374,7 @@ public abstract class BPlusIO<L> extends PageIO {
      * @param pos Position in buffer.
      * @param bytes Bytes.
      */
-    private static void putBytes(ByteBuffer buf, int pos, byte[] bytes) {
-        int oldPos = buf.position();
-
-        try {
-            buf.position(pos);
-            buf.put(bytes);
-        }
-        finally {
-            buf.position(oldPos);
-        }
+    private static void putBytes(long buf, int pos, byte[] bytes) {
+        PageUtils.putBytes(buf, pos, bytes);
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java
index 90b0f37..d0ead51 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusInnerIO.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.processors.cache.database.tree.io;
 
-import java.nio.ByteBuffer;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.pagemem.PageUtils;
 import org.apache.ignite.internal.processors.cache.database.tree.util.PageHandler;
 
 /**
@@ -45,11 +45,11 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> {
     }
 
     /** {@inheritDoc} */
-    @Override public int getMaxCount(ByteBuffer buf) {
+    @Override public int getMaxCount(int pageSize, long buf) {
         // The structure of the page is the following:
         // |ITEMS_OFF|w|A|x|B|y|C|z|
         // where capital letters are data items, lowercase letters are 8 byte page references.
-        return (buf.capacity() - ITEMS_OFF - 8) / (itemSize + 8);
+        return (pageSize - ITEMS_OFF - 8) / (itemSize + 8);
     }
 
     /**
@@ -57,8 +57,8 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> {
      * @param idx Index.
      * @return Page ID.
      */
-    public final long getLeft(ByteBuffer buf, int idx) {
-        return buf.getLong(offset(idx, SHIFT_LEFT));
+    public final long getLeft(long buf, int idx) {
+        return PageUtils.getLong(buf, (offset(idx, SHIFT_LEFT)));
     }
 
     /**
@@ -66,8 +66,8 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> {
      * @param idx Index.
      * @param pageId Page ID.
      */
-    public final void setLeft(ByteBuffer buf, int idx, long pageId) {
-        buf.putLong(offset(idx, SHIFT_LEFT), pageId);
+    public final void setLeft(long buf, int idx, long pageId) {
+        PageUtils.putLong(buf, offset(idx, SHIFT_LEFT), pageId);
 
         assert pageId == getLeft(buf, idx);
     }
@@ -77,8 +77,8 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> {
      * @param idx Index.
      * @return Page ID.
      */
-    public final long getRight(ByteBuffer buf, int idx) {
-        return buf.getLong(offset(idx, SHIFT_RIGHT));
+    public final long getRight(long buf, int idx) {
+        return PageUtils.getLong(buf, offset(idx, SHIFT_RIGHT));
     }
 
     /**
@@ -86,14 +86,14 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> {
      * @param idx Index.
      * @param pageId Page ID.
      */
-    public final void setRight(ByteBuffer buf, int idx, long pageId) {
-        buf.putLong(offset(idx, SHIFT_RIGHT), pageId);
+    public final void setRight(long buf, int idx, long pageId) {
+        PageUtils.putLong(buf, offset(idx, SHIFT_RIGHT), pageId);
 
         assert pageId == getRight(buf, idx);
     }
 
     /** {@inheritDoc} */
-    @Override public final void copyItems(ByteBuffer src, ByteBuffer dst, int srcIdx, int dstIdx, int cnt,
+    @Override public final void copyItems(long src, long dst, int srcIdx, int dstIdx, int cnt,
         boolean cpLeft) throws IgniteCheckedException {
         assert srcIdx != dstIdx || src != dst;
 
@@ -103,11 +103,11 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> {
             PageHandler.copyMemory(src, dst, offset(srcIdx), offset(dstIdx), cnt);
 
             if (cpLeft)
-                dst.putLong(offset(dstIdx, SHIFT_LEFT), src.getLong(offset(srcIdx, SHIFT_LEFT)));
+                PageUtils.putLong(dst, offset(dstIdx, SHIFT_LEFT), PageUtils.getLong(src, (offset(srcIdx, SHIFT_LEFT))));
         }
         else {
             if (cpLeft)
-                dst.putLong(offset(dstIdx, SHIFT_LEFT), src.getLong(offset(srcIdx, SHIFT_LEFT)));
+                PageUtils.putLong(dst, offset(dstIdx, SHIFT_LEFT), PageUtils.getLong(src, (offset(srcIdx, SHIFT_LEFT))));
 
             PageHandler.copyMemory(src, dst, offset(srcIdx), offset(dstIdx), cnt);
         }
@@ -131,7 +131,7 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> {
 
     /** {@inheritDoc} */
     @Override public void insert(
-        ByteBuffer buf,
+        long buf,
         int idx,
         L row,
         byte[] rowBytes,
@@ -152,7 +152,7 @@ public abstract class BPlusInnerIO<L> extends BPlusIO<L> {
      * @throws IgniteCheckedException If failed.
      */
     public void initNewRoot(
-        ByteBuffer newRootBuf,
+        long newRootBuf,
         long newRootId,
         long leftChildId,
         L row,

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusLeafIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusLeafIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusLeafIO.java
index 824c943..76c621c 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusLeafIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusLeafIO.java
@@ -35,12 +35,12 @@ public abstract class BPlusLeafIO<L> extends BPlusIO<L> {
     }
 
     /** {@inheritDoc} */
-    @Override public int getMaxCount(ByteBuffer buf) {
-        return (buf.capacity() - ITEMS_OFF) / itemSize;
+    @Override public int getMaxCount(int pageSize, long buf) {
+        return (pageSize - ITEMS_OFF) / itemSize;
     }
 
     /** {@inheritDoc} */
-    @Override public final void copyItems(ByteBuffer src, ByteBuffer dst, int srcIdx, int dstIdx, int cnt,
+    @Override public final void copyItems(long src, long dst, int srcIdx, int dstIdx, int cnt,
         boolean cpLeft) throws IgniteCheckedException {
         assert srcIdx != dstIdx || src != dst;
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusMetaIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusMetaIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusMetaIO.java
index 15a49ef..ccaa952 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusMetaIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/BPlusMetaIO.java
@@ -17,7 +17,7 @@
 
 package org.apache.ignite.internal.processors.cache.database.tree.io;
 
-import java.nio.ByteBuffer;
+import org.apache.ignite.internal.pagemem.PageUtils;
 
 /**
  * IO routines for B+Tree meta pages.
@@ -45,8 +45,8 @@ public class BPlusMetaIO extends PageIO {
      * @param buf Buffer.
      * @param rootId Root page ID.
      */
-    public void initRoot(ByteBuffer buf, long rootId) {
-        setLevelsCount(buf, 1);
+    public void initRoot(int pageSize, long buf, long rootId) {
+        setLevelsCount(pageSize, buf, 1);
         setFirstPageId(buf, 0, rootId);
     }
 
@@ -54,26 +54,26 @@ public class BPlusMetaIO extends PageIO {
      * @param buf Buffer.
      * @return Number of levels in this tree.
      */
-    public int getLevelsCount(ByteBuffer buf) {
-        return buf.get(LVLS_OFF);
+    public int getLevelsCount(long buf) {
+        return PageUtils.getByte(buf, LVLS_OFF);
     }
 
     /**
      * @param buf Buffer.
      * @return Max levels possible for this page size.
      */
-    public int getMaxLevels(ByteBuffer buf) {
-        return (buf.capacity() - REFS_OFF) / 8;
+    public int getMaxLevels(int pageSize, long buf) {
+        return (pageSize - REFS_OFF) / 8;
     }
 
     /**
      * @param buf  Buffer.
      * @param lvls Number of levels in this tree.
      */
-    public void setLevelsCount(ByteBuffer buf, int lvls) {
-        assert lvls >= 0 && lvls <= getMaxLevels(buf): lvls;
+    public void setLevelsCount(int pageSize, long buf, int lvls) {
+        assert lvls >= 0 && lvls <= getMaxLevels(pageSize, buf) : lvls;
 
-        buf.put(LVLS_OFF, (byte)lvls);
+        PageUtils.putByte(buf, LVLS_OFF, (byte)lvls);
 
         assert getLevelsCount(buf) == lvls;
     }
@@ -91,8 +91,8 @@ public class BPlusMetaIO extends PageIO {
      * @param lvl Level.
      * @return First page ID at that level.
      */
-    public long getFirstPageId(ByteBuffer buf, int lvl) {
-        return buf.getLong(offset(lvl));
+    public long getFirstPageId(long buf, int lvl) {
+        return PageUtils.getLong(buf, offset(lvl));
     }
 
     /**
@@ -100,10 +100,10 @@ public class BPlusMetaIO extends PageIO {
      * @param lvl    Level.
      * @param pageId Page ID.
      */
-    public void setFirstPageId(ByteBuffer buf, int lvl, long pageId) {
+    public void setFirstPageId(long buf, int lvl, long pageId) {
         assert lvl >= 0 && lvl < getLevelsCount(buf);
 
-        buf.putLong(offset(lvl), pageId);
+        PageUtils.putLong(buf, offset(lvl), pageId);
 
         assert getFirstPageId(buf, lvl) == pageId;
     }
@@ -112,7 +112,7 @@ public class BPlusMetaIO extends PageIO {
      * @param buf Buffer.
      * @return Root level.
      */
-    public int getRootLevel(ByteBuffer buf) {
+    public int getRootLevel(long buf) {
         int lvls = getLevelsCount(buf); // The highest level page is root.
 
         assert lvls > 0 : lvls;
@@ -124,19 +124,19 @@ public class BPlusMetaIO extends PageIO {
      * @param buf Buffer.
      * @param rootPageId New root page ID.
      */
-    public void addRoot(ByteBuffer buf, long rootPageId) {
+    public void addRoot(int pageSize, long buf, long rootPageId) {
         int lvl = getLevelsCount(buf);
 
-        setLevelsCount(buf, lvl + 1);
+        setLevelsCount(pageSize, buf, lvl + 1);
         setFirstPageId(buf, lvl, rootPageId);
     }
 
     /**
      * @param buf Buffer.
      */
-    public void cutRoot(ByteBuffer buf) {
+    public void cutRoot(int pageSize, long buf) {
         int lvl = getRootLevel(buf);
 
-        setLevelsCount(buf, lvl); // Decrease tree height.
+        setLevelsCount(pageSize, buf, lvl); // Decrease tree height.
     }
 }

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/CacheVersionIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/CacheVersionIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/CacheVersionIO.java
index 5e9fd6d..ed75d12 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/CacheVersionIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/CacheVersionIO.java
@@ -17,8 +17,8 @@
 
 package org.apache.ignite.internal.processors.cache.database.tree.io;
 
-import java.nio.ByteBuffer;
 import org.apache.ignite.IgniteCheckedException;
+import org.apache.ignite.internal.pagemem.PageUtils;
 import org.apache.ignite.internal.processors.cache.version.GridCacheVersion;
 
 /**
@@ -58,21 +58,21 @@ public class CacheVersionIO {
      * @param ver Version to write.
      * @param allowNull Is {@code null} version allowed.
      */
-    public static void write(ByteBuffer buf, GridCacheVersion ver, boolean allowNull) {
+    public static void write(long buf, GridCacheVersion ver, boolean allowNull) {
         if (ver == null) {
             if (allowNull)
-                buf.put(NULL_PROTO_VER);
+                PageUtils.putByte(buf, 0, NULL_PROTO_VER);
             else
                 throw new IllegalStateException("Cache version is null");
         }
         else {
             byte protoVer = 1; // Version of serialization protocol.
 
-            buf.put(protoVer);
-            buf.putInt(ver.topologyVersion());
-            buf.putInt(ver.nodeOrderAndDrIdRaw());
-            buf.putLong(ver.globalTime());
-            buf.putLong(ver.order());
+            PageUtils.putByte(buf, 0, protoVer);
+            PageUtils.putInt(buf, 1, ver.topologyVersion());
+            PageUtils.putInt(buf, 5, ver.nodeOrderAndDrIdRaw());
+            PageUtils.putLong(buf, 9, ver.globalTime());
+            PageUtils.putLong(buf, 17, ver.order());
         }
     }
 
@@ -102,8 +102,8 @@ public class CacheVersionIO {
      * @return Size of serialized version.
      * @throws IgniteCheckedException If failed.
      */
-    public static int readSize(ByteBuffer buf, boolean allowNull) throws IgniteCheckedException {
-        byte protoVer = checkProtocolVersion(buf.get(buf.position()), allowNull);
+    public static int readSize(long buf, boolean allowNull) throws IgniteCheckedException {
+        byte protoVer = checkProtocolVersion(PageUtils.getByte(buf, 0), allowNull);
 
         switch (protoVer) {
             case NULL_PROTO_VER:
@@ -126,16 +126,16 @@ public class CacheVersionIO {
      * @return Version.
      * @throws IgniteCheckedException If failed.
      */
-    public static GridCacheVersion read(ByteBuffer buf, boolean allowNull) throws IgniteCheckedException {
-        byte protoVer = checkProtocolVersion(buf.get(), allowNull);
+    public static GridCacheVersion read(long buf, boolean allowNull) throws IgniteCheckedException {
+        byte protoVer = checkProtocolVersion(PageUtils.getByte(buf, 0), allowNull);
 
         if (protoVer == NULL_PROTO_VER)
             return null;
 
-        int topVer = buf.getInt();
-        int nodeOrderDrId = buf.getInt();
-        long globalTime = buf.getLong();
-        long order = buf.getLong();
+        int topVer = PageUtils.getInt(buf, 1);
+        int nodeOrderDrId = PageUtils.getInt(buf, 5);
+        long globalTime = PageUtils.getLong(buf, 9);
+        long order = PageUtils.getLong(buf, 17);
 
         return new GridCacheVersion(topVer, nodeOrderDrId, globalTime, order);
     }

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
index a69caab..e1bab5f 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/DataPageIO.java
@@ -17,12 +17,12 @@
 
 package org.apache.ignite.internal.processors.cache.database.tree.io;
 
-import java.nio.ByteBuffer;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashSet;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.pagemem.PageIdUtils;
+import org.apache.ignite.internal.pagemem.PageUtils;
 import org.apache.ignite.internal.processors.cache.CacheObject;
 import org.apache.ignite.internal.processors.cache.database.CacheDataRow;
 import org.apache.ignite.internal.processors.cache.database.tree.util.PageHandler;
@@ -109,16 +109,16 @@ public class DataPageIO extends PageIO {
      * @param buf Byte buffer.
      * @param freeListPageId Free list page ID.
      */
-    public void setFreeListPageId(ByteBuffer buf, long freeListPageId) {
-        buf.putLong(FREE_LIST_PAGE_ID_OFF, freeListPageId);
+    public void setFreeListPageId(long buf, long freeListPageId) {
+        PageUtils.putLong(buf, FREE_LIST_PAGE_ID_OFF, freeListPageId);
     }
 
     /**
      * @param buf Byte buffer.
      * @return Free list page ID.
      */
-    public long getFreeListPageId(ByteBuffer buf) {
-        return buf.getLong(FREE_LIST_PAGE_ID_OFF);
+    public long getFreeListPageId(long buf) {
+        return PageUtils.getLong(buf, FREE_LIST_PAGE_ID_OFF);
     }
 
     /**
@@ -213,7 +213,7 @@ public class DataPageIO extends PageIO {
     /**
      * @return {@code true} If there is no useful data in this page.
      */
-    public boolean isEmpty(ByteBuffer buf) {
+    public boolean isEmpty(long buf) {
         return getDirectCount(buf) == 0;
     }
 
@@ -241,8 +241,8 @@ public class DataPageIO extends PageIO {
      * @param buf Buffer.
      * @return Direct count.
      */
-    private int getDirectCount(ByteBuffer buf) {
-        return buf.get(DIRECT_CNT_OFF) & 0xFF;
+    private int getDirectCount(long buf) {
+        return PageUtils.getByte(buf, DIRECT_CNT_OFF) & 0xFF;
     }
 
     /**

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/IOVersions.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/IOVersions.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/IOVersions.java
index bd1139d..f5eb4b0 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/IOVersions.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/IOVersions.java
@@ -17,8 +17,6 @@
 
 package org.apache.ignite.internal.processors.cache.database.tree.io;
 
-import java.nio.ByteBuffer;
-
 /**
  * Registry for IO versions.
  */
@@ -83,7 +81,7 @@ public final class IOVersions<V extends PageIO> {
      * @param buf Buffer.
      * @return IO.
      */
-    public V forPage(ByteBuffer buf) {
+    public V forPage(long buf) {
         int ver = PageIO.getVersion(buf);
 
         V res = forVersion(ver);

http://git-wip-us.apache.org/repos/asf/ignite/blob/8fcac6f2/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
index aa2d368..12646ae 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/io/PageIO.java
@@ -17,9 +17,9 @@
 
 package org.apache.ignite.internal.processors.cache.database.tree.io;
 
-import java.nio.ByteBuffer;
 import org.apache.ignite.IgniteCheckedException;
 import org.apache.ignite.internal.pagemem.Page;
+import org.apache.ignite.internal.pagemem.PageUtils;
 import org.apache.ignite.internal.pagemem.wal.IgniteWriteAheadLogManager;
 import org.apache.ignite.internal.processors.cache.IgniteCacheOffheapManagerImpl;
 import org.apache.ignite.internal.processors.cache.database.MetadataStorage;
@@ -36,10 +36,10 @@ import org.apache.ignite.internal.processors.cache.database.tree.util.PageLockLi
  * 1. IO should not have any `public static` methods.
  *    We have versioned IOs and any static method will mean that it have to always work in backward
  *    compatible way between all the IO versions. The base class {@link PageIO} has
- *    static methods (like {@code {@link #getPageId(ByteBuffer)}}) intentionally:
+ *    static methods (like {@code {@link #getPageId(long)}}) intentionally:
  *    this base format can not be changed between versions.
  *
- * 2. IO must correctly override {@link #initNewPage(ByteBuffer, long)} method and call super.
+ * 2. IO must correctly override {@link #initNewPage(long, long)} method and call super.
  *    We have logic that relies on this behavior.
  *
  * 3. Page IO type ID constant must be declared in this class to have a list of all the
@@ -166,16 +166,16 @@ public abstract class PageIO {
     /**
      * @return Page type.
      */
-    public static int getType(ByteBuffer buf) {
-        return buf.getShort(TYPE_OFF) & 0xFFFF;
+    public static int getType(long buf) {
+        return PageUtils.getShort(buf, TYPE_OFF) & 0xFFFF;
     }
 
     /**
      * @param buf Buffer.
      * @param type Type.
      */
-    public static void setType(ByteBuffer buf, int type) {
-        buf.putShort(TYPE_OFF, (short)type);
+    public static void setType(long buf, int type) {
+        PageUtils.putShort(buf, TYPE_OFF, (short)type);
 
         assert getType(buf) == type;
     }
@@ -184,16 +184,16 @@ public abstract class PageIO {
      * @param buf Buffer.
      * @return Version.
      */
-    public static int getVersion(ByteBuffer buf) {
-        return buf.getShort(VER_OFF) & 0xFFFF;
+    public static int getVersion(long buf) {
+        return PageUtils.getShort(buf, VER_OFF) & 0xFFFF;
     }
 
     /**
      * @param buf Buffer.
      * @param ver Version.
      */
-    public static void setVersion(ByteBuffer buf, int ver) {
-        buf.putShort(VER_OFF, (short)ver);
+    public static void setVersion(long buf, int ver) {
+        PageUtils.putShort(buf, VER_OFF, (short)ver);
 
         assert getVersion(buf) == ver;
     }
@@ -202,16 +202,16 @@ public abstract class PageIO {
      * @param buf Buffer.
      * @return Page ID.
      */
-    public static long getPageId(ByteBuffer buf) {
-        return buf.getLong(PAGE_ID_OFF);
+    public static long getPageId(long buf) {
+        return PageUtils.getLong(buf, PAGE_ID_OFF);
     }
 
     /**
      * @param buf Buffer.
      * @param pageId Page ID.
      */
-    public static void setPageId(ByteBuffer buf, long pageId) {
-        buf.putLong(PAGE_ID_OFF, pageId);
+    public static void setPageId(long buf, long pageId) {
+        PageUtils.putLong(buf, PAGE_ID_OFF, pageId);
 
         assert getPageId(buf) == pageId;
     }
@@ -220,16 +220,16 @@ public abstract class PageIO {
      * @param buf Buffer.
      * @return Checksum.
      */
-    public static int getCrc(ByteBuffer buf) {
-        return buf.getInt(CRC_OFF);
+    public static int getCrc(long buf) {
+        return PageUtils.getInt(buf, CRC_OFF);
     }
 
     /**
      * @param buf Buffer.
      * @param crc Checksum.
      */
-    public static void setCrc(ByteBuffer buf, int crc) {
-        buf.putInt(CRC_OFF, crc);
+    public static void setCrc(long buf, int crc) {
+        PageUtils.putInt(buf, CRC_OFF, crc);
     }
 
     /**
@@ -275,15 +275,15 @@ public abstract class PageIO {
      * @param buf Buffer.
      * @param pageId Page ID.
      */
-    public void initNewPage(ByteBuffer buf, long pageId) {
+    public void initNewPage(long buf, long pageId) {
         setType(buf, getType());
         setVersion(buf, getVersion());
         setPageId(buf, pageId);
         setCrc(buf, 0);
 
-        buf.putLong(RESERVED_1_OFF, 0L);
-        buf.putLong(RESERVED_2_OFF, 0L);
-        buf.putLong(RESERVED_3_OFF, 0L);
+        PageUtils.putLong(buf, RESERVED_1_OFF, 0L);
+        PageUtils.putLong(buf, RESERVED_2_OFF, 0L);
+        PageUtils.putLong(buf, RESERVED_3_OFF, 0L);
     }
 
     /** {@inheritDoc} */
@@ -296,7 +296,7 @@ public abstract class PageIO {
      * @return IO.
      * @throws IgniteCheckedException If failed.
      */
-    public static <Q extends PageIO> Q getPageIO(ByteBuffer buf) throws IgniteCheckedException {
+    public static <Q extends PageIO> Q getPageIO(long buf) throws IgniteCheckedException {
         int type = getType(buf);
         int ver = getVersion(buf);
 
@@ -343,7 +343,7 @@ public abstract class PageIO {
      * @return IO for either inner or leaf B+Tree page.
      * @throws IgniteCheckedException If failed.
      */
-    public static <Q extends BPlusIO<?>> Q getBPlusIO(ByteBuffer buf) throws IgniteCheckedException {
+    public static <Q extends BPlusIO<?>> Q getBPlusIO(long buf) throws IgniteCheckedException {
         int type = getType(buf);
         int ver = getVersion(buf);