/** {@inheritDoc} */ @Override public boolean updateDataRow(long link, T row, IoStatisticsHolder statHolder) throws IgniteCheckedException { assert link != 0; long pageId = PageIdUtils.pageId(link); int itemId = PageIdUtils.itemId(link); Boolean updated = write(pageId, updateRow, row, itemId, null, statHolder); assert updated != null; // Can't fail here. return updated; }
/** * @param pageId Page ID. * @param grpId Cache group ID. */ public FullPageId(long pageId, int grpId) { this.pageId = pageId; this.grpId = grpId; effectivePageId = PageIdUtils.effectivePageId(pageId); }
assert seg.writeLock().isHeldByCurrentThread(); int tag = seg.partGeneration(grpId, PageIdUtils.partId(pageId)); long relPtr = seg.loadedPages.refresh(grpId, PageIdUtils.effectivePageId(pageId), tag); seg.loadedPages.remove(grpId, PageIdUtils.effectivePageId(pageId));
/** * @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 long partitionMetaPageId(int grpId, int partId) throws IgniteCheckedException { return PageIdUtils.pageId(partId, PageIdAllocator.FLAG_DATA, 0); }
/** * 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; }
FullPageId fullId = new FullPageId(pageId, grpId); int partId = PageIdUtils.partId(pageId); long relPtr = seg.loadedPages.get( grpId, PageIdUtils.effectivePageId(pageId), seg.partGeneration(grpId, partId), INVALID_REL_PTR, PageIdUtils.effectivePageId(pageId), seg.partGeneration(grpId, partId), INVALID_REL_PTR, PageIdUtils.effectivePageId(pageId), relPtr, seg.partGeneration(grpId, partId) rwLock.init(absPtr + PAGE_LOCK_OFFSET, PageIdUtils.tag(pageId)); assert PageIdUtils.pageIndex(pageId) == 0 : fullId; ", absPtr=" + U.hexLong(absPtr) + ']'; rwLock.init(absPtr + PAGE_LOCK_OFFSET, PageIdUtils.tag(pageId)); actualPageId == 0 ? OffheapReadWriteLock.TAG_LOCK_ALWAYS : PageIdUtils.tag(actualPageId));
/** * Extracts partition information from full page ID * * @param fullId page related to some cache * @return pair of cache ID and partition ID */ @NotNull public static GroupPartitionId createCachePartId(@NotNull final FullPageId fullId) { return new GroupPartitionId(fullId.groupId(), PageIdUtils.partId(fullId.pageId())); }
if (PageIdUtils.flag(pageId) == FLAG_DATA) { int rotatedIdPart = PageIO.getRotatedIdPart(pageAddr); recycled = PageIdUtils.link(pageId, rotatedIdPart > MAX_ITEMID_NUM ? 1 : rotatedIdPart); recycled = PageIdUtils.rotatePageId(pageId); assert PageIdUtils.itemId(recycled) > 0 && PageIdUtils.itemId(recycled) <= MAX_ITEMID_NUM : U.hexLong(recycled);
/** * @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; } } }
if (PageIdUtils.tag(pageId) == FLAG_DATA) { int rotatedIdPart = PageIO.getRotatedIdPart(pageAddr); recycled = PageIdUtils.link(pageId, rotatedIdPart > MAX_ITEMID_NUM ? 1 : rotatedIdPart); recycled = PageIdUtils.rotatePageId(pageId); assert PageIdUtils.itemId(recycled) > 0 && PageIdUtils.itemId(recycled) <= MAX_ITEMID_NUM : U.hexLong(recycled);
/** * @param seqNo Page sequence number. * @return Page index */ public int pageIndex(int seqNo) { return PageIdUtils.pageIndex(fromSegmentIndex(idx, seqNo - pagesInPrevSegments)); } }
assert PageIdUtils.pageIndex(pageId) > 0; //it's crucial for tracking pages (zero page is super one) long relPtr = seg.loadedPages.get( grpId, PageIdUtils.effectivePageId(pageId), seg.partGeneration(grpId, partId), INVALID_REL_PTR, rwLock.init(absPtr + PAGE_LOCK_OFFSET, PageIdUtils.tag(pageId)); seg.loadedPages.put(grpId, PageIdUtils.effectivePageId(pageId), relPtr, seg.partGeneration(grpId, partId));
/** * @param pageId Page ID. * @param statHolder Statistics holder to track IO operations. * @return Page absolute pointer. * @throws IgniteCheckedException If failed. */ protected final long acquirePage(long pageId, IoStatisticsHolder statHolder) throws IgniteCheckedException { assert PageIdUtils.flag(pageId) == FLAG_IDX && PageIdUtils.partId(pageId) == INDEX_PARTITION || PageIdUtils.flag(pageId) == FLAG_DATA && PageIdUtils.partId(pageId) <= MAX_PARTITION_ID : U.hexLong(pageId) + " flag=" + PageIdUtils.flag(pageId) + " part=" + PageIdUtils.partId(pageId); return pageMem.acquirePage(grpId, pageId, statHolder); }
/** * @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); }
/** * @throws Exception If failed. */ @Test public void testOffsetExtraction() throws Exception { assertEquals(0, PageIdUtils.itemId(0x00FFFFFFFFFFFFFFL)); assertEquals(1, PageIdUtils.itemId(0x01FFFFFFFFFFFFFFL)); assertEquals(0, PageIdUtils.itemId(0x0000000000000000L)); assertEquals(1, PageIdUtils.itemId(0x0100000000000000L)); assertEquals(0xFA, PageIdUtils.itemId(0xFA00000000000000L)); assertEquals(0xFA, PageIdUtils.itemId(0xFAFFFFFFFFFFFFFFL)); assertEquals(0xF, PageIdUtils.itemId(0x0F00000000000000L)); assertEquals(0xF, PageIdUtils.itemId(0x0FFFFFFFFFFFFFFFL)); assertEquals(0xF0, PageIdUtils.itemId(0xF000000000000000L)); assertEquals(0xF0, PageIdUtils.itemId(0xF0FFFFFFFFFFFFFFL)); }