/** * @param seqNo Page sequence number. * @return Page index */ public int pageIndex(int seqNo) { return PageIdUtils.pageIndex(fromSegmentIndex(idx, seqNo - pagesInPrevSegments)); } }
/** {@inheritDoc} */ @Override public synchronized void touchPage(long pageId) throws IgniteCheckedException { pageUsageList.addLast(PageIdUtils.pageIndex(pageId)); }
/** {@inheritDoc} */ @Override public void releasePage(int cacheId, long pageId, long page) { if (trackAcquiredPages) { Segment seg = segment(PageIdUtils.pageIndex(pageId)); seg.onPageRelease(); } }
/** {@inheritDoc} */ @Override public long pageOffset(long pageId) { return (long) PageIdUtils.pageIndex(pageId) * pageSize + headerSize(); }
/** * @param pageId Page id. * @param pageSize Page size. * @return Page id of tracking page which set pageId belongs to. */ public long trackingPageFor(long pageId, int pageSize) { assert PageIdUtils.pageIndex(pageId) > 0; int pageIdx = ((PageIdUtils.pageIndex(pageId) - COUNT_OF_EXTRA_PAGE) / countOfPageToTrack(pageSize)) * countOfPageToTrack(pageSize) + COUNT_OF_EXTRA_PAGE; long trackingPageId = PageIdUtils.pageId(PageIdUtils.partId(pageId), PageIdUtils.flag(pageId), pageIdx); assert PageIdUtils.pageIndex(trackingPageId) <= PageIdUtils.pageIndex(pageId); return trackingPageId; }
/** {@inheritDoc} */ @Override public void forgetPage(long pageId) { int pageIdx = PageIdUtils.pageIndex(pageId); GridUnsafe.putIntVolatile(null, trackingArrPtr + trackingIdx(pageIdx) * 4, 0); } }
/** {@inheritDoc} */ @Override public void forgetPage(long pageId) { int pageIdx = PageIdUtils.pageIndex(pageId); int trackingIdx = trackingIdx(pageIdx); GridUnsafe.putLongVolatile(null, trackingArrPtr + trackingIdx * 8, 0L); } }
/** {@inheritDoc} */ @Override protected boolean checkTouch(long pageId) { int trackingIdx = trackingIdx(PageIdUtils.pageIndex(pageId)); int ts = GridUnsafe.getIntVolatile(null, trackingArrPtr + trackingIdx * 4); return ts != 0; }
/** {@inheritDoc} */ @Override protected boolean checkTouch(long pageId) { int trackingIdx = trackingIdx(PageIdUtils.pageIndex(pageId)); int firstTs = GridUnsafe.getIntVolatile(null, trackingArrPtr + trackingIdx * 8); return firstTs != 0; }
/** * Change page type. * * @param pageId Old page ID. * @param type New page type. * @return Changed page ID. */ public static long changeType(long pageId, byte type) { return pageId(partId(pageId), type, pageIndex(pageId)); }
/** * @param pageId Page ID. * @param partId Partition ID. */ public static long changePartitionId(long pageId, int partId) { byte flag = flag(pageId); int pageIdx = pageIndex(pageId); return pageId(partId, flag, pageIdx); } }
/** * @param pageId Page id. */ public static String toDetailString(long pageId) { return "pageId=" + pageId + "(offset=" + itemId(pageId) + ", flags=" + Integer.toBinaryString(flag(pageId)) + ", partId=" + partId(pageId) + ", index=" + pageIndex(pageId) + ")" ; }
/** * @return Relative pointer to a free page that was borrowed from the allocated pool. */ private long borrowFreePage() { while (true) { long freePageRelPtrMasked = freePageListHead.get(); long freePageRelPtr = freePageRelPtrMasked & ADDRESS_MASK; if (freePageRelPtr != INVALID_REL_PTR) { int pageIdx = PageIdUtils.pageIndex(freePageRelPtr); Segment seg = segment(pageIdx); long freePageAbsPtr = seg.absolute(pageIdx); long nextFreePageRelPtr = GridUnsafe.getLong(freePageAbsPtr) & ADDRESS_MASK; long cnt = ((freePageRelPtrMasked & COUNTER_MASK) + COUNTER_INC) & COUNTER_MASK; if (freePageListHead.compareAndSet(freePageRelPtrMasked, nextFreePageRelPtr | cnt)) { GridUnsafe.putLong(freePageAbsPtr, PAGE_MARKER); allocatedPages.incrementAndGet(); memMetrics.updateTotalAllocatedPages(1L); return freePageRelPtr; } } else return INVALID_REL_PTR; } }
/** {@inheritDoc} */ @Override public long acquirePage(int cacheId, long pageId, IoStatisticsHolder statHolder) { int pageIdx = PageIdUtils.pageIndex(pageId); Segment seg = segment(pageIdx); long absPtr = seg.acquirePage(pageIdx); statHolder.trackLogicalRead(absPtr + PAGE_OVERHEAD); return absPtr; }
/** * @param pageId Page ID to release. */ private void releaseFreePage(long pageId) { int pageIdx = PageIdUtils.pageIndex(pageId); // Clear out flags and file ID. long relPtr = PageIdUtils.pageId(0, (byte)0, pageIdx); Segment seg = segment(pageIdx); long absPtr = seg.absolute(pageIdx); // Second, write clean relative pointer instead of page ID. writePageId(absPtr, relPtr); // Third, link the free page. while (true) { long freePageRelPtrMasked = freePageListHead.get(); long freePageRelPtr = freePageRelPtrMasked & RELATIVE_PTR_MASK; GridUnsafe.putLong(absPtr, freePageRelPtr); if (freePageListHead.compareAndSet(freePageRelPtrMasked, relPtr)) { allocatedPages.decrementAndGet(); memMetrics.updateTotalAllocatedPages(-1L); return; } } }
/** {@inheritDoc} */ @Override public void touchPage(long pageId) throws IgniteCheckedException { int pageIdx = PageIdUtils.pageIndex(pageId); long res = compactTimestamp(U.currentTimeMillis()); assert res >= 0 && res < Integer.MAX_VALUE; GridUnsafe.putIntVolatile(null, trackingArrPtr + trackingIdx(pageIdx) * 4, (int)res); }
/** * @param record page snapshot record to handle. */ private void registerPageSnapshot(PageSnapshot record) { FullPageId fullPageId = record.fullPageId(); long pageId = fullPageId.pageId(); incrementStat(getPageType(record), record, pageSnapshotTypes); final int idx = PageIdUtils.pageIndex(pageId); final String idxAsStr = idx <= 100 ? Integer.toString(idx) : ">100"; incrementStat(idxAsStr, record, pageSnapshotIndexes); incrementStat(fullPageId.groupId(), record, pageSnapshotCacheGrp); incrementStat(PageIdUtils.partId(pageId), record, pageSnapshotPartId); }
/** {@inheritDoc} */ @Override public void touchPage(long pageId) throws IgniteCheckedException { int pageIdx = PageIdUtils.pageIndex(pageId); long latestTs = compactTimestamp(U.currentTimeMillis()); assert latestTs >= 0 && latestTs < Integer.MAX_VALUE; boolean success; do { int trackingIdx = trackingIdx(pageIdx); int firstTs = GridUnsafe.getIntVolatile(null, trackingArrPtr + trackingIdx * 8); int secondTs = GridUnsafe.getIntVolatile(null, trackingArrPtr + trackingIdx * 8 + 4); if (firstTs <= secondTs) success = GridUnsafe.compareAndSwapInt(null, trackingArrPtr + trackingIdx * 8, firstTs, (int)latestTs); else { success = GridUnsafe.compareAndSwapInt( null, trackingArrPtr + trackingIdx * 8 + 4, secondTs, (int)latestTs); } } while (!success); }
/** * Reused page must obtain correctly assembled page id, then initialized by proper {@link PageIO} instance and * non-zero {@code itemId} of reused page id must be saved into special place. * * @param reusedPageId Reused page id. * @param reusedPage Reused page. * @param reusedPageAddr Reused page address. * @param partId Partition id. * @param flag Flag. * @param initIo Initial io. * @return Prepared page id. * @throws IgniteCheckedException In case of failure. */ protected final long initReusedPage(long reusedPageId, long reusedPage, long reusedPageAddr, int partId, byte flag, PageIO initIo) throws IgniteCheckedException { long newPageId = PageIdUtils.pageId(partId, flag, PageIdUtils.pageIndex(reusedPageId)); initIo.initNewPage(reusedPageAddr, newPageId, pageSize()); boolean needWalDeltaRecord = needWalDeltaRecord(reusedPageId, reusedPage, null); if (needWalDeltaRecord) { wal.log(new InitNewPageRecord(grpId, reusedPageId, initIo.getType(), initIo.getVersion(), newPageId)); } int itemId = PageIdUtils.itemId(reusedPageId); if (itemId != 0) { PageIO.setRotatedIdPart(reusedPageAddr, itemId); if (needWalDeltaRecord) wal.log(new RotatedIdPartRecord(grpId, newPageId, itemId)); } return newPageId; }