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 2017/01/16 14:12:10 UTC

[11/12] ignite git commit: gg-11810

gg-11810


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

Branch: refs/heads/ignite-gg-11810-1
Commit: 173f3d6f1ab5105cced0fa1ece2f10f054fd110b
Parents: d4ccd89
Author: sboikov <sb...@gridgain.com>
Authored: Mon Jan 16 17:06:44 2017 +0300
Committer: sboikov <sb...@gridgain.com>
Committed: Mon Jan 16 17:06:44 2017 +0300

----------------------------------------------------------------------
 .../ignite/internal/pagemem/PageMemory.java     |   4 -
 .../pagemem/impl/PageMemoryNoStoreImpl.java     |  17 ---
 .../cache/IgniteCacheOffheapManagerImpl.java    |  48 ++++-----
 .../cache/database/CacheDataRowAdapter.java     |  54 +++++-----
 .../cache/database/DataStructure.java           |   8 --
 .../cache/database/tree/BPlusTree.java          | 104 +++++++++----------
 .../cache/database/tree/util/PageHandler.java   |  23 ----
 7 files changed, 100 insertions(+), 158 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ignite/blob/173f3d6f/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 f90e718..cfee19f 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
@@ -38,10 +38,6 @@ public interface PageMemory extends LifecycleAware, PageIdAllocator {
      */
     public Page page(int cacheId, long pageId) throws IgniteCheckedException;
 
-    public long readLockPage0(int cacheId, long pageId);
-
-    public void readUnlockPage0(long pageAddr);
-
     /**
      * @see #page(int, long)
      * Will not read page from file if it is not present in memory.

http://git-wip-us.apache.org/repos/asf/ignite/blob/173f3d6f/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
index fd0ae75..41e401d 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/pagemem/impl/PageMemoryNoStoreImpl.java
@@ -365,23 +365,6 @@ public class PageMemoryNoStoreImpl implements PageMemory {
         return rwLock.readLock(absPtr + LOCK_OFFSET, tag);
     }
 
-    @Override public long readLockPage0(int cacheId, long pageId) {
-        int pageIdx = PageIdUtils.pageIndex(pageId);
-
-        Segment seg = segment(pageIdx);
-
-        long absPtr = seg.absolute(pageIdx);
-
-        if (readLockPage(absPtr, PageIdUtils.tag(pageId)))
-            return absPtr + PageMemoryNoStoreImpl.PAGE_OVERHEAD;
-
-        return 0;
-    }
-
-    @Override public void readUnlockPage0(long pageAddr) {
-        readUnlockPage(pageAddr - PAGE_OVERHEAD);
-    }
-
     /**
      * @param absPtr Page absolute address.
      */

http://git-wip-us.apache.org/repos/asf/ignite/blob/173f3d6f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
index c0c3ea1..45cef13 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/IgniteCacheOffheapManagerImpl.java
@@ -1205,41 +1205,41 @@ public class IgniteCacheOffheapManagerImpl extends GridCacheManagerAdapter imple
 
             PageMemory pageMem = cctx.shared().database().pageMemory();
 
-//            try (Page page = page(pageId(link))) {
-//            }
-            long pageAddr = pageMem.readLockPage0(0, pageId(link)); // Non-empty data page must not be recycled.
+            try (Page page = page(pageId(link))) {
+                long pageAddr = page.getForReadPointer(); // Non-empty data page must not be recycled.
 
-            assert pageAddr != 0L : link;
+                assert pageAddr != 0L : link;
 
-            try {
-                DataPageIO io = DataPageIO.VERSIONS.forPage(pageAddr);
+                try {
+                    DataPageIO io = DataPageIO.VERSIONS.forPage(pageAddr);
 
-                DataPagePayload data = io.readPayload(pageAddr,
-                    itemId(link),
-                    pageMem.pageSize());
+                    DataPagePayload data = io.readPayload(pageAddr,
+                        itemId(link),
+                        pageMem.pageSize());
 
-                if (data.nextLink() == 0) {
-                    long addr = pageAddr + data.offset();
+                    if (data.nextLink() == 0) {
+                        long addr = pageAddr + data.offset();
 
-                    int len = PageUtils.getInt(addr, 0);
+                        int len = PageUtils.getInt(addr, 0);
 
-                    int size = Math.min(bytes.length, len);
+                        int size = Math.min(bytes.length, len);
 
-                    addr += 5; // Skip length and type byte.
+                        addr += 5; // Skip length and type byte.
 
-                    for (int i = 0; i < size; i++) {
-                        byte b1 = PageUtils.getByte(addr, i);
-                        byte b2 = bytes[i];
+                        for (int i = 0; i < size; i++) {
+                            byte b1 = PageUtils.getByte(addr, i);
+                            byte b2 = bytes[i];
 
-                        if (b1 != b2)
-                            return b1 > b2 ? 1 : -1;
-                    }
+                            if (b1 != b2)
+                                return b1 > b2 ? 1 : -1;
+                        }
 
-                    return Integer.compare(len, bytes.length);
+                        return Integer.compare(len, bytes.length);
+                    }
+                }
+                finally {
+                    page.releaseRead();
                 }
-            }
-            finally {
-                pageMem.readUnlockPage0(pageAddr);
             }
 
             // TODO GG-11768.

http://git-wip-us.apache.org/repos/asf/ignite/blob/173f3d6f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java
index 3e215d5..5288aad 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/CacheDataRowAdapter.java
@@ -93,45 +93,45 @@ public class CacheDataRowAdapter implements CacheDataRow {
         do {
             PageMemory pageMem = cctx.shared().database().pageMemory();
 
-            long pageAddr = pageMem.readLockPage0(0, pageId(nextLink)); // Non-empty data page must not be recycled.
+            try (Page page = page(pageId(nextLink), cctx)) {
+                long pageAddr = page.getForReadPointer(); // Non-empty data page must not be recycled.
 
-            assert pageAddr != 0L : nextLink;
+                assert pageAddr != 0L : nextLink;
 
-            try {
-                DataPageIO io = DataPageIO.VERSIONS.forPage(pageAddr);
+                try {
+                    DataPageIO io = DataPageIO.VERSIONS.forPage(pageAddr);
 
-                DataPagePayload data = io.readPayload(pageAddr,
-                    itemId(nextLink),
-                    pageMem.pageSize());
+                    DataPagePayload data = io.readPayload(pageAddr,
+                        itemId(nextLink),
+                        pageMem.pageSize());
 
-                nextLink = data.nextLink();
+                    nextLink = data.nextLink();
 
-                if (first) {
-                    if (nextLink == 0) {
-                        // Fast path for a single page row.
-                        readFullRow(coctx, pageAddr + data.offset(), keyOnly);
+                    if (first) {
+                        if (nextLink == 0) {
+                            // Fast path for a single page row.
+                            readFullRow(coctx, pageAddr + data.offset(), keyOnly);
 
-                        return;
-                    }
+                            return;
+                        }
 
-                    first = false;
-                }
+                        first = false;
+                    }
 
-                ByteBuffer buf = pageMem.pageBuffer(pageAddr);
+                    ByteBuffer buf = pageMem.pageBuffer(pageAddr);
 
-                buf.position(data.offset());
-                buf.limit(data.offset() + data.payloadSize());
+                    buf.position(data.offset());
+                    buf.limit(data.offset() + data.payloadSize());
 
-                incomplete = readFragment(coctx, buf, keyOnly, incomplete);
+                    incomplete = readFragment(coctx, buf, keyOnly, incomplete);
 
-                if (keyOnly && key != null)
-                    return;
-            }
-            finally {
-                pageMem.readUnlockPage0(pageAddr);
+                    if (keyOnly && key != null)
+                        return;
+                }
+                finally {
+                    page.releaseRead();
+                }
             }
-//            try (Page page = page(pageId(nextLink), cctx)) {
-//            }
         }
         while(nextLink != 0);
 

http://git-wip-us.apache.org/repos/asf/ignite/blob/173f3d6f/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 1ca38da..f47a697 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
@@ -162,14 +162,6 @@ public abstract class DataStructure implements PageLockListener {
         return PageHandler.readLock(page, this);
     }
 
-    protected final long readLock0(long pageId) {
-        return pageMem.readLockPage0(0, pageId);
-    }
-
-    protected final void readUnlock0(long pageAddr) {
-        pageMem.readUnlockPage0(pageAddr);
-    }
-
     /**
      * @param page Page.
      * @param buf Buffer.

http://git-wip-us.apache.org/repos/asf/ignite/blob/173f3d6f/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 82d3ae6..7cf829e 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
@@ -746,23 +746,15 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
             firstPageId = getFirstPageId(meta, 0); // Level 0 is always at the bottom.
         }
 
-//        try (Page first = page(firstPageId)) {
-//            long pageAddr = readLock(first); // We always merge pages backwards, the first page is never removed.
-//
-//            try {
-//                cursor.init(pageAddr, io(pageAddr), 0);
-//            }
-//            finally {
-//                readUnlock(first, pageAddr);
-//            }
-//        }
-        long pageAddr = readLock0(firstPageId); // We always merge pages backwards, the first page is never removed.
+        try (Page first = page(firstPageId)) {
+            long pageAddr = readLock(first); // We always merge pages backwards, the first page is never removed.
 
-        try {
-            cursor.init(pageAddr, io(pageAddr), 0);
-        }
-        finally {
-            readUnlock0(pageAddr);
+            try {
+                cursor.init(pageAddr, io(pageAddr), 0);
+            }
+            finally {
+                readUnlock(first, pageAddr);
+            }
         }
 
         return cursor;
@@ -864,7 +856,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
      */
     private Result findDown(final Get g, final long pageId, final long fwdId, final int lvl)
         throws IgniteCheckedException {
-        //Page page = page(pageId);
+        Page page = page(pageId);
 
         try {
             for (;;) {
@@ -872,7 +864,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
                 g.pageId = pageId;
                 g.fwdId = fwdId;
 
-                Result res = readPage(pageMem, pageId, search, g, lvl, RETRY);
+                Result res = readPage(page, this, search, g, lvl, RETRY);
 
                 switch (res) {
                     case GO_DOWN:
@@ -906,8 +898,8 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
             }
         }
         finally {
-//            if (g.canRelease(page, lvl))
-//                page.close();
+            if (g.canRelease(page, lvl))
+                page.close();
         }
     }
 
@@ -1029,26 +1021,28 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
      * @throws IgniteCheckedException If failed.
      */
     private L getGreatestRowInSubTree(long pageId) throws IgniteCheckedException {
-        long pageAddr = readLock0(pageId); // No correctness guaranties.
+        try (Page page = page(pageId)) {
+            long pageAddr = readLock(page); // No correctness guaranties.
 
-        try {
-            BPlusIO<L> io = io(pageAddr);
+            try {
+                BPlusIO<L> io = io(pageAddr);
 
-            int cnt = io.getCount(pageAddr);
+                int cnt = io.getCount(pageAddr);
 
-            if (io.isLeaf()) {
-                if (cnt <= 0) // This code is called only if the tree is not empty, so we can't see empty leaf.
-                    fail("Invalid leaf count: " + cnt + " " + U.hexLong(pageId));
+                if (io.isLeaf()) {
+                    if (cnt <= 0) // This code is called only if the tree is not empty, so we can't see empty leaf.
+                        fail("Invalid leaf count: " + cnt + " " + U.hexLong(pageId));
 
-                return io.getLookupRow(this, pageAddr, cnt - 1);
-            }
+                    return io.getLookupRow(this, pageAddr, cnt - 1);
+                }
 
-            long rightId = inner(io).getLeft(pageAddr, cnt);// The same as getRight(cnt - 1), but good for routing pages.
+                long rightId = inner(io).getLeft(pageAddr, cnt);// The same as getRight(cnt - 1), but good for routing pages.
 
-            return getGreatestRowInSubTree(rightId);
-        }
-        finally {
-            readUnlock0(pageAddr);
+                return getGreatestRowInSubTree(rightId);
+            }
+            finally {
+                readUnlock(page, pageAddr);
+            }
         }
     }
 
@@ -1391,7 +1385,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
                 r.fwdId = fwdId;
                 r.backId = backId;
 
-                Result res = readPage(pageMem, pageId, search, r, lvl, RETRY);
+                Result res = readPage(page, this, search, r, lvl, RETRY);
 
                 switch (res) {
                     case GO_DOWN_X:
@@ -1790,12 +1784,10 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
      * @return Operation result.
      */
     private Result askNeighbor(long pageId, Get g, boolean back) throws IgniteCheckedException {
-        return readPage(pageMem, pageId, askNeighbor, g,
-            back ? TRUE.ordinal() : FALSE.ordinal(), RETRY);
-//        try (Page page = page(pageId)) {
-//            return readPage(page, this, askNeighbor, g,
-//                back ? TRUE.ordinal() : FALSE.ordinal(), RETRY);
-//        }
+        try (Page page = page(pageId)) {
+            return readPage(page, this, askNeighbor, g,
+                back ? TRUE.ordinal() : FALSE.ordinal(), RETRY);
+        }
     }
 
     /**
@@ -1818,7 +1810,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
                 p.pageId = pageId;
                 p.fwdId = fwdId;
 
-                Result res = readPage(pageMem, pageId, search, p, lvl, RETRY);
+                Result res = readPage(page, this, search, p, lvl, RETRY);
 
                 switch (res) {
                     case GO_DOWN:
@@ -3679,22 +3671,24 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
                     return false; // Done.
                 }
 
-                long pageAddr = readLock0(nextPageId); // Doing explicit null check.
+                try (Page next = page(nextPageId)) {
+                    long pageAddr = readLock(next); // Doing explicit null check.
 
-                // If concurrent merge occurred we have to reinitialize cursor from the last returned row.
-                if (pageAddr == 0L)
-                    break;
+                    // If concurrent merge occurred we have to reinitialize cursor from the last returned row.
+                    if (pageAddr == 0L)
+                        break;
 
-                try {
-                    BPlusIO<L> io = io(pageAddr);
+                    try {
+                        BPlusIO<L> io = io(pageAddr);
 
-                    if (fillFromBuffer(pageAddr, io, 0, io.getCount(pageAddr)))
-                        return true;
+                        if (fillFromBuffer(pageAddr, io, 0, io.getCount(pageAddr)))
+                            return true;
 
-                    // Continue fetching forward.
-                }
-                finally {
-                    readUnlock0(pageAddr);
+                        // Continue fetching forward.
+                    }
+                    finally {
+                        readUnlock(next, pageAddr);
+                    }
                 }
             }
 
@@ -3730,7 +3724,7 @@ public abstract class BPlusTree<L, T extends L> extends DataStructure implements
         @SuppressWarnings("unchecked")
         @Override public final Result run(Page page, PageIO iox, long pageAddr, G g, int lvl)
             throws IgniteCheckedException {
-//            assert PageIO.getPageId(pageAddr) == page.id();
+            assert PageIO.getPageId(pageAddr) == page.id();
 
             // If we've passed the check for correct page ID, we can safely cast.
             BPlusIO<L> io = (BPlusIO<L>)iox;

http://git-wip-us.apache.org/repos/asf/ignite/blob/173f3d6f/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/util/PageHandler.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/util/PageHandler.java b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/util/PageHandler.java
index 8efe619..97b5a04 100644
--- a/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/util/PageHandler.java
+++ b/modules/core/src/main/java/org/apache/ignite/internal/processors/cache/database/tree/util/PageHandler.java
@@ -96,29 +96,6 @@ public abstract class PageHandler<X, R> {
         }
     }
 
-    public static <X, R> R readPage(
-        PageMemory pageMem,
-        long pageId,
-        PageHandler<X, R> h,
-        X arg,
-        int intArg,
-        R lockFailed
-    ) throws IgniteCheckedException {
-        long pageAddr = pageMem.readLockPage0(0, pageId);
-
-        if (pageAddr == 0L)
-            return lockFailed;
-
-        try {
-            PageIO io = PageIO.getPageIO(pageAddr);
-
-            return h.run(null, io, pageAddr, arg, intArg);
-        }
-        finally {
-            pageMem.readUnlockPage0(pageAddr);
-        }
-    }
-
     /**
      * @param pageMem Page memory.
      * @param page Page.