SOLR-1242: Human readable JVM info from system handler does integer cutoff rounding, even when dealing with GB. Fixed to round to one decimal place.

git-svn-id: https://svn.apache.org/repos/asf/lucene/solr/trunk@788392 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Mark Robert Miller 2009-06-25 15:28:53 +00:00
parent e7c97672d0
commit 613685ac6f
2 changed files with 36 additions and 8 deletions

View File

@ -422,6 +422,9 @@ Bug Fixes
49. SOLR-1207: equals method should compare this and other of DocList in DocSetBase (koji) 49. SOLR-1207: equals method should compare this and other of DocList in DocSetBase (koji)
50. SOLR-1242: Human readable JVM info from system handler does integer cutoff rounding, even when dealing
with GB. Fixed to round to one decimal place. (Jay Hill, Mark Miller)
Other Changes Other Changes
---------------------- ----------------------

View File

@ -26,9 +26,9 @@ import java.lang.management.OperatingSystemMXBean;
import java.lang.management.RuntimeMXBean; import java.lang.management.RuntimeMXBean;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.net.InetAddress; import java.net.InetAddress;
import java.text.DecimalFormat;
import java.util.Date; import java.util.Date;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.apache.lucene.LucenePackage; import org.apache.lucene.LucenePackage;
import org.apache.solr.common.util.NamedList; import org.apache.solr.common.util.NamedList;
@ -192,15 +192,16 @@ public class SystemInfoHandler extends RequestHandlerBase
jvm.add( "processors", runtime.availableProcessors() ); jvm.add( "processors", runtime.availableProcessors() );
long used = runtime.totalMemory() - runtime.freeMemory(); long used = runtime.totalMemory() - runtime.freeMemory();
int percentUsed = (int)(((double)(used)/(double)runtime.maxMemory())*100); // not thread safe, but could be thread local
DecimalFormat df = new DecimalFormat("#.#");
double percentUsed = ((double)(used)/(double)runtime.maxMemory())*100;
SimpleOrderedMap<Object> mem = new SimpleOrderedMap<Object>(); SimpleOrderedMap<Object> mem = new SimpleOrderedMap<Object>();
mem.add( "free", FileUtils.byteCountToDisplaySize( runtime.freeMemory() ) ); mem.add("free", humanReadableUnits(runtime.freeMemory(), df));
mem.add( "total", FileUtils.byteCountToDisplaySize( runtime.totalMemory() ) ); mem.add("total", humanReadableUnits(runtime.totalMemory(), df));
mem.add( "max", FileUtils.byteCountToDisplaySize( runtime.maxMemory() ) ); mem.add("max", humanReadableUnits(runtime.maxMemory(), df));
mem.add( "used", FileUtils.byteCountToDisplaySize( used ) + " (%"+percentUsed+")"); mem.add("used", humanReadableUnits(used, df) + " (%" + df.format(percentUsed) + ")");
jvm.add( "memory", mem ); jvm.add("memory", mem);
// JMX properties -- probably should be moved to a different handler // JMX properties -- probably should be moved to a different handler
SimpleOrderedMap<Object> jmx = new SimpleOrderedMap<Object>(); SimpleOrderedMap<Object> jmx = new SimpleOrderedMap<Object>();
@ -292,6 +293,30 @@ public class SystemInfoHandler extends RequestHandlerBase
public String getSource() { public String getSource() {
return "$URL$"; return "$URL$";
} }
private static final long ONE_KB = 1024;
private static final long ONE_MB = ONE_KB * ONE_KB;
private static final long ONE_GB = ONE_KB * ONE_MB;
/**
* Return good default units based on byte size.
*/
private static String humanReadableUnits(long bytes, DecimalFormat df) {
String newSizeAndUnits;
if (bytes / ONE_GB > 0) {
newSizeAndUnits = String.valueOf(df.format((float)bytes / ONE_GB)) + " GB";
} else if (bytes / ONE_MB > 0) {
newSizeAndUnits = String.valueOf(df.format((float)bytes / ONE_MB)) + " MB";
} else if (bytes / ONE_KB > 0) {
newSizeAndUnits = String.valueOf(df.format((float)bytes / ONE_KB)) + " KB";
} else {
newSizeAndUnits = String.valueOf(bytes) + " bytes";
}
return newSizeAndUnits;
}
} }