/** {@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; }
/** {@inheritDoc} */ @Override public <S, R> R updateDataRow(long link, PageHandler<S, R> pageHnd, S arg, IoStatisticsHolder statHolder) throws IgniteCheckedException { assert link != 0; long pageId = PageIdUtils.pageId(link); int itemId = PageIdUtils.itemId(link); R updRes = write(pageId, pageHnd, arg, itemId, null, statHolder); assert updRes != null; // Can't fail here. return updRes; }
/** * @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) + ")" ; }
/** * @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)); }
/** {@inheritDoc} */ @Override public void removeDataRowByLink(long link, IoStatisticsHolder statHolder) throws IgniteCheckedException { assert link != 0; long pageId = PageIdUtils.pageId(link); int itemId = PageIdUtils.itemId(link); ReuseBag bag = new LongListReuseBag(); long nextLink = write(pageId, rmvRow, bag, itemId, FAIL_L, statHolder); assert nextLink != FAIL_L; // Can't fail here. while (nextLink != 0L) { memMetrics.decrementLargeEntriesPages(); itemId = PageIdUtils.itemId(nextLink); pageId = PageIdUtils.pageId(nextLink); nextLink = write(pageId, rmvRow, bag, itemId, FAIL_L, statHolder); assert nextLink != FAIL_L; // Can't fail here. } reuseList.addForRecycle(bag); }
DataPagePayload data = io.readPayload(pageAddr, itemId(nextLink), pageMem.pageSize());
DataPageIO io = DataPageIO.VERSIONS.forPage(pageAddr); int itemId = itemId(nextLink);
int itemId = itemId(link); long page = pageMem.acquirePage(grpId, pageId);
/** * 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; }
itemId(link), pageSize());
DataPagePayload payload = io.readPayload(addr, PageIdUtils.itemId(link), pageSize);
/** {@inheritDoc} */ @Override public boolean updateDataRow(long link, T row) throws IgniteCheckedException { assert link != 0; long pageId = PageIdUtils.pageId(link); int itemId = PageIdUtils.itemId(link); Boolean updated = write(pageId, updateRow, row, itemId, null); assert updated != null; // Can't fail here. return updated; }
/** {@inheritDoc} */ @Override public <S, R> R updateDataRow(long link, PageHandler<S, R> pageHnd, S arg) throws IgniteCheckedException { assert link != 0; long pageId = PageIdUtils.pageId(link); int itemId = PageIdUtils.itemId(link); R updRes = write(pageId, pageHnd, arg, itemId, null); assert updRes != null; // Can't fail here. return updRes; }
/** * @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) + ")" ; }
/** {@inheritDoc} */ @Override public void removeDataRowByLink(long link) throws IgniteCheckedException { assert link != 0; long pageId = PageIdUtils.pageId(link); int itemId = PageIdUtils.itemId(link); ReuseBag bag = new LongListReuseBag(); long nextLink = write(pageId, rmvRow, bag, itemId, FAIL_L); assert nextLink != FAIL_L; // Can't fail here. while (nextLink != 0L) { memMetrics.decrementLargeEntriesPages(); itemId = PageIdUtils.itemId(nextLink); pageId = PageIdUtils.pageId(nextLink); nextLink = write(pageId, rmvRow, bag, itemId, FAIL_L); assert nextLink != FAIL_L; // Can't fail here. } reuseList.addForRecycle(bag); }
/** * 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. */ 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; }