com.sleepycat.je.evictor
Class Evictor

java.lang.Object
  extended by com.sleepycat.je.utilint.DaemonThread
      extended by com.sleepycat.je.evictor.Evictor
All Implemented Interfaces:
DaemonRunner, ExceptionListenerUser, Runnable
Direct Known Subclasses:
PrivateEvictor, SharedEvictor

public abstract class Evictor
extends DaemonThread

The Evictor looks through the INList for IN's and BIN's that are worthy of eviction. Once the nodes are selected, it removes all references to them so that they can be GC'd by the JVM.


Nested Class Summary
static class Evictor.EvictionSource
           
(package private) static class Evictor.EvictProfile
           
 
Field Summary
(package private)  Evictor.EvictProfile evictProfile
           
protected  IntStat sharedCacheEnvs
           
 
Fields inherited from class com.sleepycat.je.utilint.DaemonThread
envImpl, logger, name, nWakeupRequests, stifleExceptionChatter
 
Constructor Summary
Evictor(EnvironmentImpl envImpl, long wakeupInterval, String name)
           
 
Method Summary
abstract  void addEnvironment(EnvironmentImpl envImpl)
          Only supported by SharedEvictor.
 void alert()
          Wakeup the evictor only if it's not already active.
abstract  boolean checkEnv(EnvironmentImpl env)
          Only supported by SharedEvictor.
abstract  void clearEnv()
          Standard daemon method to set envImpl to null.
 void doCriticalEviction(boolean backgroundIO)
          Do a check on whether synchronous eviction is needed.
 void doEvict(Evictor.EvictionSource source)
          May be called by the evictor thread on wakeup or programatically.
(package private)  long evictBatch(Evictor.EvictionSource source, boolean backgroundIO, long reqEvictBytes)
          Each iteration will attempt to evict requiredEvictBytes, but will give up after a complete pass over the INList.
 long evictIN(IN target, boolean backgroundIO, Evictor.EvictionSource source)
          Strip or evict this node.
(package private) abstract  StatGroup getINListStats(StatsConfig config)
           
(package private) abstract  int getMaxINsPerBatch()
          Returns the approximate number of total INs in the INList(s).
(package private) abstract  IN getNextIN()
          Returns the next IN in the INList(s), wrapping if necessary.
(package private) abstract  Iterator<IN> getScanIterator()
           
 void incBINEvictStats(Evictor.EvictionSource source)
           
 void incBINFetchStats(boolean isMiss)
           
 void incINEvictStats(Evictor.EvictionSource source)
           
 void incINFetchStats(boolean isMiss)
           
 void incLNFetchStats(boolean isMiss)
          Update the appropriate fetch stat, based on node type.
 boolean isCacheFull()
          Returns true if the JE cache level is above the point where it is likely that the cache has filled, and is staying full.
 StatGroup loadStats(StatsConfig config)
          Load stats.
protected  long nDeadlockRetries()
          Return the number of retries when a deadlock exception occurs.
 int normalizeLevel(IN in, int evictType)
          Normalize the tree level of the given IN.
abstract  void noteINListChange(int nINs)
          Called whenever INs are added to, or removed from, the INList.
 void onWakeup()
          Called whenever the daemon thread wakes up from a sleep.
abstract  void removeEnvironment(EnvironmentImpl envImpl)
          Only supported by SharedEvictor.
 void setPreEvictINHook(TestHook<Object> hook)
           
 void setRunnableHook(TestHook<Boolean> hook)
           
(package private) abstract  void setScanIterator(Iterator<IN> iter)
           
(package private) abstract  long startBatch()
          Perform class-specific batch processing: Initialize iterator, perform UtilizationTracker eviction, etc.
 boolean wasCacheEverFull()
          Returns whether eviction has ever occurred, i.e., whether the cache has ever filled.
 
Methods inherited from class com.sleepycat.je.utilint.DaemonThread
checkErrorListener, createLogger, getExceptionListener, getNWakeupRequests, getThread, isPaused, isRunning, isShutdownRequested, requestShutdown, run, runOrPause, setExceptionListener, shutdown, toString, wakeup
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

sharedCacheEnvs

protected IntStat sharedCacheEnvs

evictProfile

Evictor.EvictProfile evictProfile
Constructor Detail

Evictor

Evictor(EnvironmentImpl envImpl,
        long wakeupInterval,
        String name)
  throws DatabaseException
Throws:
DatabaseException
Method Detail

getINListStats

abstract StatGroup getINListStats(StatsConfig config)

loadStats

public StatGroup loadStats(StatsConfig config)
Load stats.


nDeadlockRetries

protected long nDeadlockRetries()
Return the number of retries when a deadlock exception occurs.

Overrides:
nDeadlockRetries in class DaemonThread

alert

public void alert()
Wakeup the evictor only if it's not already active.


onWakeup

public void onWakeup()
              throws DatabaseException
Called whenever the daemon thread wakes up from a sleep.

Specified by:
onWakeup in class DaemonThread
Throws:
DatabaseException

doEvict

public void doEvict(Evictor.EvictionSource source)
             throws DatabaseException
May be called by the evictor thread on wakeup or programatically.

Throws:
DatabaseException

doCriticalEviction

public void doCriticalEviction(boolean backgroundIO)
Do a check on whether synchronous eviction is needed. Note that this method is intentionally not synchronized in order to minimize overhead when checking for critical eviction. This method is called from application threads for every cursor operation.


evictBatch

long evictBatch(Evictor.EvictionSource source,
                boolean backgroundIO,
                long reqEvictBytes)
          throws DatabaseException
Each iteration will attempt to evict requiredEvictBytes, but will give up after a complete pass over the INList.

Returns:
the number of bytes evicted, or zero if no progress was made.
Throws:
DatabaseException

isCacheFull

public boolean isCacheFull()
Returns true if the JE cache level is above the point where it is likely that the cache has filled, and is staying full. This is not guaranteed, since the level does not stay at a constant value. But it is a good enough indication to drive activities such as cache mode determination. This method errs on the side of returning true sooner than the point where the cache is actually full, as described below.


wasCacheEverFull

public boolean wasCacheEverFull()
Returns whether eviction has ever occurred, i.e., whether the cache has ever filled.


normalizeLevel

public int normalizeLevel(IN in,
                          int evictType)
Normalize the tree level of the given IN. Is public for unit testing. A BIN containing evictable LNs is given level 0, so it will be stripped first. For non-duplicate and DBMAP trees, the high order bits are cleared to make their levels correspond; that way, all bottom level nodes (BINs and DBINs) are given the same eviction priority. Note that BINs in a duplicate tree are assigned the same level as BINs in a non-duplicate tree. This isn't always optimimal, but is the best we can do considering that BINs in duplicate trees may contain a mix of LNs and DINs. BINs in the mapping tree are also assigned the same level as user DB BINs. When doing by-level eviction (lruOnly=false), this seems counter-intuitive since we should evict user DB nodes before mapping DB nodes. But that does occur because mapping DB INs referencing an open DB are unevictable. The level is only used for selecting among evictable nodes. If we did NOT normalize the level for the mapping DB, then INs for closed evictable DBs would not be evicted until after all nodes in all user DBs were evicted. If there were large numbers of closed DBs, this would have a negative performance impact.


evictIN

public long evictIN(IN target,
                    boolean backgroundIO,
                    Evictor.EvictionSource source)
             throws DatabaseException
Strip or evict this node.

Parameters:
source - is EvictSource.CRITICAL or EVICTORTHREAD when this operation is invoked by the evictor (either critical eviction or the evictor background thread), and is EvictSource.CACHEMODE if invoked by a user operation using CacheMode.EVICT_BIN. If CACHEMODE, we will perform the eviction regardless of whether: 1) we have to wait for a latch, or 2) the IN generation changes, or 3) we are able to strip LNs. If not CACHEMODE, any of the above conditions will prevent eviction.
Returns:
number of bytes evicted.
Throws:
DatabaseException

incBINEvictStats

public void incBINEvictStats(Evictor.EvictionSource source)

incINEvictStats

public void incINEvictStats(Evictor.EvictionSource source)

incLNFetchStats

public void incLNFetchStats(boolean isMiss)
Update the appropriate fetch stat, based on node type.


incBINFetchStats

public void incBINFetchStats(boolean isMiss)

incINFetchStats

public void incINFetchStats(boolean isMiss)

setRunnableHook

public void setRunnableHook(TestHook<Boolean> hook)

setPreEvictINHook

public void setPreEvictINHook(TestHook<Object> hook)

clearEnv

public abstract void clearEnv()
Standard daemon method to set envImpl to null.


noteINListChange

public abstract void noteINListChange(int nINs)
Called whenever INs are added to, or removed from, the INList.


addEnvironment

public abstract void addEnvironment(EnvironmentImpl envImpl)
Only supported by SharedEvictor.


removeEnvironment

public abstract void removeEnvironment(EnvironmentImpl envImpl)
Only supported by SharedEvictor.


checkEnv

public abstract boolean checkEnv(EnvironmentImpl env)
Only supported by SharedEvictor.


startBatch

abstract long startBatch()
                  throws DatabaseException
Perform class-specific batch processing: Initialize iterator, perform UtilizationTracker eviction, etc. No latches may be held when this method is called. startBatch must be called before getMaxINsPerBatch.

Throws:
DatabaseException

getMaxINsPerBatch

abstract int getMaxINsPerBatch()
Returns the approximate number of total INs in the INList(s). One eviction batch will scan at most this number of INs. If zero is returned, selectIN will not be called. startBatch must be called before getMaxINsPerBatch.


getNextIN

abstract IN getNextIN()
Returns the next IN in the INList(s), wrapping if necessary.


getScanIterator

abstract Iterator<IN> getScanIterator()

setScanIterator

abstract void setScanIterator(Iterator<IN> iter)


Copyright (c) 2004-2010 Oracle. All rights reserved.