http://git-wip-us.apache.org/repos/asf/ignite/blob/7db65ddd/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 4da44bc..e44838d 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 @@ -86,17 +86,17 @@ 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 pageAddr, Void ignore, int bucket) throws IgniteCheckedException { - assert getPageId(buf) == page.id(); + assert getPageId(pageAddr) == page.id(); PagesListNodeIO io = (PagesListNodeIO)pageIo; - long tailId = io.getNextId(buf); + long tailId = io.getNextId(pageAddr); assert tailId != 0; - io.setNextId(buf, 0L); + io.setNextId(pageAddr, 0L); if (isWalDeltaRecordNeeded(wal, page)) wal.log(new PagesListSetNextRecord(cacheId, page.id(), 0L)); @@ -140,7 +140,7 @@ public abstract class PagesList extends DataStructure { if (metaPageId != 0L) { if (initNew) { try (Page page = page(metaPageId)) { - initPage(page, this, PagesListMetaIO.VERSIONS.latest(), wal); + initPage(pageMem, page, this, PagesListMetaIO.VERSIONS.latest(), wal); } } else { @@ -150,16 +150,16 @@ public abstract class PagesList extends DataStructure { while (nextPageId != 0) { try (Page page = page(nextPageId)) { - ByteBuffer buf = readLock(page); // No concurrent recycling on init. + long pageAddr = readLock(page); // No concurrent recycling on init. - assert buf != null; + assert pageAddr != 0L; try { - PagesListMetaIO io = PagesListMetaIO.VERSIONS.forPage(buf); + PagesListMetaIO io = PagesListMetaIO.VERSIONS.forPage(pageAddr); - io.getBucketsData(buf, bucketsData); + io.getBucketsData(pageAddr, bucketsData); - long next0 = io.getNextMetaPageId(buf); + long next0 = io.getNextMetaPageId(pageAddr); assert next0 != nextPageId : "Loop detected [next=" + U.hexLong(next0) + ", cur=" + U.hexLong(nextPageId) + ']'; @@ -167,7 +167,7 @@ public abstract class PagesList extends DataStructure { nextPageId = next0; } finally { - readUnlock(page, buf); + readUnlock(page, pageAddr); } } } @@ -199,7 +199,7 @@ public abstract class PagesList extends DataStructure { assert metaPageId != 0; Page curPage = null; - ByteBuffer curBuf = null; + long curPageAddr = 0L; PagesListMetaIO curIo = null; long nextPageId = metaPageId; @@ -212,39 +212,39 @@ 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(), curPageAddr, bucket, tails, tailIdx) : 0; if (written == 0) { if (nextPageId == 0L) { nextPageId = allocatePageNoReuse(); if (curPage != null) { - curIo.setNextMetaPageId(curBuf, nextPageId); + curIo.setNextMetaPageId(curPageAddr, nextPageId); - releaseAndClose(curPage, curBuf); + releaseAndClose(curPage, curPageAddr); curPage = null; } curPage = page(nextPageId); - curBuf = writeLock(curPage); + curPageAddr = writeLock(curPage); curIo = PagesListMetaIO.VERSIONS.latest(); - curIo.initNewPage(curBuf, nextPageId); + curIo.initNewPage(curPageAddr, nextPageId, pageSize()); } else { - releaseAndClose(curPage, curBuf); + releaseAndClose(curPage, curPageAddr); curPage = null; curPage = page(nextPageId); - curBuf = writeLock(curPage); + curPageAddr = writeLock(curPage); - curIo = PagesListMetaIO.VERSIONS.forPage(curBuf); + curIo = PagesListMetaIO.VERSIONS.forPage(curPageAddr); - curIo.resetCount(curBuf); + curIo.resetCount(curPageAddr); } - nextPageId = curIo.getNextMetaPageId(curBuf); + nextPageId = curIo.getNextMetaPageId(curPageAddr); } else tailIdx += written; @@ -253,25 +253,25 @@ public abstract class PagesList extends DataStructure { } } finally { - releaseAndClose(curPage, curBuf); + releaseAndClose(curPage, curPageAddr); } while (nextPageId != 0L) { try (Page page = page(nextPageId)) { - ByteBuffer buf = writeLock(page); + long pageAddr = writeLock(page); try { - PagesListMetaIO io = PagesListMetaIO.VERSIONS.forPage(buf); + PagesListMetaIO io = PagesListMetaIO.VERSIONS.forPage(pageAddr); - io.resetCount(buf); + io.resetCount(pageAddr); if (PageHandler.isWalDeltaRecordNeeded(wal, page)) wal.log(new PageListMetaResetCountRecord(cacheId, nextPageId)); - nextPageId = io.getNextMetaPageId(buf); + nextPageId = io.getNextMetaPageId(pageAddr); } finally { - writeUnlock(page, buf, true); + writeUnlock(page, pageAddr, true); } } } @@ -281,7 +281,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. @@ -322,10 +322,10 @@ 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); + io.initNewPage(next, nextId, pageSize()); io.setPreviousId(next, prevId); io.setNextId(prev, nextId); @@ -342,7 +342,7 @@ public abstract class PagesList extends DataStructure { long pageId = reuse ? allocatePage(null) : allocatePageNoReuse(); try (Page page = page(pageId)) { - initPage(page, this, PagesListNodeIO.VERSIONS.latest(), wal); + initPage(pageMem, page, this, PagesListNodeIO.VERSIONS.latest(), wal); } Stripe stripe = new Stripe(pageId); @@ -466,19 +466,19 @@ public abstract class PagesList extends DataStructure { long pageId = tail.tailId; try (Page page = page(pageId)) { - ByteBuffer buf = readLock(page); // No correctness guaranties. + long pageAddr = readLock(page); // No correctness guaranties. try { - PagesListNodeIO io = PagesListNodeIO.VERSIONS.forPage(buf); + PagesListNodeIO io = PagesListNodeIO.VERSIONS.forPage(pageAddr); - int cnt = io.getCount(buf); + int cnt = io.getCount(pageAddr); assert cnt >= 0; res += cnt; } finally { - readUnlock(page, buf); + readUnlock(page, pageAddr); } } } @@ -493,9 +493,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); @@ -503,9 +503,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; @@ -551,10 +551,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) @@ -562,7 +562,7 @@ public abstract class PagesList extends DataStructure { long dataPageId = dataPage.id(); - int idx = io.addPage(buf, dataPageId); + int idx = io.addPage(buf, dataPageId, pageSize()); if (idx == -1) handlePageFull(pageId, page, buf, io, dataPage, dataPageBuf, bucket); @@ -593,10 +593,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(); @@ -631,17 +631,17 @@ public abstract class PagesList extends DataStructure { long nextId = allocatePage(null); try (Page next = page(nextId)) { - ByteBuffer nextBuf = writeLock(next); // Newly allocated page. + long nextPageAddr = writeLock(next); // Newly allocated page. - assert nextBuf != null; + assert nextPageAddr != 0L; try { - setupNextPage(io, pageId, buf, nextId, nextBuf); + setupNextPage(io, pageId, buf, nextId, nextPageAddr); if (isWalDeltaRecordNeeded(wal, page)) wal.log(new PagesListSetNextRecord(cacheId, pageId, nextId)); - int idx = io.addPage(nextBuf, dataPageId); + int idx = io.addPage(nextPageAddr, dataPageId, pageSize()); // Here we should never write full page, because it is known to be new. next.fullPageWalRecordPolicy(FALSE); @@ -667,7 +667,7 @@ public abstract class PagesList extends DataStructure { updateTail(bucket, pageId, nextId); } finally { - writeUnlock(next, nextBuf, true); + writeUnlock(next, nextPageAddr, true); } } } @@ -687,7 +687,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 @@ -696,21 +696,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(prevBuf, nextId, pageSize()); 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 nextPageAddr = writeLock(next); // Page from reuse bag can't be concurrently recycled. - assert nextBuf != null; + assert nextPageAddr != 0L; if (locked == null) { lockedBufs = new ArrayList<>(2); @@ -718,9 +718,9 @@ public abstract class PagesList extends DataStructure { } locked.add(next); - lockedBufs.add(nextBuf); + lockedBufs.add(nextPageAddr); - setupNextPage(io, prevId, prevBuf, nextId, nextBuf); + setupNextPage(io, prevId, prevBuf, nextId, nextPageAddr); if (isWalDeltaRecordNeeded(wal, page)) wal.log(new PagesListSetNextRecord(cacheId, prevId, nextId)); @@ -741,7 +741,7 @@ public abstract class PagesList extends DataStructure { // Switch to this new page, which is now a part of our list // to add the rest of the bag to the new page. - prevBuf = nextBuf; + prevBuf = nextPageAddr; prevId = nextId; page = next; } @@ -784,15 +784,15 @@ public abstract class PagesList extends DataStructure { * @param page Page. * @param bucket Bucket. * @param lockAttempt Lock attempts counter. - * @return Buffer if page is locket of {@code null} if can retry lock. + * @return Page address if page is locked 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 pageAddr = tryWriteLock(page); - if (buf != null) - return buf; + if (pageAddr != 0L) + return pageAddr; if (lockAttempt == TRY_LOCK_ATTEMPTS) { Stripe[] stripes = getBucket(bucket); @@ -800,11 +800,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. } /** @@ -823,9 +823,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); @@ -859,7 +859,7 @@ public abstract class PagesList extends DataStructure { if (prevId != 0L) { try (Page prev = page(prevId)) { // Lock pages from next to previous. - Boolean ok = writePage(prev, this, cutTail, null, bucket, FALSE); + Boolean ok = writePage(pageMem, prev, this, cutTail, null, bucket, FALSE); assert ok == TRUE : ok; } @@ -878,7 +878,7 @@ public abstract class PagesList extends DataStructure { try (Page prev = page(prevId)) { // Lock pages from next to previous. - Boolean ok = writePage(prev, this, cutTail, null, bucket, FALSE); + Boolean ok = writePage(pageMem, prev, this, cutTail, null, bucket, FALSE); assert ok == TRUE : ok; } @@ -888,7 +888,7 @@ public abstract class PagesList extends DataStructure { PageIO initIo = initIoVers.latest(); - initIo.initNewPage(tailBuf, tailId); + initIo.initNewPage(tailBuf, tailId, pageSize()); if (isWalDeltaRecordNeeded(wal, tail)) { wal.log(new InitNewPageRecord(cacheId, tail.id(), initIo.getType(), @@ -933,7 +933,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(); @@ -947,17 +947,17 @@ public abstract class PagesList extends DataStructure { long recycleId = 0L; - ByteBuffer buf = writeLock(page); // Explicit check. + long pageAddr = writeLock(page); // Explicit check. - if (buf == null) + if (pageAddr == 0L) return false; boolean rmvd = false; try { - PagesListNodeIO io = PagesListNodeIO.VERSIONS.forPage(buf); + PagesListNodeIO io = PagesListNodeIO.VERSIONS.forPage(pageAddr); - rmvd = io.removePage(buf, dataPageId); + rmvd = io.removePage(pageAddr, dataPageId); if (!rmvd) return false; @@ -971,20 +971,20 @@ public abstract class PagesList extends DataStructure { if (isWalDeltaRecordNeeded(wal, dataPage)) wal.log(new DataPageSetFreeListPageRecord(cacheId, dataPageId, 0L)); - if (!io.isEmpty(buf)) + if (!io.isEmpty(pageAddr)) return true; // In optimistic case we still have something in the page and can leave it as is. // If the page is empty, we have to try to drop it and link next and previous with each other. - nextId = io.getNextId(buf); - prevId = io.getPreviousId(buf); + nextId = io.getNextId(pageAddr); + prevId = io.getPreviousId(pageAddr); // If there are no next page, then we can try to merge without releasing current write lock, // because if we will need to lock previous page, the locking order will be already correct. if (nextId == 0L) - recycleId = mergeNoNext(pageId, page, buf, prevId, bucket); + recycleId = mergeNoNext(pageId, page, pageAddr, prevId, bucket); } finally { - writeUnlock(page, buf, rmvd); + writeUnlock(page, pageAddr, rmvd); } // Perform a fair merge after lock release (to have a correct locking order). @@ -1007,7 +1007,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. @@ -1016,7 +1016,7 @@ public abstract class PagesList extends DataStructure { if (prevId != 0L) { // Cut tail if we have a previous page. try (Page prev = page(prevId)) { - Boolean ok = writePage(prev, this, cutTail, null, bucket, FALSE); + Boolean ok = writePage(pageMem, prev, this, cutTail, null, bucket, FALSE); assert ok == TRUE: ok; // Because we keep lock on current tail and do a world consistency check. } @@ -1044,25 +1044,25 @@ 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 nextPageAddr = next == null ? 0L : writeLock(next); // Explicit check. + long pageAddr = writeLock(page); // Explicit check. - if (buf == null) { - if (nextBuf != null) // Unlock next page if needed. - writeUnlock(next, nextBuf, false); + if (pageAddr == 0L) { + if (nextPageAddr != 0L) // Unlock next page if needed. + writeUnlock(next, nextPageAddr, false); return 0L; // Someone has merged or taken our empty page concurrently. Nothing to do here. } try { - PagesListNodeIO io = PagesListNodeIO.VERSIONS.forPage(buf); + PagesListNodeIO io = PagesListNodeIO.VERSIONS.forPage(pageAddr); - if (!io.isEmpty(buf)) + if (!io.isEmpty(pageAddr)) 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)) { - long recycleId = doMerge(pageId, page, buf, io, next, nextId, nextBuf, bucket); + if (io.getNextId(pageAddr) == nextId && (nextId == 0L) == (nextPageAddr == 0L)) { + long recycleId = doMerge(pageId, page, pageAddr, io, next, nextId, nextPageAddr, bucket); write = true; @@ -1070,13 +1070,13 @@ public abstract class PagesList extends DataStructure { } // Reread next page ID and go for retry. - nextId = io.getNextId(buf); + nextId = io.getNextId(pageAddr); } finally { - if (nextBuf != null) - writeUnlock(next, nextBuf, write); + if (nextPageAddr != 0L) + writeUnlock(next, nextPageAddr, write); - writeUnlock(page, buf, write); + writeUnlock(page, pageAddr, write); } } } @@ -1097,11 +1097,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); @@ -1143,22 +1143,22 @@ 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 prevPageAddr = writeLock(prev); // No check, we keep a reference. - assert prevBuf != null; + assert prevPageAddr != 0L; try { - PagesListNodeIO prevIO = PagesListNodeIO.VERSIONS.forPage(prevBuf); + PagesListNodeIO prevIO = PagesListNodeIO.VERSIONS.forPage(prevPageAddr); PagesListNodeIO nextIO = PagesListNodeIO.VERSIONS.forPage(nextBuf); // These references must be updated at the same time in write locks. - assert prevIO.getNextId(prevBuf) == pageId; + assert prevIO.getNextId(prevPageAddr) == pageId; assert nextIO.getPreviousId(nextBuf) == pageId; - prevIO.setNextId(prevBuf, nextId); + prevIO.setNextId(prevPageAddr, nextId); if (isWalDeltaRecordNeeded(wal, prev)) wal.log(new PagesListSetNextRecord(cacheId, prevId, nextId)); @@ -1169,7 +1169,7 @@ public abstract class PagesList extends DataStructure { wal.log(new PagesListSetPreviousRecord(cacheId, nextId, prevId)); } finally { - writeUnlock(prev, prevBuf, true); + writeUnlock(prev, prevPageAddr, true); } } } @@ -1181,7 +1181,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/7db65ddd/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..6bd50a3 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,66 +53,67 @@ public class PagesListMetaIO extends PageIO { } /** {@inheritDoc} */ - @Override public void initNewPage(ByteBuffer buf, long pageId) { - super.initNewPage(buf, pageId); + @Override public void initNewPage(long pageAddr, long pageId, int pageSize) { + super.initNewPage(pageAddr, pageId, pageSize); - setCount(buf, 0); - setNextMetaPageId(buf, 0L); + setCount(pageAddr, 0); + setNextMetaPageId(pageAddr, 0L); } /** - * @param buf Buffer. + * @param pageAddr Page address. * @return Stored items count. */ - private int getCount(ByteBuffer buf) { - return buf.getShort(CNT_OFF); + private int getCount(long pageAddr) { + return PageUtils.getShort(pageAddr, CNT_OFF); } /** - * @param buf Buffer, + * @param pageAddr Page address. * @param cnt Stored items count. */ - private void setCount(ByteBuffer buf, int cnt) { + private void setCount(long pageAddr, int cnt) { assert cnt >= 0 && cnt <= Short.MAX_VALUE : cnt; - buf.putShort(CNT_OFF, (short)cnt); + PageUtils.putShort(pageAddr, CNT_OFF, (short)cnt); } /** - * @param buf Buffer. + * @param pageAddr Page address. * @return Next meta page ID. */ - public long getNextMetaPageId(ByteBuffer buf) { - return buf.getLong(NEXT_META_PAGE_OFF); + public long getNextMetaPageId(long pageAddr) { + return PageUtils.getLong(pageAddr, NEXT_META_PAGE_OFF); } /** - * @param buf Buffer. + * @param pageAddr Page address. * @param metaPageId Next meta page ID. */ - public void setNextMetaPageId(ByteBuffer buf, long metaPageId) { - buf.putLong(NEXT_META_PAGE_OFF, metaPageId); + public void setNextMetaPageId(long pageAddr, long metaPageId) { + PageUtils.putLong(pageAddr, NEXT_META_PAGE_OFF, metaPageId); } /** - * @param buf Buffer. + * @param pageAddr Page address. */ - public void resetCount(ByteBuffer buf) { - setCount(buf, 0); + public void resetCount(long pageAddr) { + setCount(pageAddr, 0); } /** - * @param buf Buffer. + * @param pageSize Page size. + * @param pageAddr Page address. * @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 pageAddr, int bucket, PagesList.Stripe[] tails, int tailsOff) { assert bucket >= 0 && bucket <= Short.MAX_VALUE : bucket; - int cnt = getCount(buf); - int cap = getCapacity(buf); + int cnt = getCount(pageAddr); + int cap = getCapacity(pageSize, pageAddr); if (cnt == cap) return 0; @@ -122,25 +123,25 @@ 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(pageAddr, off, (short)bucket); + PageUtils.putLong(pageAddr, off + 2, tails[tailsOff].tailId); tailsOff++; off += ITEM_SIZE; } - setCount(buf, cnt + write); + setCount(pageAddr, cnt + write); return write; } /** - * @param buf Buffer. + * @param pageAddr Page address. * @param res Results map. */ - public void getBucketsData(ByteBuffer buf, Map<Integer, GridLongList> res) { - int cnt = getCount(buf); + public void getBucketsData(long pageAddr, Map<Integer, GridLongList> res) { + int cnt = getCount(pageAddr); 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(pageAddr, off); assert bucket >= 0 && bucket <= Short.MAX_VALUE : bucket; - long tailId = buf.getLong(off + 2); + long tailId = PageUtils.getLong(pageAddr, off + 2); assert tailId != 0; GridLongList list = res.get(bucket); @@ -168,11 +169,11 @@ public class PagesListMetaIO extends PageIO { } /** - * @param buf Buffer. + * @param pageAddr Page address. * @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 pageAddr) { + return (pageSize - ITEMS_OFF) / ITEM_SIZE; } /** http://git-wip-us.apache.org/repos/asf/ignite/blob/7db65ddd/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..6bd0532 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,84 +52,84 @@ public class PagesListNodeIO extends PageIO { } /** {@inheritDoc} */ - @Override public void initNewPage(ByteBuffer buf, long pageId) { - super.initNewPage(buf, pageId); + @Override public void initNewPage(long pageAddr, long pageId, int pageSize) { + super.initNewPage(pageAddr, pageId, pageSize); - setEmpty(buf); + setEmpty(pageAddr); - setPreviousId(buf, 0L); - setNextId(buf, 0L); + setPreviousId(pageAddr, 0L); + setNextId(pageAddr, 0L); } /** - * @param buf Buffer. + * @param pageAddr Page address. */ - private void setEmpty(ByteBuffer buf) { - setCount(buf, 0); + private void setEmpty(long pageAddr) { + setCount(pageAddr, 0); } /** - * @param buf Buffer. + * @param pageAddr Page address. * @return Next page ID. */ - public long getNextId(ByteBuffer buf) { - return buf.getLong(NEXT_PAGE_ID_OFF); + public long getNextId(long pageAddr) { + return PageUtils.getLong(pageAddr, NEXT_PAGE_ID_OFF); } /** - * @param buf Buffer. + * @param pageAddr Page address. * @param nextId Next page ID. */ - public void setNextId(ByteBuffer buf, long nextId) { - buf.putLong(NEXT_PAGE_ID_OFF, nextId); + public void setNextId(long pageAddr, long nextId) { + PageUtils.putLong(pageAddr, NEXT_PAGE_ID_OFF, nextId); } /** - * @param buf Buffer. + * @param pageAddr Page address. * @return Previous page ID. */ - public long getPreviousId(ByteBuffer buf) { - return buf.getLong(PREV_PAGE_ID_OFF); + public long getPreviousId(long pageAddr) { + return PageUtils.getLong(pageAddr, PREV_PAGE_ID_OFF); } /** - * @param buf Page buffer. + * @param pageAddr Page address. * @param prevId Previous page ID. */ - public void setPreviousId(ByteBuffer buf, long prevId) { - buf.putLong(PREV_PAGE_ID_OFF, prevId); + public void setPreviousId(long pageAddr, long prevId) { + PageUtils.putLong(pageAddr, PREV_PAGE_ID_OFF, prevId); } /** * Gets total count of entries in this page. Does not change the buffer state. * - * @param buf Page buffer to get count from. + * @param pageAddr Page address to get count from. * @return Total number of entries. */ - public int getCount(ByteBuffer buf) { - return buf.getShort(CNT_OFF); + public int getCount(long pageAddr) { + return PageUtils.getShort(pageAddr, CNT_OFF); } /** * Sets total count of entries in this page. Does not change the buffer state. * - * @param buf Page buffer to write to. + * @param pageAddr Page address to write to. * @param cnt Count. */ - private void setCount(ByteBuffer buf, int cnt) { + private void setCount(long pageAddr, int cnt) { assert cnt >= 0 && cnt <= Short.MAX_VALUE : cnt; - buf.putShort(CNT_OFF, (short)cnt); + PageUtils.putShort(pageAddr, 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 } /** @@ -141,38 +141,39 @@ public class PagesListNodeIO extends PageIO { } /** - * @param buf Page buffer. + * @param pageAddr Page address. * @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 pageAddr, int idx) { + return PageUtils.getLong(pageAddr, offset(idx)); } /** - * @param buf Buffer. + * @param pageAddr Page address. * @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 pageAddr, int idx, long pageId) { + PageUtils.putLong(pageAddr, offset(idx), pageId); } /** * Adds page to the end of pages list. * - * @param buf Page buffer. + * @param pageAddr Page address. * @param pageId Page ID. + * @param pageSize Page size. * @return Total number of items in this page. */ - public int addPage(ByteBuffer buf, long pageId) { - int cnt = getCount(buf); + public int addPage(long pageAddr, long pageId, int pageSize) { + int cnt = getCount(pageAddr); - if (cnt == getCapacity(buf)) + if (cnt == getCapacity(pageSize)) return -1; - setAt(buf, cnt, pageId); - setCount(buf, cnt + 1); + setAt(pageAddr, cnt, pageId); + setCount(pageAddr, cnt + 1); return cnt; } @@ -180,38 +181,38 @@ public class PagesListNodeIO extends PageIO { /** * Removes any page from the pages list. * - * @param buf Page buffer. + * @param pageAddr Page address. * @return Removed page ID. */ - public long takeAnyPage(ByteBuffer buf) { - int cnt = getCount(buf); + public long takeAnyPage(long pageAddr) { + int cnt = getCount(pageAddr); if (cnt == 0) return 0L; - setCount(buf, --cnt); + setCount(pageAddr, --cnt); - return getAt(buf, cnt); + return getAt(pageAddr, cnt); } /** * Removes the given page ID from the pages list. * - * @param buf Page buffer. + * @param pageAddr Page address. * @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 pageAddr, long dataPageId) { assert dataPageId != 0; - int cnt = getCount(buf); + int cnt = getCount(pageAddr); for (int i = 0; i < cnt; i++) { - if (getAt(buf, i) == dataPageId) { + if (getAt(pageAddr, i) == dataPageId) { if (i != cnt - 1) - copyMemory(buf, buf, offset(i + 1), offset(i), 8 * (cnt - i - 1)); + copyMemory(pageAddr, pageAddr, offset(i + 1), offset(i), 8 * (cnt - i - 1)); - setCount(buf, cnt - 1); + setCount(pageAddr, cnt - 1); return true; } @@ -221,10 +222,10 @@ public class PagesListNodeIO extends PageIO { } /** - * @param buf Page buffer. - * @return {@code true} if there are no items in this page. + * @param pageAddr Page address. + * @return {@code True} if there are no items in this page. */ - public boolean isEmpty(ByteBuffer buf) { - return getCount(buf) == 0; + public boolean isEmpty(long pageAddr) { + return getCount(pageAddr) == 0; } }