package com.sleepycat.je.dbi; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import com.sleepycat.je.DatabaseException; import com.sleepycat.je.tree.IN; import de.ovgu.cide.jakutil.*; /** * The INList is a list of in-memory INs for a given environment. */ public class INList { private static final String DEBUG_NAME=INList.class.getName(); private SortedSet ins=null; private EnvironmentImpl envImpl; INList( EnvironmentImpl envImpl){ this.envImpl=envImpl; ins=new TreeSet(); this.hook338(envImpl); } /** * Used only by tree verifier when validating INList. Must be called with * orig.majorLatch acquired. */ public INList( INList orig, EnvironmentImpl envImpl) throws DatabaseException { ins=new TreeSet(orig.getINs()); this.hook340(); this.envImpl=envImpl; this.hook339(envImpl); } public SortedSet getINs(){ return ins; } public int getSize(){ return ins.size(); } /** * An IN has just come into memory, add it to the list. */ public void add( IN in) throws DatabaseException { new INList_add(this,in).execute(); } private void addAndSetMemory( Set set, IN in){ new INList_addAndSetMemory(this,set,in).execute(); } /** * An IN is getting evicted or is displaced by recovery. Caller is * responsible for acquiring the major latch before calling this and * releasing it when they're done. */ public void removeLatchAlreadyHeld( IN in) throws DatabaseException { boolean removeDone=ins.remove(in); removeDone=this.hook341(in,removeDone); assert removeDone; this.hook346(in); } /** * An IN is getting swept or is displaced by recovery. */ public void remove( IN in) throws DatabaseException { removeLatchAlreadyHeld(in); } public SortedSet tailSet( IN in) throws DatabaseException { return ins.tailSet(in); } public IN first() throws DatabaseException { return (IN)ins.first(); } /** * Return an iterator over the main 'ins' set. Returned iterator will not * show the elements in addedINs. * The major latch should be held before entering. The caller is * responsible for releasing the major latch when they're finished with the * iterator. * @return an iterator over the main 'ins' set. */ public Iterator iterator(){ return ins.iterator(); } /** * Clear the entire list during recovery and at shutdown. */ public void clear() throws DatabaseException { ins.clear(); this.hook342(); } public void dump(){ System.out.println("size=" + getSize()); Iterator iter=ins.iterator(); while (iter.hasNext()) { IN theIN=(IN)iter.next(); System.out.println("db=" + theIN.getDatabase().getId() + " nid=: "+ theIN.getNodeId()+ "/"+ theIN.getLevel()); } } @MethodObject static class INList_add { INList_add( INList _this, IN in){ this._this=_this; this.in=in; } void execute() throws DatabaseException { this.hook344(); addToMajor=true; this.hook343(); } protected INList _this; protected IN in; protected boolean enteredWithLatchHeld; protected boolean addToMajor; protected void hook343() throws DatabaseException { this.hook345(); } protected void hook344() throws DatabaseException { } protected void hook345() throws DatabaseException { _this.addAndSetMemory(_this.ins,in); } } @MethodObject static class INList_addAndSetMemory { INList_addAndSetMemory( INList _this, Set set, IN in){ this._this=_this; this.set=set; this.in=in; } void execute(){ addOk=set.add(in); assert addOk : "failed adding in " + in.getNodeId(); } protected INList _this; protected Set set; protected IN in; protected boolean addOk; protected MemoryBudget mb; } protected void hook338( EnvironmentImpl envImpl){ } protected void hook339( EnvironmentImpl envImpl) throws DatabaseException { } protected void hook340() throws DatabaseException { } protected boolean hook341( IN in, boolean removeDone) throws DatabaseException { return removeDone; } protected void hook342() throws DatabaseException { } protected void hook346( IN in) throws DatabaseException { } }