package com.sleepycat.je.cleaner; import java.nio.ByteBuffer; import com.sleepycat.je.DatabaseException; import com.sleepycat.je.log.LogReadable; import com.sleepycat.je.log.LogUtils; import com.sleepycat.je.log.LogWritable; import de.ovgu.cide.jakutil.*; public class FileSummary implements LogWritable, LogReadable { public int totalCount; public int totalSize; public int totalINCount; public int totalINSize; public int totalLNCount; public int totalLNSize; public int obsoleteINCount; public int obsoleteLNCount; /** * Creates an empty summary. */ public FileSummary(){ } /** * Returns whether this summary contains any non-zero totals. */ public boolean isEmpty(){ return totalCount == 0 && totalSize == 0 && obsoleteINCount == 0 && obsoleteLNCount == 0; } /** * Returns the approximate byte size of all obsolete LN entries. */ public int getObsoleteLNSize(){ if (totalLNCount == 0) { return 0; } long totalSize=totalLNSize; totalSize<<=8; long avgSizePerLN=totalSize / totalLNCount; return (int)((obsoleteLNCount * avgSizePerLN) >> 8); } /** * Returns the approximate byte size of all obsolete IN entries. */ public int getObsoleteINSize(){ if (totalINCount == 0) { return 0; } long totalSize=totalINSize; totalSize<<=8; long avgSizePerIN=totalSize / totalINCount; return (int)((obsoleteINCount * avgSizePerIN) >> 8); } /** * Returns an estimate of the total bytes that are obsolete. */ public int getObsoleteSize() throws DatabaseException { if (totalSize > 0) { int leftoverSize=totalSize - (totalINSize + totalLNSize); int obsoleteSize=getObsoleteLNSize() + getObsoleteINSize() + leftoverSize; if (obsoleteSize > totalSize) { obsoleteSize=totalSize; } return obsoleteSize; } else { return 0; } } /** * Returns the total number of entries counted. This value is guaranted * to increase whenever the tracking information about a file changes. It * is used a key discriminator for FileSummaryLN records. */ public int getEntriesCounted(){ return totalCount + obsoleteLNCount + obsoleteINCount; } /** * Returns the number of non-obsolete LN and IN entries. */ public int getNonObsoleteCount(){ return totalLNCount + totalINCount - obsoleteLNCount - obsoleteINCount; } /** * Reset all totals to zero. */ public void reset(){ totalCount=0; totalSize=0; totalINCount=0; totalINSize=0; totalLNCount=0; totalLNSize=0; obsoleteINCount=0; obsoleteLNCount=0; } /** * Add the totals of the given summary object to the totals of this object. */ public void add( FileSummary o){ totalCount+=o.totalCount; totalSize+=o.totalSize; totalINCount+=o.totalINCount; totalINSize+=o.totalINSize; totalLNCount+=o.totalLNCount; totalLNSize+=o.totalLNSize; obsoleteINCount+=o.obsoleteINCount; obsoleteLNCount+=o.obsoleteLNCount; } /** * @see LogWritable#getLogSize */ public int getLogSize(){ return 8 * LogUtils.getIntLogSize(); } /** * @see LogWritable#writeToLog */ public void writeToLog( ByteBuffer buf){ LogUtils.writeInt(buf,totalCount); LogUtils.writeInt(buf,totalSize); LogUtils.writeInt(buf,totalINCount); LogUtils.writeInt(buf,totalINSize); LogUtils.writeInt(buf,totalLNCount); LogUtils.writeInt(buf,totalLNSize); LogUtils.writeInt(buf,obsoleteINCount); LogUtils.writeInt(buf,obsoleteLNCount); } /** * @see LogReadable#readFromLog */ public void readFromLog( ByteBuffer buf, byte entryTypeVersion){ totalCount=LogUtils.readInt(buf); totalSize=LogUtils.readInt(buf); totalINCount=LogUtils.readInt(buf); totalINSize=LogUtils.readInt(buf); totalLNCount=LogUtils.readInt(buf); totalLNSize=LogUtils.readInt(buf); obsoleteINCount=LogUtils.readInt(buf); if (obsoleteINCount == -1) { obsoleteINCount=totalINCount; } obsoleteLNCount=LogUtils.readInt(buf); } /** * @see LogReadable#dumpLog */ public void dumpLog( StringBuffer buf, boolean verbose){ buf.append("<summary totalCount=\""); buf.append(totalCount); buf.append("\" totalSize=\""); buf.append(totalSize); buf.append("\" totalINCount=\""); buf.append(totalINCount); buf.append("\" totalINSize=\""); buf.append(totalINSize); buf.append("\" totalLNCount=\""); buf.append(totalLNCount); buf.append("\" totalLNSize=\""); buf.append(totalLNSize); buf.append("\" obsoleteINCount=\""); buf.append(obsoleteINCount); buf.append("\" obsoleteLNCount=\""); buf.append(obsoleteLNCount); buf.append("\"/>"); } /** * Never called. * @see LogReadable#getTransactionId */ public long getTransactionId(){ return -1; } /** * Never called. * @see LogReadable#logEntryIsTransactional */ public boolean logEntryIsTransactional(){ return false; } public String toString(){ StringBuffer buf=new StringBuffer(); dumpLog(buf,true); return buf.toString(); } }