Index: src/main/java/org/apache/hadoop/hbase/HServerLoad.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/HServerLoad.java (revision 1083285) +++ src/main/java/org/apache/hadoop/hbase/HServerLoad.java (working copy) @@ -22,9 +22,9 @@ import java.io.DataInput; import java.io.DataOutput; import java.io.IOException; -import java.util.ArrayList; -import java.util.Collection; import java.util.Collections; +import java.util.Map; +import java.util.TreeMap; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Strings; @@ -47,7 +47,7 @@ /** the maximum allowable size of the heap, in MB */ private int maxHeapMB; /** per-region load metrics */ - private ArrayList regionLoad = new ArrayList(); + private Map regionLoad = new TreeMap(Bytes.BYTES_COMPARATOR); /** * Encapsulates per-region loading metrics. @@ -86,8 +86,7 @@ */ public RegionLoad(final byte[] name, final int stores, final int storefiles, final int storefileSizeMB, - final int memstoreSizeMB, final int storefileIndexSizeMB, - final long requestsCount) { + final int memstoreSizeMB, final int storefileIndexSizeMB,final long requestsCount) { this.name = name; this.stores = stores; this.storefiles = storefiles; @@ -147,7 +146,7 @@ public int getStorefileIndexSizeMB() { return storefileIndexSizeMB; } - + /** * @return the number of requests made to region */ @@ -282,7 +281,9 @@ */ public HServerLoad(final HServerLoad hsl) { this(hsl.numberOfRequests, hsl.usedHeapMB, hsl.maxHeapMB); - this.regionLoad.addAll(hsl.regionLoad); + for (Map.Entry e : hsl.regionLoad.entrySet()) { + this.regionLoad.put(e.getKey(), e.getValue()); + } } /** @@ -387,8 +388,8 @@ /** * @return region load metrics */ - public Collection getRegionsLoad() { - return Collections.unmodifiableCollection(regionLoad); + public Map getRegionsLoad() { + return Collections.unmodifiableMap(regionLoad); } /** @@ -396,7 +397,7 @@ */ public int getStorefiles() { int count = 0; - for (RegionLoad info: regionLoad) + for (RegionLoad info: regionLoad.values()) count += info.getStorefiles(); return count; } @@ -406,7 +407,7 @@ */ public int getStorefileSizeInMB() { int count = 0; - for (RegionLoad info: regionLoad) + for (RegionLoad info: regionLoad.values()) count += info.getStorefileSizeMB(); return count; } @@ -416,7 +417,7 @@ */ public int getMemStoreSizeInMB() { int count = 0; - for (RegionLoad info: regionLoad) + for (RegionLoad info: regionLoad.values()) count += info.getMemStoreSizeMB(); return count; } @@ -426,7 +427,7 @@ */ public int getStorefileIndexSizeInMB() { int count = 0; - for (RegionLoad info: regionLoad) + for (RegionLoad info: regionLoad.values()) count += info.getStorefileIndexSizeMB(); return count; } @@ -466,7 +467,7 @@ */ public void addRegionInfo(final HServerLoad.RegionLoad load) { this.numberOfRegions++; - this.regionLoad.add(load); + this.regionLoad.put(load.getName(), load); } /** @@ -483,7 +484,7 @@ final int storefiles, final int storefileSizeMB, final int memstoreSizeMB, final int storefileIndexSizeMB, final long requestsCount) { - this.regionLoad.add(new HServerLoad.RegionLoad(name, stores, storefiles, + this.regionLoad.put(name, new HServerLoad.RegionLoad(name, stores, storefiles, storefileSizeMB, memstoreSizeMB, storefileIndexSizeMB, requestsCount)); } @@ -497,7 +498,7 @@ for (int i = 0; i < numberOfRegions; i++) { RegionLoad rl = new RegionLoad(); rl.readFields(in); - regionLoad.add(rl); + regionLoad.put(rl.getName(), rl); } } @@ -506,8 +507,8 @@ out.writeInt(usedHeapMB); out.writeInt(maxHeapMB); out.writeInt(numberOfRegions); - for (int i = 0; i < numberOfRegions; i++) - regionLoad.get(i).write(out); + for (RegionLoad rl : regionLoad.values()) + rl.write(out); } // Comparable Index: src/main/java/org/apache/hadoop/hbase/avro/AvroUtil.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/avro/AvroUtil.java (revision 1083285) +++ src/main/java/org/apache/hadoop/hbase/avro/AvroUtil.java (working copy) @@ -93,7 +93,7 @@ asl.numberOfRegions = hsl.getNumberOfRegions(); asl.numberOfRequests = hsl.getNumberOfRequests(); - Collection regionLoads = hsl.getRegionsLoad(); + Collection regionLoads = hsl.getRegionsLoad().values(); Schema s = Schema.createArray(ARegionLoad.SCHEMA$); GenericData.Array aregionLoads = null; if (regionLoads != null) { Index: src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java (revision 1083285) +++ src/main/java/org/apache/hadoop/hbase/rest/StorageClusterStatusResource.java (working copy) @@ -82,7 +82,7 @@ info.getStartCode(), load.getUsedHeapMB(), load.getMaxHeapMB()); node.setRequests(load.getNumberOfRequests()); - for (HServerLoad.RegionLoad region: load.getRegionsLoad()) { + for (HServerLoad.RegionLoad region: load.getRegionsLoad().values()) { node.addRegion(region.getName(), region.getStores(), region.getStorefiles(), region.getStorefileSizeMB(), region.getMemStoreSizeMB(), region.getStorefileIndexSizeMB()); Index: src/main/java/org/apache/hadoop/hbase/master/ServerManager.java =================================================================== --- src/main/java/org/apache/hadoop/hbase/master/ServerManager.java (revision 1083954) +++ src/main/java/org/apache/hadoop/hbase/master/ServerManager.java (working copy) @@ -326,6 +326,18 @@ // No more piggyback messages on heartbeats for other stuff return msgs; } + + /** + * Make server load accessible to AssignmentManager + * @param serverName + * @return + * @throws HServerLoad if serverName is known + */ + HServerLoad getLoad(String serverName) { + HServerInfo hsi = this.onlineServers.get(serverName); + if (hsi == null) return null; + return hsi.getLoad(); + } /** * @param serverName