/** {@inheritDoc} */ @Override public long writeLock(int cacheId, long pageId, long page) { if (rwLock.writeLock(page + LOCK_OFFSET, PageIdUtils.tag(pageId))) return page + PAGE_OVERHEAD; return 0L; }
/** {@inheritDoc} */ @Override public long tryWriteLock(int cacheId, long pageId, long page) { if (rwLock.tryWriteLock(page + LOCK_OFFSET, PageIdUtils.tag(pageId))) return page + PAGE_OVERHEAD; return 0L; }
/** {@inheritDoc} */ @Override public long readLock(int cacheId, long pageId, long page) { if (rwLock.readLock(page + LOCK_OFFSET, PageIdUtils.tag(pageId))) return page + PAGE_OVERHEAD; return 0L; }
/** {@inheritDoc} */ @Override public void writeUnlock( int cacheId, long pageId, long page, Boolean walPlc, boolean dirtyFlag ) { long actualId = PageIO.getPageId(page + PAGE_OVERHEAD); rwLock.writeUnlock(page + LOCK_OFFSET, PageIdUtils.tag(actualId)); }
/** {@inheritDoc} */ @Override public long readLock(long absPtr, long pageId, boolean force, boolean touch) { int tag = force ? -1 : PageIdUtils.tag(pageId); boolean locked = rwLock.readLock(absPtr + PAGE_LOCK_OFFSET, tag); if (!locked) return 0; if (touch) PageHeader.writeTimestamp(absPtr, U.currentTimeMillis()); assert PageIO.getCrc(absPtr + PAGE_OVERHEAD) == 0; //TODO GG-11480 return absPtr + PAGE_OVERHEAD; }
/** * @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); }
/** * @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; }
/** * @param pageId Page ID. * @return Relative pointer of the allocated page. * @throws GridOffHeapOutOfMemoryException If failed to allocate new free page. */ private long allocateFreePage(long pageId) throws GridOffHeapOutOfMemoryException { long limit = region.address() + region.size(); while (true) { long lastIdx = GridUnsafe.getLong(lastAllocatedIdxPtr); // Check if we have enough space to allocate a page. if (pagesBase + (lastIdx + 1) * sysPageSize > limit) return INVALID_REL_PTR; if (GridUnsafe.compareAndSwapLong(null, lastAllocatedIdxPtr, lastIdx, lastIdx + 1)) { long absPtr = pagesBase + lastIdx * sysPageSize; assert (lastIdx & SEGMENT_INDEX_MASK) == 0L; long relative = relative(lastIdx); assert relative != INVALID_REL_PTR; PageHeader.initNew(absPtr, relative); rwLock.init(absPtr + PAGE_LOCK_OFFSET, PageIdUtils.tag(pageId)); return relative; } } }
/** {@inheritDoc} */ @Override public void insertDataRow(T row, IoStatisticsHolder statHolder) throws IgniteCheckedException { int rowSize = row.size(); int written = 0; do { if (written != 0) memMetrics.incrementLargeEntriesPages(); int remaining = rowSize - written; long pageId = 0L; for (int b = remaining < MIN_SIZE_FOR_DATA_PAGE ? bucket(remaining, false) + 1 : REUSE_BUCKET; b < BUCKETS; b++) { pageId = takeEmptyPage(b, ioVersions(), statHolder); if (pageId != 0L) break; } AbstractDataPageIO<T> initIo = null; if (pageId == 0L) { pageId = allocateDataPage(row.partition()); initIo = ioVersions().latest(); } else if (PageIdUtils.tag(pageId) != PageIdAllocator.FLAG_DATA) pageId = initReusedPage(pageId, row.partition(), statHolder); else pageId = PageIdUtils.changePartitionId(pageId, (row.partition())); written = write(pageId, writeRow, initIo, row, written, FAIL_I, statHolder); assert written != FAIL_I; // We can't fail here. } while (written != COMPLETE); }
rwLock.writeUnlock(page + PAGE_LOCK_OFFSET, PageIdUtils.tag(pageId));
rwLock.init(absPtr + PAGE_LOCK_OFFSET, PageIdUtils.tag(pageId));
/** {@inheritDoc} */ @Override public long writeLock(int cacheId, long pageId, long page) { if (rwLock.writeLock(page + LOCK_OFFSET, PageIdUtils.tag(pageId))) return page + PAGE_OVERHEAD; return 0L; }
/** {@inheritDoc} */ @Override public long tryWriteLock(int cacheId, long pageId, long page) { if (rwLock.tryWriteLock(page + LOCK_OFFSET, PageIdUtils.tag(pageId))) return page + PAGE_OVERHEAD; return 0L; }
/** {@inheritDoc} */ @Override public long readLock(int cacheId, long pageId, long page) { if (rwLock.readLock(page + LOCK_OFFSET, PageIdUtils.tag(pageId))) return page + PAGE_OVERHEAD; return 0L; }
/** {@inheritDoc} */ @Override public void writeUnlock( int cacheId, long pageId, long page, Boolean walPlc, boolean dirtyFlag ) { long actualId = PageIO.getPageId(page + PAGE_OVERHEAD); rwLock.writeUnlock(page + LOCK_OFFSET, PageIdUtils.tag(actualId)); }
/** * @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); }
/** * @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; }
/** * @param absPtr Absolute pointer to read lock. * @param fullId Full page ID. * @param force Force flag. * @param touch Update page timestamp. * @return Pointer to the page read buffer. */ private long readLockPage(long absPtr, FullPageId fullId, boolean force, boolean touch) { int tag = force ? -1 : PageIdUtils.tag(fullId.pageId()); boolean locked = rwLock.readLock(absPtr + PAGE_LOCK_OFFSET, tag); if (!locked) return 0; if (touch) PageHeader.writeTimestamp(absPtr, U.currentTimeMillis()); assert GridUnsafe.getInt(absPtr + PAGE_OVERHEAD + 4) == 0; //TODO GG-11480 return absPtr + PAGE_OVERHEAD; }
/** * @param pageId Page ID. * @return Relative pointer of the allocated page. * @throws GridOffHeapOutOfMemoryException If failed to allocate new free page. */ private long allocateFreePage(long pageId) throws GridOffHeapOutOfMemoryException { long limit = region.address() + region.size(); while (true) { long lastIdx = GridUnsafe.getLong(lastAllocatedIdxPtr); // Check if we have enough space to allocate a page. if (pagesBase + (lastIdx + 1) * sysPageSize > limit) return INVALID_REL_PTR; if (GridUnsafe.compareAndSwapLong(null, lastAllocatedIdxPtr, lastIdx, lastIdx + 1)) { long absPtr = pagesBase + lastIdx * sysPageSize; assert (lastIdx & SEGMENT_INDEX_MASK) == 0L; long relative = relative(lastIdx); assert relative != INVALID_REL_PTR; PageHeader.initNew(absPtr, relative); rwLock.init(absPtr + PAGE_LOCK_OFFSET, PageIdUtils.tag(pageId)); return relative; } } }