public void cleanPage(CachedPage cPage, boolean force) { if (cPage.dirty.get() && !cPage.confiscated.get()) { boolean proceed = false; if (force) { cPage.latch.writeLock().lock(); proceed = true; } else { proceed = cPage.latch.readLock().tryLock(); } if (proceed) { try { cleanPageLocked(cPage); } finally { if (force) { cPage.latch.writeLock().unlock(); } else { cPage.latch.readLock().unlock(); } } } else if (shutdownStart) { throw new IllegalStateException( "Cache closed, but unable to acquire read lock on dirty page: " + cPage.dpid); } } }
@Override public void run() { synchronized (threadLock) { try { while (!shutdownStart) { runCleanCycle(); } } catch (InterruptedException e) { Thread.currentThread().interrupt(); } finally { shutdownComplete = true; threadLock.notifyAll(); } } }
public BufferCache(IIOManager ioManager, IPageReplacementStrategy pageReplacementStrategy, IPageCleanerPolicy pageCleanerPolicy, IFileMapManager fileMapManager, int maxOpenFiles, ThreadFactory threadFactory) { this.ioManager = ioManager; this.pageSize = pageReplacementStrategy.getPageSize(); this.maxOpenFiles = maxOpenFiles; pageReplacementStrategy.setBufferCache(this); pageMap = new CacheBucket[pageReplacementStrategy.getMaxAllowedNumPages() * MAP_FACTOR + 1]; for (int i = 0; i < pageMap.length; ++i) { pageMap[i] = new CacheBucket(); } this.pageReplacementStrategy = pageReplacementStrategy; this.pageCleanerPolicy = pageCleanerPolicy; this.fileMapManager = fileMapManager; Executor executor = Executors.newCachedThreadPool(threadFactory); fileInfoMap = new HashMap<>(); cleanerThread = new CleanerThread(); executor.execute(cleanerThread); closed = false; fifoWriter = new AsyncFIFOPageQueueManager(this); if (DEBUG) { confiscatedPages = new ArrayList<>(); confiscatedPagesOwner = new HashMap<>(); confiscateLock = new ReentrantLock(); pinnedPageOwner = new ConcurrentHashMap<>(); } }
private void runCleanCycle() throws InterruptedException { pageCleanerPolicy.notifyCleanCycleStart(threadLock); int curPage = 0; while (true) { synchronized (cachedPages) { if (curPage >= cachedPages.size()) { break; } CachedPage cPage = (CachedPage) cachedPages.get(curPage); if (cPage != null) { cleanPage(cPage, false); } } curPage++; } if (!shutdownStart) { pageCleanerPolicy.notifyCleanCycleFinish(threadLock); } } }
@Override public void flush(ICachedPage page) throws HyracksDataException { // Assumes the caller has pinned the page. cleanerThread.cleanPage((CachedPage) page, true); }