package voldemort.store.bdb; import voldemort.utils.ClosableIterator; import com.sleepycat.je.Cursor; import com.sleepycat.je.DatabaseException; abstract class BdbIterator<T> implements ClosableIterator<T> { private volatile boolean isOpen; final Cursor cursor; final BdbStorageEngine bdbEngine; BdbIterator(Cursor cursor, BdbStorageEngine bdbEngine) { this.cursor = cursor; this.bdbEngine = bdbEngine; isOpen = true; } public final void close() { try { if(isOpen) { cursor.close(); isOpen = false; } } catch(DatabaseException e) { bdbEngine.getLogger().error(e); } } public final void remove() { throw new UnsupportedOperationException("No removal"); } @Override protected final void finalize() { if(isOpen) { bdbEngine.getLogger().error("Failure to close cursor, will be forcibly closed."); close(); } } }