package voldemort.store.bdb.stats;
import java.util.Iterator;
import java.util.Map;
import java.util.SortedMap;
import voldemort.utils.Utils;
import com.sleepycat.je.DbInternal;
import com.sleepycat.je.Environment;
import com.sleepycat.je.cleaner.FileSummary;
import com.sleepycat.je.cleaner.UtilizationProfile;
import com.sleepycat.je.dbi.EnvironmentImpl;
/**
* Obtains the disk space utilization for the BDB environment
*/
final public class SpaceUtilizationStats {
private final EnvironmentImpl envImpl;
private SortedMap<Long, FileSummary> summaryMap;
private long totalSpaceUsed = 0;
private long totalSpaceUtilized = 0;
public SpaceUtilizationStats(Environment env) {
this(DbInternal.getEnvironmentImpl(env));
}
private SpaceUtilizationStats(EnvironmentImpl envImpl) {
this.envImpl = envImpl;
UtilizationProfile profile = this.envImpl.getUtilizationProfile();
summaryMap = profile.getFileSummaryMap(true);
Iterator<Map.Entry<Long, FileSummary>> fileItr = summaryMap.entrySet().iterator();
while(fileItr.hasNext()) {
Map.Entry<Long, FileSummary> entry = fileItr.next();
FileSummary fs = entry.getValue();
totalSpaceUsed += fs.totalSize;
totalSpaceUtilized += fs.totalSize - fs.getObsoleteSize();
}
}
public long getTotalSpaceUsed() {
return totalSpaceUsed;
}
public long getTotalSpaceUtilized() {
return totalSpaceUtilized;
}
public String getSummariesAsString() {
StringBuffer summaryDetails = new StringBuffer();
if(summaryMap != null) {
summaryDetails.append("file,util%\n");
Iterator<Map.Entry<Long, FileSummary>> fileItr = summaryMap.entrySet().iterator();
while(fileItr.hasNext()) {
Map.Entry<Long, FileSummary> entry = fileItr.next();
FileSummary fs = entry.getValue();
long bytesUsed = fs.totalSize - fs.getObsoleteSize();
summaryDetails.append(String.format("%s,%f\n",
Long.toHexString(entry.getKey().longValue()),
Utils.safeGetPercentage(bytesUsed, fs.totalSize)));
}
summaryDetails.append(String.format("total,%f\n",
Utils.safeGetPercentage(totalSpaceUtilized,
totalSpaceUsed)));
}
return summaryDetails.toString();
}
}