/** * Flush a specified ledger * * @param ledger Ledger Id * @throws IOException */ private void flushSpecificLedger(long ledger) throws IOException { LinkedList<Long> firstEntryList = pageMapAndList.getFirstEntryListToBeFlushed(ledger); // flush ledger index file header if necessary indexPersistenceManager.flushLedgerHeader(ledger); if (null == firstEntryList || firstEntryList.size() == 0) { LOG.debug("Nothing to flush for ledger {}.", ledger); // nothing to do return; } // Now flush all the pages of a ledger List<LedgerEntryPage> entries = new ArrayList<LedgerEntryPage>(firstEntryList.size()); try { for (Long firstEntry : firstEntryList) { LedgerEntryPage lep = getLedgerEntryPage(ledger, firstEntry, true); if (lep != null) { entries.add(lep); } } indexPersistenceManager.flushLedgerEntries(ledger, entries); } finally { for (LedgerEntryPage lep : entries) { lep.releasePage(); } } }
/** * Grab ledger entry page whose first entry is <code>pageEntry</code>. * * <p>If the page doesn't existed before, we allocate a memory page. Otherwise, we grab a clean * page and read it from disk. * * @param ledger Ledger Id * @param pageEntry Start entry of this entry page. */ private LedgerEntryPage grabLedgerEntryPage(long ledger, long pageEntry) throws IOException { LedgerEntryPage lep = grabCleanPage(ledger, pageEntry); try { // should get the up to date page from the persistence manager // before we put it into table otherwise we would put // an empty page in it indexPersistenceManager.updatePage(lep); LedgerEntryPage oldLep; if (lep != (oldLep = pageMapAndList.putPage(lep))) { lep.releasePage(); // Decrement the page count because we couldn't put this lep in the page cache. pageCount.decrementAndGet(); // Increment the use count of the old lep because this is unexpected oldLep.usePage(); lep = oldLep; } } catch (IOException ie) { // if we grab a clean page, but failed to update the page // we are exhausting the count of ledger entry pages. // since this page will be never used, so we need to decrement // page count of ledger cache. lep.releasePage(); pageCount.decrementAndGet(); throw ie; } return lep; }