/** * @param plc data region Configuration. * @param pageMem Page memory. */ protected PageEvictionTracker createPageEvictionTracker(DataRegionConfiguration plc, PageMemory pageMem) { if (plc.getPageEvictionMode() == DataPageEvictionMode.DISABLED || plc.isPersistenceEnabled()) return new NoOpPageEvictionTracker(); assert pageMem instanceof PageMemoryNoStoreImpl : pageMem.getClass(); PageMemoryNoStoreImpl pageMem0 = (PageMemoryNoStoreImpl)pageMem; if (Boolean.getBoolean("override.fair.fifo.page.eviction.tracker")) return new FairFifoPageEvictionTracker(pageMem0, plc, cctx); switch (plc.getPageEvictionMode()) { case RANDOM_LRU: return new RandomLruPageEvictionTracker(pageMem0, plc, cctx); case RANDOM_2_LRU: return new Random2LruPageEvictionTracker(pageMem0, plc, cctx); default: return new NoOpPageEvictionTracker(); } }
/** {@inheritDoc} */ @Override public synchronized void evictDataPage() throws IgniteCheckedException { evictDataPage(pageUsageList.pollFirst()); }
/** {@inheritDoc} */ @Override public void touchPage(long pageId) throws IgniteCheckedException { int pageIdx = PageIdUtils.pageIndex(pageId); long res = compactTimestamp(U.currentTimeMillis()); assert res >= 0 && res < Integer.MAX_VALUE; GridUnsafe.putIntVolatile(null, trackingArrPtr + trackingIdx(pageIdx) * 4, (int)res); }
if (evictDataPage(pageIdx(lruTrackingIdx))) return;
if (evictDataPage(pageIdx(lruTrackingIdx))) return;
/** {@inheritDoc} */ @Override public void touchPage(long pageId) throws IgniteCheckedException { int pageIdx = PageIdUtils.pageIndex(pageId); long latestTs = compactTimestamp(U.currentTimeMillis()); assert latestTs >= 0 && latestTs < Integer.MAX_VALUE; boolean success; do { int trackingIdx = trackingIdx(pageIdx); int firstTs = GridUnsafe.getIntVolatile(null, trackingArrPtr + trackingIdx * 8); int secondTs = GridUnsafe.getIntVolatile(null, trackingArrPtr + trackingIdx * 8 + 4); if (firstTs <= secondTs) success = GridUnsafe.compareAndSwapInt(null, trackingArrPtr + trackingIdx * 8, firstTs, (int)latestTs); else { success = GridUnsafe.compareAndSwapInt( null, trackingArrPtr + trackingIdx * 8 + 4, secondTs, (int)latestTs); } } while (!success); }
/** * @param pageSize Page size. * @return Free list. * @throws Exception If failed. */ protected FreeList createFreeList(int pageSize) throws Exception { DataRegionConfiguration plcCfg = new DataRegionConfiguration() .setInitialSize(1024 * MB) .setMaxSize(1024 * MB); pageMem = createPageMemory(pageSize, plcCfg); long metaPageId = pageMem.allocatePage(1, 1, PageIdAllocator.FLAG_DATA); DataRegionMetricsImpl regionMetrics = new DataRegionMetricsImpl(plcCfg); DataRegion dataRegion = new DataRegion(pageMem, plcCfg, regionMetrics, new NoOpPageEvictionTracker()); return new CacheFreeListImpl(1, "freelist", regionMetrics, dataRegion, null, null, metaPageId, true); }
/** {@inheritDoc} */ @Override protected boolean checkTouch(long pageId) { int trackingIdx = trackingIdx(PageIdUtils.pageIndex(pageId)); int firstTs = GridUnsafe.getIntVolatile(null, trackingArrPtr + trackingIdx * 8); return firstTs != 0; }
/** {@inheritDoc} */ @Override protected boolean checkTouch(long pageId) { int trackingIdx = trackingIdx(PageIdUtils.pageIndex(pageId)); int ts = GridUnsafe.getIntVolatile(null, trackingArrPtr + trackingIdx * 4); return ts != 0; }
/** * */ private void startDataRegions() { for (DataRegion region : dataRegionMap.values()) { region.pageMemory().start(); region.evictionTracker().start(); } }
/** * @param row Row. * @param key Key. * @throws IgniteCheckedException If failed. */ private void afterRowFound(@Nullable CacheDataRow row, KeyCacheObject key) throws IgniteCheckedException { if (row != null) { row.key(key); grp.dataRegion().evictionTracker().touchPage(row.link()); } }
/** * @param shutdown {@code True} to force memory regions shutdown. */ private void onDeActivate(boolean shutdown) { for (DatabaseLifecycleListener lsnr : getDatabaseListeners(cctx.kernalContext())) lsnr.beforeStop(this); for (DataRegion region : dataRegionMap.values()) { region.pageMemory().stop(shutdown); region.evictionTracker().stop(); unregisterMetricsMBean( cctx.gridConfig(), MBEAN_GROUP_NAME, region.memoryMetrics().getName() ); } dataRegionMap.clear(); if (shutdown && memProviderMap != null) memProviderMap.clear(); dataRegionsInitialized = false; dataRegionsStarted = false; }
/** * See {@link GridCacheMapEntry#ensureFreeSpace()} * * @param memPlc data region. */ public void ensureFreeSpace(DataRegion memPlc) throws IgniteCheckedException { if (memPlc == null) return; DataRegionConfiguration plcCfg = memPlc.config(); if (plcCfg.getPageEvictionMode() == DataPageEvictionMode.DISABLED || plcCfg.isPersistenceEnabled()) return; long memorySize = plcCfg.getMaxSize(); PageMemory pageMem = memPlc.pageMemory(); int sysPageSize = pageMem.systemPageSize(); CacheFreeListImpl freeListImpl = freeListMap.get(plcCfg.getName()); for (;;) { long allocatedPagesCnt = pageMem.loadedPages(); int emptyDataPagesCnt = freeListImpl.emptyDataPages(); boolean shouldEvict = allocatedPagesCnt > (memorySize / sysPageSize * plcCfg.getEvictionThreshold()) && emptyDataPagesCnt < plcCfg.getEmptyPagesPoolSize(); if (shouldEvict) { warnFirstEvict(plcCfg); memPlc.evictionTracker().evictDataPage(); memPlc.memoryMetrics().updateEvictionRate(); } else break; } }
if (!checkTouch(realPageId)) return false; // Can't evict: another thread concurrently invoked forgetPage()
/** * @param plc data region Configuration. * @param pageMem Page memory. */ protected PageEvictionTracker createPageEvictionTracker(DataRegionConfiguration plc, PageMemory pageMem) { if (plc.getPageEvictionMode() == DataPageEvictionMode.DISABLED || plc.isPersistenceEnabled()) return new NoOpPageEvictionTracker(); assert pageMem instanceof PageMemoryNoStoreImpl : pageMem.getClass(); PageMemoryNoStoreImpl pageMem0 = (PageMemoryNoStoreImpl)pageMem; if (Boolean.getBoolean("override.fair.fifo.page.eviction.tracker")) return new FairFifoPageEvictionTracker(pageMem0, plc, cctx); switch (plc.getPageEvictionMode()) { case RANDOM_LRU: return new RandomLruPageEvictionTracker(pageMem0, plc, cctx); case RANDOM_2_LRU: return new Random2LruPageEvictionTracker(pageMem0, plc, cctx); default: return new NoOpPageEvictionTracker(); } }
/** {@inheritDoc} */ @Override public void forgetPage(long pageId) { int pageIdx = PageIdUtils.pageIndex(pageId); int trackingIdx = trackingIdx(pageIdx); GridUnsafe.putLongVolatile(null, trackingArrPtr + trackingIdx * 8, 0L); } }
/** {@inheritDoc} */ @Override public void forgetPage(long pageId) { int pageIdx = PageIdUtils.pageIndex(pageId); GridUnsafe.putIntVolatile(null, trackingArrPtr + trackingIdx(pageIdx) * 4, 0); } }
/** {@inheritDoc} */ @Override public synchronized void evictDataPage() throws IgniteCheckedException { evictDataPage(pageUsageList.pollFirst()); }
/** {@inheritDoc} */ @Override protected boolean checkTouch(long pageId) { int trackingIdx = trackingIdx(PageIdUtils.pageIndex(pageId)); int firstTs = GridUnsafe.getIntVolatile(null, trackingArrPtr + trackingIdx * 8); return firstTs != 0; }
/** {@inheritDoc} */ @Override protected boolean checkTouch(long pageId) { int trackingIdx = trackingIdx(PageIdUtils.pageIndex(pageId)); int ts = GridUnsafe.getIntVolatile(null, trackingArrPtr + trackingIdx * 4); return ts != 0; }