/** * @return Full page ID. */ public FullPageId fullPageId() { return new FullPageId(pageId, grpId); }
/** * @param cacheId Cache ID. * @param pageId Page ID. * @param refresh Refresh. * @return Key index. */ private int getKey(int cacheId, long pageId, int tag, boolean refresh) { int step = 1; int index = U.safeAbs(FullPageId.hashCode(cacheId, pageId)) % capacity; do { long res = testKeyAt(index, cacheId, pageId, tag); if (res == EQUAL) return index; else if (res == EMPTY) return -1; else if (res == OUTDATED) return !refresh ? -2 : index; else assert res == REMOVED || res == NOT_EQUAL; index++; if (index >= capacity) index -= capacity; } while (++step <= maxSteps); return -1; }
/** * */ @Test public void testCollisionOnRemove() { Map<FullPageId, Long> ctrl = new LinkedHashMap<>(); int cap = 10; FullPageId baseId = new FullPageId(0, 1); withMap(map -> { for (int i = 0; i < cap; i++) { int grpId = i + 1; int pageId = findPageIdForCollision(grpId, baseId, cap); ctrl.put(new FullPageId(pageId, grpId), (long)grpId); map.put(grpId, pageId, (long)grpId, 1); } for (FullPageId next : ctrl.keySet()) { assertTrue(map.remove(next.groupId(), next.pageId())); } }, cap); }
PageSnapshot snapshot = (PageSnapshot)tuple.getValue(); if (snapshot.fullPageId().equals(fullId)) { if (tmpAddr == null) { assert snapshot.pageData().length <= pageSize() : snapshot.pageData().length; && deltaRecord.pageId() == fullId.pageId() && deltaRecord.groupId() == fullId.groupId()) { assert tmpAddr != null; throw new StorageException(String.format( "Page is broken. Can't restore it from WAL. (grpId = %d, pageId = %X).", fullId.groupId(), fullId.pageId() ));
/** * @param absPtr Absolute pointer. * @return Pointer to the page write buffer or {@code 0} if page was not locked. */ long tryWriteLockPage(long absPtr, FullPageId fullId, boolean checkTag) { int tag = checkTag ? PageIdUtils.tag(fullId.pageId()) : OffheapReadWriteLock.TAG_LOCK_ALWAYS; if (!rwLock.tryWriteLock(absPtr + PAGE_LOCK_OFFSET, tag)) return 0; return postWriteLockPage(absPtr, fullId); }
db.checkpointReadLock(); try { pageIds.add(new FullPageId(pageMem.allocatePage(cacheId, PageIdAllocator.INDEX_PARTITION, PageIdAllocator.FLAG_IDX), cacheId)); if (TrackingPageIO.VERSIONS.latest().trackingPageFor(snap.fullPageId().pageId(), pageMem.pageSize()) == snap.fullPageId().pageId()) { tup = it.next();
? delayedPageReplacementTracker.delayedPageWrite() : null; FullPageId fullId = new FullPageId(pageId, grpId); trackingIO.initNewPage(pageAddr, pageId, realPageSize(grpId)); if (!ctx.wal().disabled(fullId.groupId())) { if (!ctx.wal().isAlwaysWriteFullPages()) ctx.wal().log( else { ctx.wal().log(new PageSnapshot(fullId, absPtr + PAGE_OVERHEAD, pageSize(), realPageSize(fullId.groupId())));
/** {@inheritDoc} */ @Override public int groupId() { return fullPageId.groupId(); } }
/** {@inheritDoc} */ @Override public int hashCode() { return hashCode0(grpId, effectivePageId); }
long pageApsPtr = mem.acquirePage(id.groupId(), id.pageId()); try { long pageAddr = mem.writeLock(id.groupId(), id.pageId(), pageApsPtr); PAGE_IO.initNewPage(pageAddr, id.pageId(), mem.realPageSize(id.groupId())); long updId = PageIdUtils.rotatePageId(id.pageId()); updated.add(new FullPageId(updId, id.groupId())); mem.writeUnlock(id.groupId(), id.pageId(), pageApsPtr, null, true); mem.releasePage(id.groupId(), id.pageId(), pageApsPtr); long pageApsPtr = mem.acquirePage(id.groupId(), id.pageId()); try { long pageAddr = mem.writeLock(id.groupId(), id.pageId(), pageApsPtr); mem.writeUnlock(id.groupId(), id.pageId(), pageApsPtr, null, false); mem.readLock(id.groupId(), id.pageId(), pageApsPtr); mem.readUnlock(id.groupId(), id.pageId(), pageApsPtr); mem.releasePage(id.groupId(), id.pageId(), pageApsPtr); long pageApsPtr = mem.acquirePage(id.groupId(), id.pageId()); try { long pageAddr = mem.writeLock(id.groupId(), id.pageId(), pageApsPtr);
assert fullId.equals(nearest.fullId()) : "Invalid page mapping [tableId=" + nearest.fullId() + ", actual=" + fullId + ", nearest=" + nearest; boolean outdated = partGen < partGeneration(fullId.groupId(), PageIdUtils.partId(fullId.pageId())); return refreshOutdatedPage(this, fullId.groupId(), fullId.pageId(), true); fullPageId.groupId(), PageIdUtils.effectivePageId(fullPageId.pageId()) );
/** * @param absPtr Absolute pointer. * @return Pointer to the page write buffer. */ private long writeLockPage(long absPtr, FullPageId fullId, boolean checkTag) { int tag = checkTag ? PageIdUtils.tag(fullId.pageId()) : OffheapReadWriteLock.TAG_LOCK_ALWAYS; boolean locked = rwLock.writeLock(absPtr + PAGE_LOCK_OFFSET, tag); return locked ? postWriteLockPage(absPtr, fullId) : 0; }
/** * */ void beforeReleaseWrite(FullPageId pageId, long ptr, boolean pageWalRec) throws IgniteCheckedException { boolean walIsNotDisable = walMgr != null && !walMgr.disabled(pageId.groupId()); boolean pageRecOrAlwaysWriteFullPage = walMgr != null && (pageWalRec || walMgr.isAlwaysWriteFullPages()); if (pageRecOrAlwaysWriteFullPage && walIsNotDisable) walMgr.log(new PageSnapshot(pageId, ptr, pageSize(), realPageSize(pageId.groupId()))); }
/** * @param grpId Cache group ID. * @param pageId Page ID. * @return Hash code. */ public static int hashCode(int grpId, long pageId) { long effectiveId = PageIdUtils.effectivePageId(pageId); return U.hash(hashCode0(grpId, effectiveId)); }
/** * @param fullPageId Page ID to clear. * @return {@code True} if remove successfully. */ boolean clearCheckpoint(FullPageId fullPageId) { Segment seg = segment(fullPageId.groupId(), fullPageId.pageId()); Collection<FullPageId> pages0 = seg.segCheckpointPages; assert pages0 != null; return pages0.remove(fullPageId); }
pageIds[i] = new FullPageId(mem.allocatePage(cacheId, 0, PageIdAllocator.FLAG_DATA), cacheId); long page = mem.acquirePage(fullId.groupId(), fullId.pageId()); assertTrue(mem.isDirty(fullId.groupId(), fullId.pageId(), page)); //page is dirty right after allocation long pageAddr = mem.writeLock(fullId.groupId(), fullId.pageId(), page); pageIO.initNewPage(pageAddr, fullId.pageId(), mem.realPageSize(fullId.groupId())); assertTrue(mem.isDirty(fullId.groupId(), fullId.pageId(), page)); mem.writeUnlock(fullId.groupId(), fullId.pageId(),page, null,true); assertTrue(mem.isDirty(fullId.groupId(), fullId.pageId(), page)); mem.releasePage(fullId.groupId(), fullId.pageId(), page); long page = mem.acquirePage(fullId.groupId(), fullId.pageId()); assertTrue(mem.isDirty(fullId.groupId(), fullId.pageId(), page)); long pageAddr = mem.writeLock(fullId.groupId(), fullId.pageId(), page); assertFalse(mem.isDirty(fullId.groupId(), fullId.pageId(), page)); mem.writeUnlock(fullId.groupId(), fullId.pageId(), page, null, true); assertTrue(mem.isDirty(fullId.groupId(), fullId.pageId(), page));
PageSnapshot snapshot = (PageSnapshot)tuple.getValue(); if (snapshot.fullPageId().equals(fullId)) { if (tmpAddr == null) { assert snapshot.pageData().length <= pageSize() : snapshot.pageData().length; && deltaRecord.pageId() == fullId.pageId() && deltaRecord.groupId() == fullId.groupId()) { assert tmpAddr != null; throw new StorageException(String.format( "Page is broken. Can't restore it from WAL. (grpId = %d, pageId = %X).", fullId.groupId(), fullId.pageId() ));