diff --git src/main/java/org/apache/hadoop/hbase/HServerLoad.java src/main/java/org/apache/hadoop/hbase/HServerLoad.java index 0c680e4..acc07f2 100644 --- src/main/java/org/apache/hadoop/hbase/HServerLoad.java +++ src/main/java/org/apache/hadoop/hbase/HServerLoad.java @@ -65,6 +65,12 @@ implements WritableComparable { } /** + * String representation of the set of coprocessors loaded by this + * regionserver. + */ + private String loadedCoprocessors = ""; + + /** * Encapsulates per-region loading metrics. */ public static class RegionLoad extends VersionedWritable { @@ -427,12 +433,13 @@ implements WritableComparable { */ public HServerLoad(final int totalNumberOfRequests, final int numberOfRequests, final int usedHeapMB, final int maxHeapMB, - final Map regionLoad) { + final Map regionLoad, final String loadedCoprocessors) { this.numberOfRequests = numberOfRequests; this.usedHeapMB = usedHeapMB; this.maxHeapMB = maxHeapMB; this.regionLoad = regionLoad; this.totalNumberOfRequests = totalNumberOfRequests; + this.loadedCoprocessors = loadedCoprocessors; } /** @@ -441,7 +448,7 @@ implements WritableComparable { */ public HServerLoad(final HServerLoad hsl) { this(hsl.totalNumberOfRequests, hsl.numberOfRequests, hsl.usedHeapMB, - hsl.maxHeapMB, hsl.getRegionsLoad()); + hsl.maxHeapMB, hsl.getRegionsLoad(), hsl.loadedCoprocessors); for (Map.Entry e : hsl.regionLoad.entrySet()) { this.regionLoad.put(e.getKey(), e.getValue()); } @@ -487,6 +494,7 @@ implements WritableComparable { sb = Strings.appendKeyValue(sb, "usedHeapMB", Integer.valueOf(this.usedHeapMB)); sb = Strings.appendKeyValue(sb, "maxHeapMB", Integer.valueOf(maxHeapMB)); + sb = Strings.appendKeyValue(sb,"loadedCoprocessors", loadedCoprocessors); return sb.toString(); } @@ -591,6 +599,10 @@ implements WritableComparable { return count; } + public String getLoadedCoprocessors() { + return loadedCoprocessors; + } + // Writable public void readFields(DataInput in) throws IOException { @@ -607,6 +619,7 @@ implements WritableComparable { regionLoad.put(rl.getName(), rl); } totalNumberOfRequests = in.readInt(); + loadedCoprocessors = in.readUTF(); } public void write(DataOutput out) throws IOException { @@ -619,6 +632,7 @@ implements WritableComparable { for (RegionLoad rl: regionLoad.values()) rl.write(out); out.writeInt(totalNumberOfRequests); + out.writeUTF(loadedCoprocessors); } // Comparable diff --git src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java index 216abb6..ed8ec18 100644 --- src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java +++ src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java @@ -739,7 +739,7 @@ public class HRegionServer implements HRegionInterface, HBaseRPCErrorHandler, void tryRegionServerReport() throws IOException { - HServerLoad hsl = buildServerLoad(); + HServerLoad hsl = buildServerLoad(CoprocessorHost.getLoadedCoprocessors().toString()); // Why we do this? this.requestCount.set(0); try { @@ -758,7 +758,7 @@ public class HRegionServer implements HRegionInterface, HBaseRPCErrorHandler, } } - HServerLoad buildServerLoad() { + HServerLoad buildServerLoad(final String loadedCoprocessors) { Collection regions = getOnlineRegionsLocalContext(); TreeMap regionLoads = new TreeMap(Bytes.BYTES_COMPARATOR); @@ -769,7 +769,7 @@ public class HRegionServer implements HRegionInterface, HBaseRPCErrorHandler, ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); return new HServerLoad(requestCount.get(),(int)metrics.getRequests(), (int)(memory.getUsed() / 1024 / 1024), - (int) (memory.getMax() / 1024 / 1024), regionLoads); + (int) (memory.getMax() / 1024 / 1024), regionLoads, loadedCoprocessors); } String getOnlineRegionsAsPrintableString() { diff --git src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorEndpoint.java src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorEndpoint.java index a8f2a9c..a9a7fcb 100644 --- src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorEndpoint.java +++ src/test/java/org/apache/hadoop/hbase/coprocessor/TestCoprocessorEndpoint.java @@ -21,6 +21,7 @@ package org.apache.hadoop.hbase.coprocessor; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; import java.io.IOException; import java.util.Map; @@ -28,11 +29,13 @@ import java.util.Map; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.HServerLoad; import org.apache.hadoop.hbase.MiniHBaseCluster; import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.client.coprocessor.Batch; +import org.apache.hadoop.hbase.ServerName; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.io.Text; import org.junit.AfterClass; @@ -57,13 +60,17 @@ public class TestCoprocessorEndpoint { private static HBaseTestingUtility util = new HBaseTestingUtility(); private static MiniHBaseCluster cluster = null; + private static String coprocessor1 = + "org.apache.hadoop.hbase.coprocessor.ColumnAggregationEndpoint"; + private static String coprocessor2 = + "org.apache.hadoop.hbase.coprocessor.GenericEndpoint"; + @BeforeClass public static void setupBeforeClass() throws Exception { // set configure to indicate which cp should be loaded Configuration conf = util.getConfiguration(); conf.setStrings(CoprocessorHost.REGION_COPROCESSOR_CONF_KEY, - "org.apache.hadoop.hbase.coprocessor.ColumnAggregationEndpoint", - "org.apache.hadoop.hbase.coprocessor.GenericEndpoint"); + coprocessor1, coprocessor2); util.startMiniCluster(2); cluster = util.getMiniHBaseCluster(); @@ -166,6 +173,27 @@ public class TestCoprocessorEndpoint { assertEquals("Invalid result", sumResult, expectedResult); } + @Test + public void testServerManagerCoprocessorReport() { + // HBASE 4070: Improve region server metrics to report loaded coprocessors + // to master: verify that each regionserver is reporting the correct set of + // loaded coprocessors. + + // Allow either ordering: since this is a set, either order is ok. + // Note the space [ ] after the comma in both constant strings: + // must be present for success of this test. + final String loadedCoprocessorsOrder1 = + "[" + coprocessor1 + ", " + coprocessor2 + "]"; + final String loadedCoprocessorsOrder2 = + "[" + coprocessor2 + ", " + coprocessor1 + "]"; + for(Map.Entry server : + util.getMiniHBaseCluster().getMaster().getServerManager().getOnlineServers().entrySet()) { + String regionServerCoprocessors = server.getValue().getLoadedCoprocessors(); + assertTrue(regionServerCoprocessors.equals(loadedCoprocessorsOrder1) || + regionServerCoprocessors.equals(loadedCoprocessorsOrder2)); + } + } + private static byte[][] makeN(byte[] base, int n) { byte[][] ret = new byte[n][]; for (int i = 0; i < n; i++) {