private boolean atEOF() throws IOException { if (chunk.offset < chunk.length) { return false; } if (page.getType() == Page.PAGE_END_TYPE) { return true; } fill(); return chunk.offset >= chunk.length; }
@Override public String toString() { return "[PageWrite:" + page.getPageId() + "-" + page.getType() + "]"; }
synchronized public void load(Transaction tx) throws IOException { if (loaded.compareAndSet(false, true)) { LOG.debug("loading"); if( keyMarshaller == null ) { throw new IllegalArgumentException("The key marshaller must be set before loading the BTreeIndex"); } if( valueMarshaller == null ) { throw new IllegalArgumentException("The value marshaller must be set before loading the BTreeIndex"); } final Page<BTreeNode<Key,Value>> p = tx.load(pageId, null); if( p.getType() == Page.PAGE_FREE_TYPE ) { // Need to initialize it.. BTreeNode<Key, Value> root = createNode(p, null); storeNode(tx, root, true); } } }
synchronized void load(Transaction tx) throws IOException { if (loaded.compareAndSet(false, true)) { page = tx.load(pageId, null); if (page.getType() == Page.PAGE_FREE_TYPE) { page.set(null); tx.store(page, messageStoreStatisticsMarshaller, true); } } page = tx.load(pageId, messageStoreStatisticsMarshaller); }
private void findNextPage() { if (!pageFile.isLoaded()) { throw new IllegalStateException("Cannot iterate the pages when the page file is not loaded"); } if (nextPage != null) { return; } try { while (nextId < pageFile.getPageCount()) { Page page = load(nextId, null); if (includeFreePages || page.getType() != Page.PAGE_FREE_TYPE) { nextPage = page; return; } else { nextId++; } } } catch (IOException e) { } }
private Page readPage(Page page) throws IOException { // Read the page data pageFile.readPage(page.getPageId(), chunk.getData()); chunk.setOffset(0); chunk.setLength(pageFile.getPageSize()); DataByteArrayInputStream in = new DataByteArrayInputStream(chunk); page.read(in); chunk.setOffset(Page.PAGE_HEADER_SIZE); if (page.getType() == Page.PAGE_END_TYPE) { chunk.setLength((int)(page.getNext())); } if (page.getType() == Page.PAGE_FREE_TYPE) { throw new EOFException("Chunk stream does not exist, page: " + page.getPageId() + " is marked free"); } return page; }
private void recoverFreePages(final long lastRecoveryPage) throws Exception { LOG.info(toString() + ". Recovering pageFile free list due to prior unclean shutdown.."); SequenceSet newFreePages = new SequenceSet(); // need new pageFile instance to get unshared readFile PageFile recoveryPageFile = new PageFile(directory, name); recoveryPageFile.loadForRecovery(nextFreePageId.get()); try { for (Iterator<Page> i = new Transaction(recoveryPageFile).iterator(true); i.hasNext(); ) { Page page = i.next(); if (page.getPageId() >= lastRecoveryPage) { break; } if (page.getType() == Page.PAGE_FREE_TYPE) { newFreePages.add(page.getPageId()); } } } finally { recoveryPageFile.readFile.close(); } LOG.info(toString() + ". Recovered pageFile free list of size: " + newFreePages.rangeSize()); if (!newFreePages.isEmpty()) { // allow flush (with index lock held) to merge eventually recoveredFreeList.lazySet(newFreePages); } }
@Override public void close() throws IOException { super.close(); // We need to free up the rest of the page chain.. if (current.getType() == Page.PAGE_PART_TYPE) { free(current.getNext()); } current.makePageEnd(pos, getWriteTransactionId()); // make visible as end page pageFile.addToCache(current); // Write the header.. pos = 0; current.write(this); Transaction.this.write(current, buf); } };
final Page<Metadata> metadataPage = tx.load(pageId, metadataMarshaller); if (metadataPage.getType() == Page.PAGE_FREE_TYPE) {
if( p.getType() == Page.PAGE_FREE_TYPE ) {
if (current.getType() == Page.PAGE_PART_TYPE) { next = load(current.getNext(), null); } else {
private boolean atEOF() throws IOException { if (chunk.offset < chunk.length) { return false; } if (page.getType() == Page.PAGE_END_TYPE) { return true; } fill(); return chunk.offset >= chunk.length; }
private boolean atEOF() throws IOException { if (chunk.offset < chunk.length) { return false; } if (page.getType() == Page.PAGE_END_TYPE) { return true; } fill(); return chunk.offset >= chunk.length; }
@Override public String toString() { return "[PageWrite:" + page.getPageId() + "-" + page.getType() + "]"; }
private boolean atEOF() throws IOException { if (chunk.offset < chunk.length) { return false; } if (page.getType() == Page.PAGE_END_TYPE) { return true; } fill(); return chunk.offset >= chunk.length; }
@Override public String toString() { return "[PageWrite:" + page.getPageId() + "-" + page.getType() + "]"; }
@Override public String toString() { return "[PageWrite:" + page.getPageId() + "-" + page.getType() + "]"; }
private Page readPage(Page page) throws IOException { // Read the page data pageFile.readPage(page.getPageId(), chunk.getData()); chunk.setOffset(0); chunk.setLength(pageFile.getPageSize()); DataByteArrayInputStream in = new DataByteArrayInputStream(chunk); page.read(in); chunk.setOffset(Page.PAGE_HEADER_SIZE); if (page.getType() == Page.PAGE_END_TYPE) { chunk.setLength((int)(page.getNext())); } if (page.getType() == Page.PAGE_FREE_TYPE) { throw new EOFException("Chunk stream does not exist, page: " + page.getPageId() + " is marked free"); } return page; }
@Override public void close() throws IOException { super.close(); // We need to free up the rest of the page chain.. if (current.getType() == Page.PAGE_PART_TYPE) { free(current.getNext()); } current.makePageEnd(pos, getWriteTransactionId()); // make visible as end page pageFile.addToCache(current); // Write the header.. pos = 0; current.write(this); Transaction.this.write(current, buf); } };