package com.sleepycat.je.dbi; import java.util.HashMap; import java.util.Map; import com.sleepycat.je.DatabaseException; import com.sleepycat.je.PreloadConfig; import com.sleepycat.je.tree.ChildReference; import com.sleepycat.je.tree.IN; import com.sleepycat.je.tree.Node; import com.sleepycat.je.tree.WithRootLatched; import de.ovgu.cide.jakutil.*; class PreloadLSNTreeWalker extends SortedLSNTreeWalker { private Map lsnINMap=new HashMap(); private static class INEntry { INEntry( IN in, int index){ this.in=in; this.index=index; } IN in; int index; } PreloadLSNTreeWalker( DatabaseImpl db, TreeNodeProcessor callback, PreloadConfig conf) throws DatabaseException { super(db,false,false,db.tree.getRootLsn(),callback); accumulateLNs=conf.getLoadLNs(); } private final class PreloadWithRootLatched implements WithRootLatched { public IN doWork( ChildReference root) throws DatabaseException { walkInternal(); return null; } } public void walk() throws DatabaseException { WithRootLatched preloadWRL=new PreloadWithRootLatched(); dbImpl.getTree().withRootLatchedExclusive(preloadWRL); } protected IN getRootIN( long rootLsn) throws DatabaseException { return dbImpl.getTree().getRootIN(false); } protected void addToLsnINMap( Long lsn, IN in, int index){ assert in.getDatabase() != null; lsnINMap.put(lsn,new INEntry(in,index)); } protected Node fetchLSN( long lsn) throws DatabaseException { try { INEntry inEntry=(INEntry)lsnINMap.remove(new Long(lsn)); assert (inEntry != null); IN in=inEntry.in; this.hook352(lsn,inEntry,in); throw ReturnHack.returnObject; } catch ( ReturnObject r) { return (Node)r.value; } } protected void hook352( long lsn, INEntry inEntry, IN in) throws DatabaseException { int index=inEntry.index; if (in.isEntryKnownDeleted(index) || in.getLsn(index) != lsn) { throw new ReturnObject(null); } throw new ReturnObject(in.fetchTarget(index)); } }