diff --exclude build --exclude output --exclude .svn -urN hbase.001/src/java/org/apache/hadoop/hbase/HServerLoad.java hbase/src/java/org/apache/hadoop/hbase/HServerLoad.java --- hbase.001/src/java/org/apache/hadoop/hbase/HServerLoad.java 2008-10-31 15:32:14.000000000 -0700 +++ hbase/src/java/org/apache/hadoop/hbase/HServerLoad.java 2008-11-23 23:43:13.031250000 -0800 @@ -40,7 +40,17 @@ * Size of the memcaches on this machine in MB. */ private int memcacheSizeMB; - + + /* + * used heap in MB. + */ + private int usedHeapMB; + + /* + * Maximum heap in MB. + */ + private int maxHeapMB; + /* * TODO: Other metrics that might be considered when the master is actually * doing load balancing instead of merely trying to decide where to assign @@ -63,20 +73,30 @@ * Constructor * @param numberOfRequests * @param numberOfRegions + * @param storefiles + * @param memcacheSizeMB + * @param usedHeapMB + * @param maxHeapMB */ public HServerLoad(final int numberOfRequests, final int numberOfRegions, - final int storefiles, final int memcacheSizeMB) { + final int storefiles, final int memcacheSizeMB, final int usedHeapMB, + final int maxHeapMB) { this.numberOfRequests = numberOfRequests; this.numberOfRegions = numberOfRegions; this.storefiles = storefiles; this.memcacheSizeMB = memcacheSizeMB; + this.usedHeapMB = usedHeapMB; + this.maxHeapMB = maxHeapMB; } - + + /** + * Constructor + * @param hsl the template HServerLoad + */ public HServerLoad(final HServerLoad hsl) { this(hsl.numberOfRequests, hsl.numberOfRegions, hsl.storefiles, - hsl.memcacheSizeMB); + hsl.memcacheSizeMB, hsl.usedHeapMB, hsl.maxHeapMB); } - /** * Originally, this method factored in the effect of requests going to the * server as well. However, this does not interact very well with the current @@ -99,13 +119,18 @@ } /** - * Returns toString() with the number of requests divided by the message interval in seconds + * Returns toString() with the number of requests divided by the message + * interval in seconds * @param msgInterval * @return The load as a String */ public String toString(int msgInterval) { return "requests: " + numberOfRequests/msgInterval + - " regions: " + numberOfRegions; + " regions: " + numberOfRegions + + " storefiles: " + storefiles + + " memcacheSizeMB: " + memcacheSizeMB + + " usedHeapMB: " + usedHeapMB + + " maxHeapMB: " + maxHeapMB; } @Override @@ -144,12 +169,14 @@ } /** - * @return Size of memcaches in kb. + * @return Size of memcaches in MB */ - public int getMemcacheSizeInKB() { + public int getMemcacheSizeInMB() { return this.memcacheSizeMB; } + // Setters + /** * @param storefiles Count of storefiles on this server. */ @@ -158,10 +185,10 @@ } /** - * @param memcacheSizeInKB Size of memcache in kb. + * @param memcacheSizeInKB Size of memcache in MB */ - public void setMemcacheSizeInKB(int memcacheSizeInKB) { - this.memcacheSizeMB = memcacheSizeInKB; + public void setMemcacheSizeInMB(int memcacheSizeInMB) { + this.memcacheSizeMB = memcacheSizeInMB; } /** @@ -183,11 +210,19 @@ public void readFields(DataInput in) throws IOException { numberOfRequests = in.readInt(); numberOfRegions = in.readInt(); + storefiles = in.readInt(); + memcacheSizeMB = in.readInt(); + usedHeapMB = in.readInt(); + maxHeapMB = in.readInt(); } public void write(DataOutput out) throws IOException { out.writeInt(numberOfRequests); out.writeInt(numberOfRegions); + out.writeInt(storefiles); + out.writeInt(memcacheSizeMB); + out.writeInt(usedHeapMB); + out.writeInt(maxHeapMB); } // Comparable diff --exclude build --exclude output --exclude .svn -urN hbase.001/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java hbase/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java --- hbase.001/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java 2008-11-23 20:58:54.546875000 -0800 +++ hbase/src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java 2008-11-23 23:52:01.437500000 -0800 @@ -21,6 +21,7 @@ import java.io.IOException; import java.lang.Thread.UncaughtExceptionHandler; +import java.lang.management.ManagementFactory; import java.lang.reflect.Constructor; import java.net.InetSocketAddress; import java.util.ArrayList; @@ -47,6 +48,10 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReentrantReadWriteLock; +import javax.management.MBeanServer; +import javax.management.ObjectName; +import javax.management.openmbean.CompositeData; + import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.conf.Configuration; @@ -194,7 +199,10 @@ // flag set after we're done setting up server threads (used for testing) protected volatile boolean isOnline; - + + protected MBeanServer mbeanServer = + ManagementFactory.getPlatformMBeanServer(); + /** * Starts a HRegionServer at the default location * @param conf @@ -322,9 +330,19 @@ } try { doMetrics(); - this.serverInfo.setLoad(new HServerLoad(requestCount.get(), + CompositeData memory = (CompositeData) + mbeanServer.getAttribute( + new ObjectName("java.lang:type=Memory"), + "HeapMemoryUsage"); + HServerLoad hsl = + new HServerLoad(requestCount.get(), onlineRegions.size(), this.metrics.storefiles.get(), - this.metrics.memcacheSizeMB.get())); + this.metrics.memcacheSizeMB.get(), + (int)(((Long)memory.get("used")).longValue()/1024/1024), + (int)(((Long)memory.get("max")).longValue()/1024/1024)); + this.serverInfo.setLoad(hsl); + if (LOG.isDebugEnabled()) + LOG.debug("sending server load: " + hsl); this.requestCount.set(0); HMsg msgs[] = hbaseMaster.regionServerReport( serverInfo, outboundArray, getMostLoadedRegions()); @@ -843,7 +861,23 @@ while(!stopRequested.get()) { try { this.requestCount.set(0); - this.serverInfo.setLoad(new HServerLoad(0, onlineRegions.size(), 0, 0)); + int usedHeap = 0; + int maxHeap = 0; + try { + CompositeData memory = (CompositeData) + mbeanServer.getAttribute( + new ObjectName("java.lang:type=Memory"), + "HeapMemoryUsage"); + usedHeap = (int)(((Long)memory.get("used")).longValue()/1024/1024); + maxHeap = (int)(((Long)memory.get("max")).longValue()/1024/1024); + } catch (Exception ex) { + // ignore + } + HServerLoad hsl = + new HServerLoad(0, onlineRegions.size(), 0, 0, usedHeap, maxHeap); + this.serverInfo.setLoad(hsl); + if (LOG.isDebugEnabled()) + LOG.debug("sending initial server load: " + hsl); lastMsg = System.currentTimeMillis(); result = this.hbaseMaster.regionServerStartup(serverInfo); break;