package com.sleepycat.je.cleaner; import com.sleepycat.je.dbi.MemoryBudget; import de.ovgu.cide.jakutil.*; /** * Delta file summary info for a tracked file. Tracked files are managed by * the UtilizationTracker. * <p>The methods in this class for reading obsolete offsets may be used by * multiple threads without synchronization even while another thread is adding * offsets. This is possible because elements are never deleted from the * lists. The thread adding obsolete offsets does so under the log write * latch to prevent multiple threads from adding concurrently.</p> */ public class TrackedFileSummary extends FileSummary { private UtilizationTracker tracker; private long fileNum; private OffsetList obsoleteOffsets; private boolean trackDetail; private boolean allowFlush=true; /** * Creates an empty tracked summary. */ TrackedFileSummary( UtilizationTracker tracker, long fileNum, boolean trackDetail){ this.tracker=tracker; this.fileNum=fileNum; this.trackDetail=trackDetail; } /** * Returns whether this summary is allowed or prohibited from being flushed * or evicted during cleaning. By default, flushing is allowed. */ public boolean getAllowFlush(){ return allowFlush; } /** * Allows or prohibits this summary from being flushed or evicted during * cleaning. By default, flushing is allowed. */ void setAllowFlush( boolean allowFlush){ this.allowFlush=allowFlush; } /** * Returns the file number being tracked. */ public long getFileNumber(){ return fileNum; } /** * Overrides reset for a tracked file, and is called when a FileSummaryLN * is written to the log. * <p>Must be called under the log write latch.</p> */ public void reset(){ obsoleteOffsets=null; tracker.resetFile(this); this.hook168(); super.reset(); } /** * Tracks the given offset as obsolete or non-obsolete. * <p>Must be called under the log write latch.</p> */ void trackObsolete( long offset){ new TrackedFileSummary_trackObsolete(this,offset).execute(); } /** * Adds the obsolete offsets as well as the totals of the given object. */ void addTrackedSummary( TrackedFileSummary other){ add(other); if (other.obsoleteOffsets != null) { if (obsoleteOffsets != null) { if (obsoleteOffsets.merge(other.obsoleteOffsets)) { this.hook169(); } } else { obsoleteOffsets=other.obsoleteOffsets; } } } /** * Returns obsolete offsets as an array of longs, or null if none. */ public long[] getObsoleteOffsets(){ if (obsoleteOffsets != null) { return obsoleteOffsets.toArray(); } else { return null; } } /** * Returns whether the given offset is present in the tracked offsets. * This does not indicate whether the offset is obsolete in general, but * only if it is known to be obsolete in this version of the tracked * information. */ boolean containsObsoleteOffset( long offset){ if (obsoleteOffsets != null) { return obsoleteOffsets.contains(offset); } else { return false; } } @MethodObject static class TrackedFileSummary_trackObsolete { TrackedFileSummary_trackObsolete( TrackedFileSummary _this, long offset){ this._this=_this; this.offset=offset; } void execute(){ if (!_this.trackDetail) { return; } this.hook170(); if (_this.obsoleteOffsets == null) { _this.obsoleteOffsets=new OffsetList(); this.hook171(); } if (_this.obsoleteOffsets.add(offset,_this.tracker.getEnvironment().isOpen())) { this.hook172(); } } protected TrackedFileSummary _this; protected long offset; protected int adjustMem; protected void hook170(){ } protected void hook171(){ } protected void hook172(){ } } protected void hook168(){ } protected void hook169(){ } }