/** {@inheritDoc} */ @Override public long partitionMetaPageId(int grpId, int partId) throws IgniteCheckedException { return PageIdUtils.pageId(partId, PageIdAllocator.FLAG_DATA, 0); }
/** {@inheritDoc} */ @Override public int partition() { return PageIdUtils.partId(pageId(link)); }
/** {@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 pageIdx Page Index, monotonically growing number within each partition * @return page ID (64 bits) constructed from partition ID and given index */ private long createPageId(final int pageIdx) { final int partId = getPartitionId(); return PageIdUtils.pageId(partId, getFlagByPartId(partId), pageIdx); }
/** * 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); } }
/** {@inheritDoc} */ @Override public long allocatePage(int grpId, int partId, byte flags) throws IgniteCheckedException { long root = PageIdUtils.pageId(partId, flags, 0); FullPageId fullId = new FullPageId(root, grpId); AtomicInteger allocator = allocators.get(fullId); if (allocator == null) allocator = F.addIfAbsent(allocators, fullId, new AtomicInteger(1)); return PageIdUtils.pageId(partId, flags, allocator.getAndIncrement()); }
/** * @param io Row IO. * @param pageAddr Page address. * @param idx Item index. * @return {@code True} if row passes the filter. */ private boolean applyFilter(H2RowLinkIO io, long pageAddr, int idx) { assert filter != null; return filter.applyPartition(PageIdUtils.partId(pageId(io.getLink(pageAddr, idx)))); }
/** {@inheritDoc} */ @Override public int write(ByteBuffer srcBuf, long position) throws IOException { FullPageId fId = new FullPageId( PageIdUtils.pageId(partId, PageIdAllocator.FLAG_DATA, (int)(position / PAGE_SIZE) - 1), grpId); if (forbiddenPages.contains(fId)) throw new AssertionError("Attempted to write invalid page on recovery: " + fId); return super.write(srcBuf, position); }
/** * @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 int pages(int grpId, int partId) throws IgniteCheckedException { long root = PageIdUtils.pageId(partId, (byte)0, 0); FullPageId fullId = new FullPageId(root, grpId); AtomicInteger allocator = allocators.get(fullId); if (allocator == null) allocator = F.addIfAbsent(allocators, fullId, new AtomicInteger(2)); return allocator.get(); }
/** {@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); }
/** * @throws Exception If failed. */ @Test public void testPageIdFromLink() throws Exception { assertEquals(0x00FFFFFFFFFFFFFFL, PageIdUtils.pageId(0x00FFFFFFFFFFFFFFL)); assertEquals(0x00FFFFFFFFFFFFFFL, PageIdUtils.pageId(0x10FFFFFFFFFFFFFFL)); assertEquals(0x00FFFFFFFFFFFFFFL, PageIdUtils.pageId(0x01FFFFFFFFFFFFFFL)); assertEquals(0x00FFFFFFFFFFFFFFL, PageIdUtils.pageId(0x11FFFFFFFFFFFFFFL)); assertEquals(0x00FFFFFFFFFFFFFFL, PageIdUtils.pageId(0x80FFFFFFFFFFFFFFL)); assertEquals(0x00FFFFFFFFFFFFFFL, PageIdUtils.pageId(0x88FFFFFFFFFFFFFFL)); assertEquals(0x00FFFFFFFFFFFFFFL, PageIdUtils.pageId(0x08FFFFFFFFFFFFFFL)); assertEquals(0x00FFFFFFFFFFFFFFL, PageIdUtils.pageId(0xFFFFFFFFFFFFFFFFL)); assertEquals(0x0002FFFFFFFFFFFFL, PageIdUtils.pageId(0x0002FFFFFFFFFFFFL)); assertEquals(0x1002FFFFFFFFFFFFL, PageIdUtils.pageId(0x1002FFFFFFFFFFFFL)); assertEquals(0x0102FFFFFFFFFFFFL, PageIdUtils.pageId(0x0102FFFFFFFFFFFFL)); assertEquals(0x1102FFFFFFFFFFFFL, PageIdUtils.pageId(0x1102FFFFFFFFFFFFL)); assertEquals(0x8002FFFFFFFFFFFFL, PageIdUtils.pageId(0x8002FFFFFFFFFFFFL)); assertEquals(0x8802FFFFFFFFFFFFL, PageIdUtils.pageId(0x8802FFFFFFFFFFFFL)); assertEquals(0x0802FFFFFFFFFFFFL, PageIdUtils.pageId(0x0802FFFFFFFFFFFFL)); assertEquals(0xFF02FFFFFFFFFFFFL, PageIdUtils.pageId(0xFF02FFFFFFFFFFFFL)); assertEquals(0L, PageIdUtils.pageId(0x0000000000000000L)); assertEquals(0L, PageIdUtils.pageId(0x1000000000000000L)); assertEquals(0L, PageIdUtils.pageId(0x0100000000000000L)); assertEquals(0L, PageIdUtils.pageId(0x8000000000000000L)); assertEquals(0L, PageIdUtils.pageId(0x0800000000000000L)); assertEquals(0L, PageIdUtils.pageId(0xFF00000000000000L)); }
/** * @param link Link. * @param mvccCrdVer Mvcc coordinator version. * @param mvccCntr Mvcc counter. * @param mvccOpCntr Mvcc operation counter. * @return Row. * @throws IgniteCheckedException If failed. */ public GridH2Row getMvccRow(long link, long mvccCrdVer, long mvccCntr, int mvccOpCntr) throws IgniteCheckedException { int partId = PageIdUtils.partId(PageIdUtils.pageId(link)); MvccDataRow row = new MvccDataRow( cctx.group(), 0, link, partId, null, mvccCrdVer, mvccCntr, mvccOpCntr, true ); return rowDesc.createRow(row); } }
/** {@inheritDoc} */ @Override public long allocatePage(int grpId, int partId, byte flags) throws IgniteCheckedException { assert partId <= PageIdAllocator.MAX_PARTITION_ID || partId == PageIdAllocator.INDEX_PARTITION; PageStore store = getStore(grpId, partId); try { long pageIdx = store.allocatePage(); return PageIdUtils.pageId(partId, flags, (int)pageIdx); } catch (StorageException e) { cctx.kernalContext().failure().process(new FailureContext(FailureType.CRITICAL_ERROR, e)); throw e; } }
/** * @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; }
/** * Update page * * @param link Link. * @throws IgniteCheckedException On error. */ private void touch(long link) throws IgniteCheckedException { PageMemory mem = grpCtx.dataRegion().pageMemory(); int grpId = grpCtx.groupId(); final long pageId = PageIdUtils.pageId(link); final long page = mem.acquirePage(grpId, pageId); try { // Touch page timestamp mem.readLock(grpId, pageId, page); mem.readUnlock(grpId, pageId, page); } finally { mem.releasePage(grpId, pageId, page); } } }
long pageId = pageId(link); int itemId = itemId(link); long page = pageMem.acquirePage(grpId, pageId);
io.setTreeRoot(pageAddr, PageIdUtils.pageId(0, (byte)0, 0));