You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by gi...@apache.org on 2018/05/08 14:48:10 UTC

[01/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Repository: hbase-site
Updated Branches:
  refs/heads/asf-site 8b3429d50 -> d70bb89e8


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html
index 84a0b52..845fa29 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html
@@ -71,198 +71,200 @@
 <span class="sourceLineNo">063</span>import org.junit.ClassRule;<a name="line.63"></a>
 <span class="sourceLineNo">064</span>import org.junit.Rule;<a name="line.64"></a>
 <span class="sourceLineNo">065</span>import org.junit.Test;<a name="line.65"></a>
-<span class="sourceLineNo">066</span>import org.junit.experimental.categories.Category;<a name="line.66"></a>
-<span class="sourceLineNo">067</span>import org.junit.rules.TestName;<a name="line.67"></a>
-<span class="sourceLineNo">068</span>import org.junit.runner.RunWith;<a name="line.68"></a>
-<span class="sourceLineNo">069</span>import org.junit.runners.Parameterized;<a name="line.69"></a>
-<span class="sourceLineNo">070</span>import org.junit.runners.Parameterized.Parameter;<a name="line.70"></a>
-<span class="sourceLineNo">071</span>import org.junit.runners.Parameterized.Parameters;<a name="line.71"></a>
-<span class="sourceLineNo">072</span><a name="line.72"></a>
-<span class="sourceLineNo">073</span>import org.apache.hbase.thirdparty.io.netty.channel.Channel;<a name="line.73"></a>
-<span class="sourceLineNo">074</span>import org.apache.hbase.thirdparty.io.netty.channel.EventLoop;<a name="line.74"></a>
-<span class="sourceLineNo">075</span>import org.apache.hbase.thirdparty.io.netty.channel.EventLoopGroup;<a name="line.75"></a>
-<span class="sourceLineNo">076</span>import org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoopGroup;<a name="line.76"></a>
-<span class="sourceLineNo">077</span>import org.apache.hbase.thirdparty.io.netty.channel.socket.nio.NioSocketChannel;<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>@RunWith(Parameterized.class)<a name="line.79"></a>
-<span class="sourceLineNo">080</span>@Category({ MiscTests.class, LargeTests.class })<a name="line.80"></a>
-<span class="sourceLineNo">081</span>public class TestSaslFanOutOneBlockAsyncDFSOutput {<a name="line.81"></a>
-<span class="sourceLineNo">082</span><a name="line.82"></a>
-<span class="sourceLineNo">083</span>  @ClassRule<a name="line.83"></a>
-<span class="sourceLineNo">084</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.84"></a>
-<span class="sourceLineNo">085</span>      HBaseClassTestRule.forClass(TestSaslFanOutOneBlockAsyncDFSOutput.class);<a name="line.85"></a>
-<span class="sourceLineNo">086</span><a name="line.86"></a>
-<span class="sourceLineNo">087</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.87"></a>
+<span class="sourceLineNo">066</span>import org.junit.Ignore;<a name="line.66"></a>
+<span class="sourceLineNo">067</span>import org.junit.experimental.categories.Category;<a name="line.67"></a>
+<span class="sourceLineNo">068</span>import org.junit.rules.TestName;<a name="line.68"></a>
+<span class="sourceLineNo">069</span>import org.junit.runner.RunWith;<a name="line.69"></a>
+<span class="sourceLineNo">070</span>import org.junit.runners.Parameterized;<a name="line.70"></a>
+<span class="sourceLineNo">071</span>import org.junit.runners.Parameterized.Parameter;<a name="line.71"></a>
+<span class="sourceLineNo">072</span>import org.junit.runners.Parameterized.Parameters;<a name="line.72"></a>
+<span class="sourceLineNo">073</span><a name="line.73"></a>
+<span class="sourceLineNo">074</span>import org.apache.hbase.thirdparty.io.netty.channel.Channel;<a name="line.74"></a>
+<span class="sourceLineNo">075</span>import org.apache.hbase.thirdparty.io.netty.channel.EventLoop;<a name="line.75"></a>
+<span class="sourceLineNo">076</span>import org.apache.hbase.thirdparty.io.netty.channel.EventLoopGroup;<a name="line.76"></a>
+<span class="sourceLineNo">077</span>import org.apache.hbase.thirdparty.io.netty.channel.nio.NioEventLoopGroup;<a name="line.77"></a>
+<span class="sourceLineNo">078</span>import org.apache.hbase.thirdparty.io.netty.channel.socket.nio.NioSocketChannel;<a name="line.78"></a>
+<span class="sourceLineNo">079</span><a name="line.79"></a>
+<span class="sourceLineNo">080</span>@RunWith(Parameterized.class)<a name="line.80"></a>
+<span class="sourceLineNo">081</span>@Category({ MiscTests.class, LargeTests.class })<a name="line.81"></a>
+<span class="sourceLineNo">082</span>@Ignore<a name="line.82"></a>
+<span class="sourceLineNo">083</span>public class TestSaslFanOutOneBlockAsyncDFSOutput {<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>  @ClassRule<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.86"></a>
+<span class="sourceLineNo">087</span>      HBaseClassTestRule.forClass(TestSaslFanOutOneBlockAsyncDFSOutput.class);<a name="line.87"></a>
 <span class="sourceLineNo">088</span><a name="line.88"></a>
-<span class="sourceLineNo">089</span>  private static DistributedFileSystem FS;<a name="line.89"></a>
+<span class="sourceLineNo">089</span>  private static final HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();<a name="line.89"></a>
 <span class="sourceLineNo">090</span><a name="line.90"></a>
-<span class="sourceLineNo">091</span>  private static EventLoopGroup EVENT_LOOP_GROUP;<a name="line.91"></a>
+<span class="sourceLineNo">091</span>  private static DistributedFileSystem FS;<a name="line.91"></a>
 <span class="sourceLineNo">092</span><a name="line.92"></a>
-<span class="sourceLineNo">093</span>  private static Class&lt;? extends Channel&gt; CHANNEL_CLASS;<a name="line.93"></a>
+<span class="sourceLineNo">093</span>  private static EventLoopGroup EVENT_LOOP_GROUP;<a name="line.93"></a>
 <span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  private static int READ_TIMEOUT_MS = 200000;<a name="line.95"></a>
+<span class="sourceLineNo">095</span>  private static Class&lt;? extends Channel&gt; CHANNEL_CLASS;<a name="line.95"></a>
 <span class="sourceLineNo">096</span><a name="line.96"></a>
-<span class="sourceLineNo">097</span>  private static final File KEYTAB_FILE =<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    new File(TEST_UTIL.getDataTestDir("keytab").toUri().getPath());<a name="line.98"></a>
-<span class="sourceLineNo">099</span><a name="line.99"></a>
-<span class="sourceLineNo">100</span>  private static MiniKdc KDC;<a name="line.100"></a>
+<span class="sourceLineNo">097</span>  private static int READ_TIMEOUT_MS = 200000;<a name="line.97"></a>
+<span class="sourceLineNo">098</span><a name="line.98"></a>
+<span class="sourceLineNo">099</span>  private static final File KEYTAB_FILE =<a name="line.99"></a>
+<span class="sourceLineNo">100</span>    new File(TEST_UTIL.getDataTestDir("keytab").toUri().getPath());<a name="line.100"></a>
 <span class="sourceLineNo">101</span><a name="line.101"></a>
-<span class="sourceLineNo">102</span>  private static String HOST = "localhost";<a name="line.102"></a>
+<span class="sourceLineNo">102</span>  private static MiniKdc KDC;<a name="line.102"></a>
 <span class="sourceLineNo">103</span><a name="line.103"></a>
-<span class="sourceLineNo">104</span>  private static String USERNAME;<a name="line.104"></a>
+<span class="sourceLineNo">104</span>  private static String HOST = "localhost";<a name="line.104"></a>
 <span class="sourceLineNo">105</span><a name="line.105"></a>
-<span class="sourceLineNo">106</span>  private static String PRINCIPAL;<a name="line.106"></a>
+<span class="sourceLineNo">106</span>  private static String USERNAME;<a name="line.106"></a>
 <span class="sourceLineNo">107</span><a name="line.107"></a>
-<span class="sourceLineNo">108</span>  private static String HTTP_PRINCIPAL;<a name="line.108"></a>
+<span class="sourceLineNo">108</span>  private static String PRINCIPAL;<a name="line.108"></a>
 <span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  private static String TEST_KEY_NAME = "test_key";<a name="line.110"></a>
+<span class="sourceLineNo">110</span>  private static String HTTP_PRINCIPAL;<a name="line.110"></a>
 <span class="sourceLineNo">111</span><a name="line.111"></a>
-<span class="sourceLineNo">112</span>  @Rule<a name="line.112"></a>
-<span class="sourceLineNo">113</span>  public TestName name = new TestName();<a name="line.113"></a>
-<span class="sourceLineNo">114</span><a name="line.114"></a>
-<span class="sourceLineNo">115</span>  @Parameter(0)<a name="line.115"></a>
-<span class="sourceLineNo">116</span>  public String protection;<a name="line.116"></a>
-<span class="sourceLineNo">117</span><a name="line.117"></a>
-<span class="sourceLineNo">118</span>  @Parameter(1)<a name="line.118"></a>
-<span class="sourceLineNo">119</span>  public String encryptionAlgorithm;<a name="line.119"></a>
-<span class="sourceLineNo">120</span><a name="line.120"></a>
-<span class="sourceLineNo">121</span>  @Parameter(2)<a name="line.121"></a>
-<span class="sourceLineNo">122</span>  public String cipherSuite;<a name="line.122"></a>
-<span class="sourceLineNo">123</span><a name="line.123"></a>
-<span class="sourceLineNo">124</span>  @Parameters(name = "{index}: protection={0}, encryption={1}, cipherSuite={2}")<a name="line.124"></a>
-<span class="sourceLineNo">125</span>  public static Iterable&lt;Object[]&gt; data() {<a name="line.125"></a>
-<span class="sourceLineNo">126</span>    List&lt;Object[]&gt; params = new ArrayList&lt;&gt;();<a name="line.126"></a>
-<span class="sourceLineNo">127</span>    for (String protection : Arrays.asList("authentication", "integrity", "privacy")) {<a name="line.127"></a>
-<span class="sourceLineNo">128</span>      for (String encryptionAlgorithm : Arrays.asList("", "3des", "rc4")) {<a name="line.128"></a>
-<span class="sourceLineNo">129</span>        for (String cipherSuite : Arrays.asList("", CipherSuite.AES_CTR_NOPADDING.getName())) {<a name="line.129"></a>
-<span class="sourceLineNo">130</span>          params.add(new Object[] { protection, encryptionAlgorithm, cipherSuite });<a name="line.130"></a>
-<span class="sourceLineNo">131</span>        }<a name="line.131"></a>
-<span class="sourceLineNo">132</span>      }<a name="line.132"></a>
-<span class="sourceLineNo">133</span>    }<a name="line.133"></a>
-<span class="sourceLineNo">134</span>    return params;<a name="line.134"></a>
-<span class="sourceLineNo">135</span>  }<a name="line.135"></a>
-<span class="sourceLineNo">136</span><a name="line.136"></a>
-<span class="sourceLineNo">137</span>  private static void setHdfsSecuredConfiguration(Configuration conf) throws Exception {<a name="line.137"></a>
-<span class="sourceLineNo">138</span>    conf.set(DFS_NAMENODE_KERBEROS_PRINCIPAL_KEY, PRINCIPAL + "@" + KDC.getRealm());<a name="line.138"></a>
-<span class="sourceLineNo">139</span>    conf.set(DFS_NAMENODE_KEYTAB_FILE_KEY, KEYTAB_FILE.getAbsolutePath());<a name="line.139"></a>
-<span class="sourceLineNo">140</span>    conf.set(DFS_DATANODE_KERBEROS_PRINCIPAL_KEY, PRINCIPAL + "@" + KDC.getRealm());<a name="line.140"></a>
-<span class="sourceLineNo">141</span>    conf.set(DFS_DATANODE_KEYTAB_FILE_KEY, KEYTAB_FILE.getAbsolutePath());<a name="line.141"></a>
-<span class="sourceLineNo">142</span>    conf.set(DFS_WEB_AUTHENTICATION_KERBEROS_PRINCIPAL_KEY, HTTP_PRINCIPAL + "@" + KDC.getRealm());<a name="line.142"></a>
-<span class="sourceLineNo">143</span>    conf.setBoolean(DFS_BLOCK_ACCESS_TOKEN_ENABLE_KEY, true);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>    conf.set(DFS_HTTP_POLICY_KEY, HttpConfig.Policy.HTTPS_ONLY.name());<a name="line.144"></a>
-<span class="sourceLineNo">145</span>    conf.set(DFS_NAMENODE_HTTPS_ADDRESS_KEY, "localhost:0");<a name="line.145"></a>
-<span class="sourceLineNo">146</span>    conf.set(DFS_DATANODE_HTTPS_ADDRESS_KEY, "localhost:0");<a name="line.146"></a>
-<span class="sourceLineNo">147</span><a name="line.147"></a>
-<span class="sourceLineNo">148</span>    File keystoresDir = new File(TEST_UTIL.getDataTestDir("keystore").toUri().getPath());<a name="line.148"></a>
-<span class="sourceLineNo">149</span>    keystoresDir.mkdirs();<a name="line.149"></a>
-<span class="sourceLineNo">150</span>    String sslConfDir = KeyStoreTestUtil.getClasspathDir(TestGenerateDelegationToken.class);<a name="line.150"></a>
-<span class="sourceLineNo">151</span>    KeyStoreTestUtil.setupSSLConfig(keystoresDir.getAbsolutePath(), sslConfDir, conf, false);<a name="line.151"></a>
-<span class="sourceLineNo">152</span><a name="line.152"></a>
-<span class="sourceLineNo">153</span>    conf.setBoolean("ignore.secure.ports.for.testing", true);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  }<a name="line.154"></a>
-<span class="sourceLineNo">155</span><a name="line.155"></a>
-<span class="sourceLineNo">156</span>  private static void setUpKeyProvider(Configuration conf) throws Exception {<a name="line.156"></a>
-<span class="sourceLineNo">157</span>    URI keyProviderUri =<a name="line.157"></a>
-<span class="sourceLineNo">158</span>      new URI("jceks://file" + TEST_UTIL.getDataTestDir("test.jks").toUri().toString());<a name="line.158"></a>
-<span class="sourceLineNo">159</span>    conf.set("dfs.encryption.key.provider.uri", keyProviderUri.toString());<a name="line.159"></a>
-<span class="sourceLineNo">160</span>    KeyProvider keyProvider = KeyProviderFactory.get(keyProviderUri, conf);<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    keyProvider.createKey(TEST_KEY_NAME, KeyProvider.options(conf));<a name="line.161"></a>
-<span class="sourceLineNo">162</span>    keyProvider.flush();<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    keyProvider.close();<a name="line.163"></a>
-<span class="sourceLineNo">164</span>  }<a name="line.164"></a>
-<span class="sourceLineNo">165</span><a name="line.165"></a>
-<span class="sourceLineNo">166</span>  @BeforeClass<a name="line.166"></a>
-<span class="sourceLineNo">167</span>  public static void setUpBeforeClass() throws Exception {<a name="line.167"></a>
-<span class="sourceLineNo">168</span>    EVENT_LOOP_GROUP = new NioEventLoopGroup();<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    CHANNEL_CLASS = NioSocketChannel.class;<a name="line.169"></a>
-<span class="sourceLineNo">170</span>    TEST_UTIL.getConfiguration().setInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT_MS);<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    KDC = TEST_UTIL.setupMiniKdc(KEYTAB_FILE);<a name="line.171"></a>
-<span class="sourceLineNo">172</span>    USERNAME = UserGroupInformation.getLoginUser().getShortUserName();<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    PRINCIPAL = USERNAME + "/" + HOST;<a name="line.173"></a>
-<span class="sourceLineNo">174</span>    HTTP_PRINCIPAL = "HTTP/" + HOST;<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    KDC.createPrincipal(KEYTAB_FILE, PRINCIPAL, HTTP_PRINCIPAL);<a name="line.175"></a>
-<span class="sourceLineNo">176</span><a name="line.176"></a>
-<span class="sourceLineNo">177</span>    setUpKeyProvider(TEST_UTIL.getConfiguration());<a name="line.177"></a>
-<span class="sourceLineNo">178</span>    setHdfsSecuredConfiguration(TEST_UTIL.getConfiguration());<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    HBaseKerberosUtils.setPrincipalForTesting(PRINCIPAL + "@" + KDC.getRealm());<a name="line.179"></a>
-<span class="sourceLineNo">180</span>    HBaseKerberosUtils.setSecuredConfiguration(TEST_UTIL.getConfiguration());<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    UserGroupInformation.setConfiguration(TEST_UTIL.getConfiguration());<a name="line.181"></a>
-<span class="sourceLineNo">182</span>  }<a name="line.182"></a>
-<span class="sourceLineNo">183</span><a name="line.183"></a>
-<span class="sourceLineNo">184</span>  @AfterClass<a name="line.184"></a>
-<span class="sourceLineNo">185</span>  public static void tearDownAfterClass() throws IOException, InterruptedException {<a name="line.185"></a>
-<span class="sourceLineNo">186</span>    if (EVENT_LOOP_GROUP != null) {<a name="line.186"></a>
-<span class="sourceLineNo">187</span>      EVENT_LOOP_GROUP.shutdownGracefully().sync();<a name="line.187"></a>
-<span class="sourceLineNo">188</span>    }<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    if (KDC != null) {<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      KDC.stop();<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    }<a name="line.191"></a>
-<span class="sourceLineNo">192</span>  }<a name="line.192"></a>
-<span class="sourceLineNo">193</span><a name="line.193"></a>
-<span class="sourceLineNo">194</span>  private Path testDirOnTestFs;<a name="line.194"></a>
+<span class="sourceLineNo">112</span>  private static String TEST_KEY_NAME = "test_key";<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  @Rule<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public TestName name = new TestName();<a name="line.115"></a>
+<span class="sourceLineNo">116</span><a name="line.116"></a>
+<span class="sourceLineNo">117</span>  @Parameter(0)<a name="line.117"></a>
+<span class="sourceLineNo">118</span>  public String protection;<a name="line.118"></a>
+<span class="sourceLineNo">119</span><a name="line.119"></a>
+<span class="sourceLineNo">120</span>  @Parameter(1)<a name="line.120"></a>
+<span class="sourceLineNo">121</span>  public String encryptionAlgorithm;<a name="line.121"></a>
+<span class="sourceLineNo">122</span><a name="line.122"></a>
+<span class="sourceLineNo">123</span>  @Parameter(2)<a name="line.123"></a>
+<span class="sourceLineNo">124</span>  public String cipherSuite;<a name="line.124"></a>
+<span class="sourceLineNo">125</span><a name="line.125"></a>
+<span class="sourceLineNo">126</span>  @Parameters(name = "{index}: protection={0}, encryption={1}, cipherSuite={2}")<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  public static Iterable&lt;Object[]&gt; data() {<a name="line.127"></a>
+<span class="sourceLineNo">128</span>    List&lt;Object[]&gt; params = new ArrayList&lt;&gt;();<a name="line.128"></a>
+<span class="sourceLineNo">129</span>    for (String protection : Arrays.asList("authentication", "integrity", "privacy")) {<a name="line.129"></a>
+<span class="sourceLineNo">130</span>      for (String encryptionAlgorithm : Arrays.asList("", "3des", "rc4")) {<a name="line.130"></a>
+<span class="sourceLineNo">131</span>        for (String cipherSuite : Arrays.asList("", CipherSuite.AES_CTR_NOPADDING.getName())) {<a name="line.131"></a>
+<span class="sourceLineNo">132</span>          params.add(new Object[] { protection, encryptionAlgorithm, cipherSuite });<a name="line.132"></a>
+<span class="sourceLineNo">133</span>        }<a name="line.133"></a>
+<span class="sourceLineNo">134</span>      }<a name="line.134"></a>
+<span class="sourceLineNo">135</span>    }<a name="line.135"></a>
+<span class="sourceLineNo">136</span>    return params;<a name="line.136"></a>
+<span class="sourceLineNo">137</span>  }<a name="line.137"></a>
+<span class="sourceLineNo">138</span><a name="line.138"></a>
+<span class="sourceLineNo">139</span>  private static void setHdfsSecuredConfiguration(Configuration conf) throws Exception {<a name="line.139"></a>
+<span class="sourceLineNo">140</span>    conf.set(DFS_NAMENODE_KERBEROS_PRINCIPAL_KEY, PRINCIPAL + "@" + KDC.getRealm());<a name="line.140"></a>
+<span class="sourceLineNo">141</span>    conf.set(DFS_NAMENODE_KEYTAB_FILE_KEY, KEYTAB_FILE.getAbsolutePath());<a name="line.141"></a>
+<span class="sourceLineNo">142</span>    conf.set(DFS_DATANODE_KERBEROS_PRINCIPAL_KEY, PRINCIPAL + "@" + KDC.getRealm());<a name="line.142"></a>
+<span class="sourceLineNo">143</span>    conf.set(DFS_DATANODE_KEYTAB_FILE_KEY, KEYTAB_FILE.getAbsolutePath());<a name="line.143"></a>
+<span class="sourceLineNo">144</span>    conf.set(DFS_WEB_AUTHENTICATION_KERBEROS_PRINCIPAL_KEY, HTTP_PRINCIPAL + "@" + KDC.getRealm());<a name="line.144"></a>
+<span class="sourceLineNo">145</span>    conf.setBoolean(DFS_BLOCK_ACCESS_TOKEN_ENABLE_KEY, true);<a name="line.145"></a>
+<span class="sourceLineNo">146</span>    conf.set(DFS_HTTP_POLICY_KEY, HttpConfig.Policy.HTTPS_ONLY.name());<a name="line.146"></a>
+<span class="sourceLineNo">147</span>    conf.set(DFS_NAMENODE_HTTPS_ADDRESS_KEY, "localhost:0");<a name="line.147"></a>
+<span class="sourceLineNo">148</span>    conf.set(DFS_DATANODE_HTTPS_ADDRESS_KEY, "localhost:0");<a name="line.148"></a>
+<span class="sourceLineNo">149</span><a name="line.149"></a>
+<span class="sourceLineNo">150</span>    File keystoresDir = new File(TEST_UTIL.getDataTestDir("keystore").toUri().getPath());<a name="line.150"></a>
+<span class="sourceLineNo">151</span>    keystoresDir.mkdirs();<a name="line.151"></a>
+<span class="sourceLineNo">152</span>    String sslConfDir = KeyStoreTestUtil.getClasspathDir(TestGenerateDelegationToken.class);<a name="line.152"></a>
+<span class="sourceLineNo">153</span>    KeyStoreTestUtil.setupSSLConfig(keystoresDir.getAbsolutePath(), sslConfDir, conf, false);<a name="line.153"></a>
+<span class="sourceLineNo">154</span><a name="line.154"></a>
+<span class="sourceLineNo">155</span>    conf.setBoolean("ignore.secure.ports.for.testing", true);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  }<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static void setUpKeyProvider(Configuration conf) throws Exception {<a name="line.158"></a>
+<span class="sourceLineNo">159</span>    URI keyProviderUri =<a name="line.159"></a>
+<span class="sourceLineNo">160</span>      new URI("jceks://file" + TEST_UTIL.getDataTestDir("test.jks").toUri().toString());<a name="line.160"></a>
+<span class="sourceLineNo">161</span>    conf.set("dfs.encryption.key.provider.uri", keyProviderUri.toString());<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    KeyProvider keyProvider = KeyProviderFactory.get(keyProviderUri, conf);<a name="line.162"></a>
+<span class="sourceLineNo">163</span>    keyProvider.createKey(TEST_KEY_NAME, KeyProvider.options(conf));<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    keyProvider.flush();<a name="line.164"></a>
+<span class="sourceLineNo">165</span>    keyProvider.close();<a name="line.165"></a>
+<span class="sourceLineNo">166</span>  }<a name="line.166"></a>
+<span class="sourceLineNo">167</span><a name="line.167"></a>
+<span class="sourceLineNo">168</span>  @BeforeClass<a name="line.168"></a>
+<span class="sourceLineNo">169</span>  public static void setUpBeforeClass() throws Exception {<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    EVENT_LOOP_GROUP = new NioEventLoopGroup();<a name="line.170"></a>
+<span class="sourceLineNo">171</span>    CHANNEL_CLASS = NioSocketChannel.class;<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    TEST_UTIL.getConfiguration().setInt(DFS_CLIENT_SOCKET_TIMEOUT_KEY, READ_TIMEOUT_MS);<a name="line.172"></a>
+<span class="sourceLineNo">173</span>    KDC = TEST_UTIL.setupMiniKdc(KEYTAB_FILE);<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    USERNAME = UserGroupInformation.getLoginUser().getShortUserName();<a name="line.174"></a>
+<span class="sourceLineNo">175</span>    PRINCIPAL = USERNAME + "/" + HOST;<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    HTTP_PRINCIPAL = "HTTP/" + HOST;<a name="line.176"></a>
+<span class="sourceLineNo">177</span>    KDC.createPrincipal(KEYTAB_FILE, PRINCIPAL, HTTP_PRINCIPAL);<a name="line.177"></a>
+<span class="sourceLineNo">178</span><a name="line.178"></a>
+<span class="sourceLineNo">179</span>    setUpKeyProvider(TEST_UTIL.getConfiguration());<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    setHdfsSecuredConfiguration(TEST_UTIL.getConfiguration());<a name="line.180"></a>
+<span class="sourceLineNo">181</span>    HBaseKerberosUtils.setPrincipalForTesting(PRINCIPAL + "@" + KDC.getRealm());<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    HBaseKerberosUtils.setSecuredConfiguration(TEST_UTIL.getConfiguration());<a name="line.182"></a>
+<span class="sourceLineNo">183</span>    UserGroupInformation.setConfiguration(TEST_UTIL.getConfiguration());<a name="line.183"></a>
+<span class="sourceLineNo">184</span>  }<a name="line.184"></a>
+<span class="sourceLineNo">185</span><a name="line.185"></a>
+<span class="sourceLineNo">186</span>  @AfterClass<a name="line.186"></a>
+<span class="sourceLineNo">187</span>  public static void tearDownAfterClass() throws IOException, InterruptedException {<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    if (EVENT_LOOP_GROUP != null) {<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      EVENT_LOOP_GROUP.shutdownGracefully().sync();<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    }<a name="line.190"></a>
+<span class="sourceLineNo">191</span>    if (KDC != null) {<a name="line.191"></a>
+<span class="sourceLineNo">192</span>      KDC.stop();<a name="line.192"></a>
+<span class="sourceLineNo">193</span>    }<a name="line.193"></a>
+<span class="sourceLineNo">194</span>  }<a name="line.194"></a>
 <span class="sourceLineNo">195</span><a name="line.195"></a>
-<span class="sourceLineNo">196</span>  private Path entryptionTestDirOnTestFs;<a name="line.196"></a>
+<span class="sourceLineNo">196</span>  private Path testDirOnTestFs;<a name="line.196"></a>
 <span class="sourceLineNo">197</span><a name="line.197"></a>
-<span class="sourceLineNo">198</span>  private void createEncryptionZone() throws Exception {<a name="line.198"></a>
-<span class="sourceLineNo">199</span>    Method method =<a name="line.199"></a>
-<span class="sourceLineNo">200</span>      DistributedFileSystem.class.getMethod("createEncryptionZone", Path.class, String.class);<a name="line.200"></a>
-<span class="sourceLineNo">201</span>    method.invoke(FS, entryptionTestDirOnTestFs, TEST_KEY_NAME);<a name="line.201"></a>
-<span class="sourceLineNo">202</span>  }<a name="line.202"></a>
-<span class="sourceLineNo">203</span><a name="line.203"></a>
-<span class="sourceLineNo">204</span>  @Before<a name="line.204"></a>
-<span class="sourceLineNo">205</span>  public void setUp() throws Exception {<a name="line.205"></a>
-<span class="sourceLineNo">206</span>    TEST_UTIL.getConfiguration().set("dfs.data.transfer.protection", protection);<a name="line.206"></a>
-<span class="sourceLineNo">207</span>    if (StringUtils.isBlank(encryptionAlgorithm) &amp;&amp; StringUtils.isBlank(cipherSuite)) {<a name="line.207"></a>
-<span class="sourceLineNo">208</span>      TEST_UTIL.getConfiguration().setBoolean(DFS_ENCRYPT_DATA_TRANSFER_KEY, false);<a name="line.208"></a>
-<span class="sourceLineNo">209</span>    } else {<a name="line.209"></a>
-<span class="sourceLineNo">210</span>      TEST_UTIL.getConfiguration().setBoolean(DFS_ENCRYPT_DATA_TRANSFER_KEY, true);<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    }<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    if (StringUtils.isBlank(encryptionAlgorithm)) {<a name="line.212"></a>
-<span class="sourceLineNo">213</span>      TEST_UTIL.getConfiguration().unset(DFS_DATA_ENCRYPTION_ALGORITHM_KEY);<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    } else {<a name="line.214"></a>
-<span class="sourceLineNo">215</span>      TEST_UTIL.getConfiguration().set(DFS_DATA_ENCRYPTION_ALGORITHM_KEY, encryptionAlgorithm);<a name="line.215"></a>
-<span class="sourceLineNo">216</span>    }<a name="line.216"></a>
-<span class="sourceLineNo">217</span>    if (StringUtils.isBlank(cipherSuite)) {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>      TEST_UTIL.getConfiguration().unset(DFS_ENCRYPT_DATA_TRANSFER_CIPHER_SUITES_KEY);<a name="line.218"></a>
-<span class="sourceLineNo">219</span>    } else {<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      TEST_UTIL.getConfiguration().set(DFS_ENCRYPT_DATA_TRANSFER_CIPHER_SUITES_KEY, cipherSuite);<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    TEST_UTIL.startMiniDFSCluster(3);<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    FS = TEST_UTIL.getDFSCluster().getFileSystem();<a name="line.224"></a>
-<span class="sourceLineNo">225</span>    testDirOnTestFs = new Path("/" + name.getMethodName().replaceAll("[^0-9a-zA-Z]", "_"));<a name="line.225"></a>
-<span class="sourceLineNo">226</span>    FS.mkdirs(testDirOnTestFs);<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    entryptionTestDirOnTestFs = new Path("/" + testDirOnTestFs.getName() + "_enc");<a name="line.227"></a>
-<span class="sourceLineNo">228</span>    FS.mkdirs(entryptionTestDirOnTestFs);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    createEncryptionZone();<a name="line.229"></a>
-<span class="sourceLineNo">230</span>  }<a name="line.230"></a>
-<span class="sourceLineNo">231</span><a name="line.231"></a>
-<span class="sourceLineNo">232</span>  @After<a name="line.232"></a>
-<span class="sourceLineNo">233</span>  public void tearDown() throws IOException {<a name="line.233"></a>
-<span class="sourceLineNo">234</span>    TEST_UTIL.shutdownMiniDFSCluster();<a name="line.234"></a>
-<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
-<span class="sourceLineNo">236</span><a name="line.236"></a>
-<span class="sourceLineNo">237</span>  private Path getTestFile() {<a name="line.237"></a>
-<span class="sourceLineNo">238</span>    return new Path(testDirOnTestFs, "test");<a name="line.238"></a>
-<span class="sourceLineNo">239</span>  }<a name="line.239"></a>
-<span class="sourceLineNo">240</span><a name="line.240"></a>
-<span class="sourceLineNo">241</span>  private Path getEncryptionTestFile() {<a name="line.241"></a>
-<span class="sourceLineNo">242</span>    return new Path(entryptionTestDirOnTestFs, "test");<a name="line.242"></a>
-<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
-<span class="sourceLineNo">244</span><a name="line.244"></a>
-<span class="sourceLineNo">245</span>  private void test(Path file) throws IOException, InterruptedException, ExecutionException {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    EventLoop eventLoop = EVENT_LOOP_GROUP.next();<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    FanOutOneBlockAsyncDFSOutput out = FanOutOneBlockAsyncDFSOutputHelper.createOutput(FS, file,<a name="line.247"></a>
-<span class="sourceLineNo">248</span>      true, false, (short) 3, FS.getDefaultBlockSize(), eventLoop, CHANNEL_CLASS);<a name="line.248"></a>
-<span class="sourceLineNo">249</span>    TestFanOutOneBlockAsyncDFSOutput.writeAndVerify(FS, file, out);<a name="line.249"></a>
-<span class="sourceLineNo">250</span>  }<a name="line.250"></a>
-<span class="sourceLineNo">251</span><a name="line.251"></a>
-<span class="sourceLineNo">252</span>  @Test<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  public void test() throws IOException, InterruptedException, ExecutionException {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    test(getTestFile());<a name="line.254"></a>
-<span class="sourceLineNo">255</span>    test(getEncryptionTestFile());<a name="line.255"></a>
-<span class="sourceLineNo">256</span>  }<a name="line.256"></a>
-<span class="sourceLineNo">257</span>}<a name="line.257"></a>
+<span class="sourceLineNo">198</span>  private Path entryptionTestDirOnTestFs;<a name="line.198"></a>
+<span class="sourceLineNo">199</span><a name="line.199"></a>
+<span class="sourceLineNo">200</span>  private void createEncryptionZone() throws Exception {<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    Method method =<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      DistributedFileSystem.class.getMethod("createEncryptionZone", Path.class, String.class);<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    method.invoke(FS, entryptionTestDirOnTestFs, TEST_KEY_NAME);<a name="line.203"></a>
+<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
+<span class="sourceLineNo">205</span><a name="line.205"></a>
+<span class="sourceLineNo">206</span>  @Before<a name="line.206"></a>
+<span class="sourceLineNo">207</span>  public void setUp() throws Exception {<a name="line.207"></a>
+<span class="sourceLineNo">208</span>    TEST_UTIL.getConfiguration().set("dfs.data.transfer.protection", protection);<a name="line.208"></a>
+<span class="sourceLineNo">209</span>    if (StringUtils.isBlank(encryptionAlgorithm) &amp;&amp; StringUtils.isBlank(cipherSuite)) {<a name="line.209"></a>
+<span class="sourceLineNo">210</span>      TEST_UTIL.getConfiguration().setBoolean(DFS_ENCRYPT_DATA_TRANSFER_KEY, false);<a name="line.210"></a>
+<span class="sourceLineNo">211</span>    } else {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>      TEST_UTIL.getConfiguration().setBoolean(DFS_ENCRYPT_DATA_TRANSFER_KEY, true);<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    }<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    if (StringUtils.isBlank(encryptionAlgorithm)) {<a name="line.214"></a>
+<span class="sourceLineNo">215</span>      TEST_UTIL.getConfiguration().unset(DFS_DATA_ENCRYPTION_ALGORITHM_KEY);<a name="line.215"></a>
+<span class="sourceLineNo">216</span>    } else {<a name="line.216"></a>
+<span class="sourceLineNo">217</span>      TEST_UTIL.getConfiguration().set(DFS_DATA_ENCRYPTION_ALGORITHM_KEY, encryptionAlgorithm);<a name="line.217"></a>
+<span class="sourceLineNo">218</span>    }<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    if (StringUtils.isBlank(cipherSuite)) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      TEST_UTIL.getConfiguration().unset(DFS_ENCRYPT_DATA_TRANSFER_CIPHER_SUITES_KEY);<a name="line.220"></a>
+<span class="sourceLineNo">221</span>    } else {<a name="line.221"></a>
+<span class="sourceLineNo">222</span>      TEST_UTIL.getConfiguration().set(DFS_ENCRYPT_DATA_TRANSFER_CIPHER_SUITES_KEY, cipherSuite);<a name="line.222"></a>
+<span class="sourceLineNo">223</span>    }<a name="line.223"></a>
+<span class="sourceLineNo">224</span><a name="line.224"></a>
+<span class="sourceLineNo">225</span>    TEST_UTIL.startMiniDFSCluster(3);<a name="line.225"></a>
+<span class="sourceLineNo">226</span>    FS = TEST_UTIL.getDFSCluster().getFileSystem();<a name="line.226"></a>
+<span class="sourceLineNo">227</span>    testDirOnTestFs = new Path("/" + name.getMethodName().replaceAll("[^0-9a-zA-Z]", "_"));<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    FS.mkdirs(testDirOnTestFs);<a name="line.228"></a>
+<span class="sourceLineNo">229</span>    entryptionTestDirOnTestFs = new Path("/" + testDirOnTestFs.getName() + "_enc");<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    FS.mkdirs(entryptionTestDirOnTestFs);<a name="line.230"></a>
+<span class="sourceLineNo">231</span>    createEncryptionZone();<a name="line.231"></a>
+<span class="sourceLineNo">232</span>  }<a name="line.232"></a>
+<span class="sourceLineNo">233</span><a name="line.233"></a>
+<span class="sourceLineNo">234</span>  @After<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  public void tearDown() throws IOException {<a name="line.235"></a>
+<span class="sourceLineNo">236</span>    TEST_UTIL.shutdownMiniDFSCluster();<a name="line.236"></a>
+<span class="sourceLineNo">237</span>  }<a name="line.237"></a>
+<span class="sourceLineNo">238</span><a name="line.238"></a>
+<span class="sourceLineNo">239</span>  private Path getTestFile() {<a name="line.239"></a>
+<span class="sourceLineNo">240</span>    return new Path(testDirOnTestFs, "test");<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  }<a name="line.241"></a>
+<span class="sourceLineNo">242</span><a name="line.242"></a>
+<span class="sourceLineNo">243</span>  private Path getEncryptionTestFile() {<a name="line.243"></a>
+<span class="sourceLineNo">244</span>    return new Path(entryptionTestDirOnTestFs, "test");<a name="line.244"></a>
+<span class="sourceLineNo">245</span>  }<a name="line.245"></a>
+<span class="sourceLineNo">246</span><a name="line.246"></a>
+<span class="sourceLineNo">247</span>  private void test(Path file) throws IOException, InterruptedException, ExecutionException {<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    EventLoop eventLoop = EVENT_LOOP_GROUP.next();<a name="line.248"></a>
+<span class="sourceLineNo">249</span>    FanOutOneBlockAsyncDFSOutput out = FanOutOneBlockAsyncDFSOutputHelper.createOutput(FS, file,<a name="line.249"></a>
+<span class="sourceLineNo">250</span>      true, false, (short) 3, FS.getDefaultBlockSize(), eventLoop, CHANNEL_CLASS);<a name="line.250"></a>
+<span class="sourceLineNo">251</span>    TestFanOutOneBlockAsyncDFSOutput.writeAndVerify(FS, file, out);<a name="line.251"></a>
+<span class="sourceLineNo">252</span>  }<a name="line.252"></a>
+<span class="sourceLineNo">253</span><a name="line.253"></a>
+<span class="sourceLineNo">254</span>  @Test<a name="line.254"></a>
+<span class="sourceLineNo">255</span>  public void test() throws IOException, InterruptedException, ExecutionException {<a name="line.255"></a>
+<span class="sourceLineNo">256</span>    test(getTestFile());<a name="line.256"></a>
+<span class="sourceLineNo">257</span>    test(getEncryptionTestFile());<a name="line.257"></a>
+<span class="sourceLineNo">258</span>  }<a name="line.258"></a>
+<span class="sourceLineNo">259</span>}<a name="line.259"></a>
 
 
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html
index 7baee4e..1505583 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html
@@ -32,105 +32,108 @@
 <span class="sourceLineNo">024</span>import org.apache.hadoop.hbase.HBaseConfiguration;<a name="line.24"></a>
 <span class="sourceLineNo">025</span>import org.apache.hadoop.hbase.io.util.MemorySizeUtil;<a name="line.25"></a>
 <span class="sourceLineNo">026</span>import org.apache.hadoop.hbase.testclassification.SmallTests;<a name="line.26"></a>
-<span class="sourceLineNo">027</span>import org.junit.ClassRule;<a name="line.27"></a>
-<span class="sourceLineNo">028</span>import org.junit.Test;<a name="line.28"></a>
-<span class="sourceLineNo">029</span>import org.junit.experimental.categories.Category;<a name="line.29"></a>
-<span class="sourceLineNo">030</span><a name="line.30"></a>
-<span class="sourceLineNo">031</span>@Category(SmallTests.class)<a name="line.31"></a>
-<span class="sourceLineNo">032</span>public class TestRegionServerAccounting {<a name="line.32"></a>
-<span class="sourceLineNo">033</span><a name="line.33"></a>
-<span class="sourceLineNo">034</span>  @ClassRule<a name="line.34"></a>
-<span class="sourceLineNo">035</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.35"></a>
-<span class="sourceLineNo">036</span>      HBaseClassTestRule.forClass(TestRegionServerAccounting.class);<a name="line.36"></a>
-<span class="sourceLineNo">037</span><a name="line.37"></a>
-<span class="sourceLineNo">038</span>  @Test<a name="line.38"></a>
-<span class="sourceLineNo">039</span>  public void testOnheapMemstoreHigherWaterMarkLimits() {<a name="line.39"></a>
-<span class="sourceLineNo">040</span>    Configuration conf = HBaseConfiguration.create();<a name="line.40"></a>
-<span class="sourceLineNo">041</span>    conf.setFloat(MemorySizeUtil.MEMSTORE_SIZE_KEY, 0.2f);<a name="line.41"></a>
-<span class="sourceLineNo">042</span>    // try for default cases<a name="line.42"></a>
-<span class="sourceLineNo">043</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.43"></a>
-<span class="sourceLineNo">044</span>    MemStoreSize memstoreSize =<a name="line.44"></a>
-<span class="sourceLineNo">045</span>        new MemStoreSize((3L * 1024L * 1024L * 1024L), (1L * 1024L * 1024L * 1024L), 0);<a name="line.45"></a>
-<span class="sourceLineNo">046</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.46"></a>
-<span class="sourceLineNo">047</span>    assertEquals(FlushType.ABOVE_ONHEAP_HIGHER_MARK,<a name="line.47"></a>
-<span class="sourceLineNo">048</span>      regionServerAccounting.isAboveHighWaterMark());<a name="line.48"></a>
-<span class="sourceLineNo">049</span>  }<a name="line.49"></a>
-<span class="sourceLineNo">050</span><a name="line.50"></a>
-<span class="sourceLineNo">051</span>  @Test<a name="line.51"></a>
-<span class="sourceLineNo">052</span>  public void testOnheapMemstoreLowerWaterMarkLimits() {<a name="line.52"></a>
-<span class="sourceLineNo">053</span>    Configuration conf = HBaseConfiguration.create();<a name="line.53"></a>
-<span class="sourceLineNo">054</span>    conf.setFloat(MemorySizeUtil.MEMSTORE_SIZE_KEY, 0.2f);<a name="line.54"></a>
-<span class="sourceLineNo">055</span>    // try for default cases<a name="line.55"></a>
-<span class="sourceLineNo">056</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.56"></a>
-<span class="sourceLineNo">057</span>    MemStoreSize memstoreSize =<a name="line.57"></a>
-<span class="sourceLineNo">058</span>        new MemStoreSize((3L * 1024L * 1024L * 1024L), (1L * 1024L * 1024L * 1024L), 0);<a name="line.58"></a>
-<span class="sourceLineNo">059</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.59"></a>
-<span class="sourceLineNo">060</span>    assertEquals(FlushType.ABOVE_ONHEAP_LOWER_MARK,<a name="line.60"></a>
-<span class="sourceLineNo">061</span>      regionServerAccounting.isAboveLowWaterMark());<a name="line.61"></a>
-<span class="sourceLineNo">062</span>  }<a name="line.62"></a>
-<span class="sourceLineNo">063</span><a name="line.63"></a>
-<span class="sourceLineNo">064</span>  @Test<a name="line.64"></a>
-<span class="sourceLineNo">065</span>  public void testOffheapMemstoreHigherWaterMarkLimitsDueToDataSize() {<a name="line.65"></a>
-<span class="sourceLineNo">066</span>    Configuration conf = HBaseConfiguration.create();<a name="line.66"></a>
-<span class="sourceLineNo">067</span>    // setting 1G as offheap data size<a name="line.67"></a>
-<span class="sourceLineNo">068</span>    conf.setLong(MemorySizeUtil.OFFHEAP_MEMSTORE_SIZE_KEY, (1L * 1024L));<a name="line.68"></a>
-<span class="sourceLineNo">069</span>    // try for default cases<a name="line.69"></a>
-<span class="sourceLineNo">070</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.70"></a>
-<span class="sourceLineNo">071</span>    // this will breach offheap limit as data size is higher and not due to heap size<a name="line.71"></a>
-<span class="sourceLineNo">072</span>    MemStoreSize memstoreSize =<a name="line.72"></a>
-<span class="sourceLineNo">073</span>        new MemStoreSize((3L * 1024L * 1024L * 1024L), 0, (1L * 1024L * 1024L * 1024L));<a name="line.73"></a>
-<span class="sourceLineNo">074</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.74"></a>
-<span class="sourceLineNo">075</span>    assertEquals(FlushType.ABOVE_OFFHEAP_HIGHER_MARK,<a name="line.75"></a>
-<span class="sourceLineNo">076</span>      regionServerAccounting.isAboveHighWaterMark());<a name="line.76"></a>
-<span class="sourceLineNo">077</span>  }<a name="line.77"></a>
-<span class="sourceLineNo">078</span><a name="line.78"></a>
-<span class="sourceLineNo">079</span>  @Test<a name="line.79"></a>
-<span class="sourceLineNo">080</span>  public void testOffheapMemstoreHigherWaterMarkLimitsDueToHeapSize() {<a name="line.80"></a>
-<span class="sourceLineNo">081</span>    Configuration conf = HBaseConfiguration.create();<a name="line.81"></a>
-<span class="sourceLineNo">082</span>    conf.setFloat(MemorySizeUtil.MEMSTORE_SIZE_KEY, 0.2f);<a name="line.82"></a>
-<span class="sourceLineNo">083</span>    // setting 1G as offheap data size<a name="line.83"></a>
-<span class="sourceLineNo">084</span>    conf.setLong(MemorySizeUtil.OFFHEAP_MEMSTORE_SIZE_KEY, (1L * 1024L));<a name="line.84"></a>
-<span class="sourceLineNo">085</span>    // try for default cases<a name="line.85"></a>
-<span class="sourceLineNo">086</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.86"></a>
-<span class="sourceLineNo">087</span>    // this will breach higher limit as heap size is higher and not due to offheap size<a name="line.87"></a>
-<span class="sourceLineNo">088</span>    MemStoreSize memstoreSize =<a name="line.88"></a>
-<span class="sourceLineNo">089</span>        new MemStoreSize((3L * 1024L * 1024L), (2L * 1024L * 1024L * 1024L), 0);<a name="line.89"></a>
-<span class="sourceLineNo">090</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.90"></a>
-<span class="sourceLineNo">091</span>    assertEquals(FlushType.ABOVE_ONHEAP_HIGHER_MARK,<a name="line.91"></a>
-<span class="sourceLineNo">092</span>      regionServerAccounting.isAboveHighWaterMark());<a name="line.92"></a>
-<span class="sourceLineNo">093</span>  }<a name="line.93"></a>
-<span class="sourceLineNo">094</span><a name="line.94"></a>
-<span class="sourceLineNo">095</span>  @Test<a name="line.95"></a>
-<span class="sourceLineNo">096</span>  public void testOffheapMemstoreLowerWaterMarkLimitsDueToDataSize() {<a name="line.96"></a>
-<span class="sourceLineNo">097</span>    Configuration conf = HBaseConfiguration.create();<a name="line.97"></a>
-<span class="sourceLineNo">098</span>    // setting 1G as offheap data size<a name="line.98"></a>
-<span class="sourceLineNo">099</span>    conf.setLong(MemorySizeUtil.OFFHEAP_MEMSTORE_SIZE_KEY, (1L * 1024L));<a name="line.99"></a>
-<span class="sourceLineNo">100</span>    // try for default cases<a name="line.100"></a>
-<span class="sourceLineNo">101</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.101"></a>
-<span class="sourceLineNo">102</span>    // this will breach offheap limit as data size is higher and not due to heap size<a name="line.102"></a>
-<span class="sourceLineNo">103</span>    MemStoreSize memstoreSize =<a name="line.103"></a>
-<span class="sourceLineNo">104</span>        new MemStoreSize((3L * 1024L * 1024L * 1024L), 0, (1L * 1024L * 1024L * 1024L));<a name="line.104"></a>
-<span class="sourceLineNo">105</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.105"></a>
-<span class="sourceLineNo">106</span>    assertEquals(FlushType.ABOVE_OFFHEAP_LOWER_MARK,<a name="line.106"></a>
-<span class="sourceLineNo">107</span>      regionServerAccounting.isAboveLowWaterMark());<a name="line.107"></a>
-<span class="sourceLineNo">108</span>  }<a name="line.108"></a>
-<span class="sourceLineNo">109</span><a name="line.109"></a>
-<span class="sourceLineNo">110</span>  @Test<a name="line.110"></a>
-<span class="sourceLineNo">111</span>  public void testOffheapMemstoreLowerWaterMarkLimitsDueToHeapSize() {<a name="line.111"></a>
-<span class="sourceLineNo">112</span>    Configuration conf = HBaseConfiguration.create();<a name="line.112"></a>
-<span class="sourceLineNo">113</span>    conf.setFloat(MemorySizeUtil.MEMSTORE_SIZE_KEY, 0.2f);<a name="line.113"></a>
-<span class="sourceLineNo">114</span>    // setting 1G as offheap data size<a name="line.114"></a>
-<span class="sourceLineNo">115</span>    conf.setLong(MemorySizeUtil.OFFHEAP_MEMSTORE_SIZE_KEY, (1L * 1024L));<a name="line.115"></a>
-<span class="sourceLineNo">116</span>    // try for default cases<a name="line.116"></a>
-<span class="sourceLineNo">117</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.117"></a>
-<span class="sourceLineNo">118</span>    // this will breach higher limit as heap size is higher and not due to offheap size<a name="line.118"></a>
-<span class="sourceLineNo">119</span>    MemStoreSize memstoreSize =<a name="line.119"></a>
-<span class="sourceLineNo">120</span>        new MemStoreSize((3L * 1024L * 1024L), (2L * 1024L * 1024L * 1024L), 0);<a name="line.120"></a>
-<span class="sourceLineNo">121</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.121"></a>
-<span class="sourceLineNo">122</span>    assertEquals(FlushType.ABOVE_ONHEAP_LOWER_MARK,<a name="line.122"></a>
-<span class="sourceLineNo">123</span>      regionServerAccounting.isAboveLowWaterMark());<a name="line.123"></a>
-<span class="sourceLineNo">124</span>  }<a name="line.124"></a>
-<span class="sourceLineNo">125</span>}<a name="line.125"></a>
+<span class="sourceLineNo">027</span>import org.junit.Before;<a name="line.27"></a>
+<span class="sourceLineNo">028</span>import org.junit.ClassRule;<a name="line.28"></a>
+<span class="sourceLineNo">029</span>import org.junit.Test;<a name="line.29"></a>
+<span class="sourceLineNo">030</span>import org.junit.experimental.categories.Category;<a name="line.30"></a>
+<span class="sourceLineNo">031</span><a name="line.31"></a>
+<span class="sourceLineNo">032</span>@Category(SmallTests.class)<a name="line.32"></a>
+<span class="sourceLineNo">033</span>public class TestRegionServerAccounting {<a name="line.33"></a>
+<span class="sourceLineNo">034</span><a name="line.34"></a>
+<span class="sourceLineNo">035</span>  @ClassRule<a name="line.35"></a>
+<span class="sourceLineNo">036</span>  public static final HBaseClassTestRule CLASS_RULE =<a name="line.36"></a>
+<span class="sourceLineNo">037</span>      HBaseClassTestRule.forClass(TestRegionServerAccounting.class);<a name="line.37"></a>
+<span class="sourceLineNo">038</span><a name="line.38"></a>
+<span class="sourceLineNo">039</span>  private final static float DEFAULT_MEMSTORE_SIZE = 0.2f;<a name="line.39"></a>
+<span class="sourceLineNo">040</span><a name="line.40"></a>
+<span class="sourceLineNo">041</span>  private static Configuration conf;<a name="line.41"></a>
+<span class="sourceLineNo">042</span><a name="line.42"></a>
+<span class="sourceLineNo">043</span>  @Before<a name="line.43"></a>
+<span class="sourceLineNo">044</span>  public void setUpConf() {<a name="line.44"></a>
+<span class="sourceLineNo">045</span>    conf = HBaseConfiguration.create();<a name="line.45"></a>
+<span class="sourceLineNo">046</span>    conf.setFloat(MemorySizeUtil.MEMSTORE_SIZE_KEY, DEFAULT_MEMSTORE_SIZE);<a name="line.46"></a>
+<span class="sourceLineNo">047</span>  }<a name="line.47"></a>
+<span class="sourceLineNo">048</span><a name="line.48"></a>
+<span class="sourceLineNo">049</span>  @Test<a name="line.49"></a>
+<span class="sourceLineNo">050</span>  public void testOnheapMemstoreHigherWaterMarkLimits() {<a name="line.50"></a>
+<span class="sourceLineNo">051</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.51"></a>
+<span class="sourceLineNo">052</span>    long dataSize = regionServerAccounting.getGlobalMemStoreLimit();<a name="line.52"></a>
+<span class="sourceLineNo">053</span>    MemStoreSize memstoreSize =<a name="line.53"></a>
+<span class="sourceLineNo">054</span>        new MemStoreSize(dataSize, dataSize, 0);<a name="line.54"></a>
+<span class="sourceLineNo">055</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.55"></a>
+<span class="sourceLineNo">056</span>    assertEquals(FlushType.ABOVE_ONHEAP_HIGHER_MARK,<a name="line.56"></a>
+<span class="sourceLineNo">057</span>      regionServerAccounting.isAboveHighWaterMark());<a name="line.57"></a>
+<span class="sourceLineNo">058</span>  }<a name="line.58"></a>
+<span class="sourceLineNo">059</span><a name="line.59"></a>
+<span class="sourceLineNo">060</span>  @Test<a name="line.60"></a>
+<span class="sourceLineNo">061</span>  public void testOnheapMemstoreLowerWaterMarkLimits() {<a name="line.61"></a>
+<span class="sourceLineNo">062</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.62"></a>
+<span class="sourceLineNo">063</span>    long dataSize = regionServerAccounting.getGlobalMemStoreLimit();<a name="line.63"></a>
+<span class="sourceLineNo">064</span>    MemStoreSize memstoreSize =<a name="line.64"></a>
+<span class="sourceLineNo">065</span>        new MemStoreSize(dataSize, dataSize, 0);<a name="line.65"></a>
+<span class="sourceLineNo">066</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.66"></a>
+<span class="sourceLineNo">067</span>    assertEquals(FlushType.ABOVE_ONHEAP_LOWER_MARK,<a name="line.67"></a>
+<span class="sourceLineNo">068</span>      regionServerAccounting.isAboveLowWaterMark());<a name="line.68"></a>
+<span class="sourceLineNo">069</span>  }<a name="line.69"></a>
+<span class="sourceLineNo">070</span><a name="line.70"></a>
+<span class="sourceLineNo">071</span>  @Test<a name="line.71"></a>
+<span class="sourceLineNo">072</span>  public void testOffheapMemstoreHigherWaterMarkLimitsDueToDataSize() {<a name="line.72"></a>
+<span class="sourceLineNo">073</span>    // setting 1G as offheap data size<a name="line.73"></a>
+<span class="sourceLineNo">074</span>    conf.setLong(MemorySizeUtil.OFFHEAP_MEMSTORE_SIZE_KEY, (1L * 1024L));<a name="line.74"></a>
+<span class="sourceLineNo">075</span>    // try for default cases<a name="line.75"></a>
+<span class="sourceLineNo">076</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.76"></a>
+<span class="sourceLineNo">077</span>    // this will breach offheap limit as data size is higher and not due to heap size<a name="line.77"></a>
+<span class="sourceLineNo">078</span>    MemStoreSize memstoreSize =<a name="line.78"></a>
+<span class="sourceLineNo">079</span>        new MemStoreSize((3L * 1024L * 1024L * 1024L), 0, (1L * 1024L * 1024L * 1024L));<a name="line.79"></a>
+<span class="sourceLineNo">080</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.80"></a>
+<span class="sourceLineNo">081</span>    assertEquals(FlushType.ABOVE_OFFHEAP_HIGHER_MARK,<a name="line.81"></a>
+<span class="sourceLineNo">082</span>      regionServerAccounting.isAboveHighWaterMark());<a name="line.82"></a>
+<span class="sourceLineNo">083</span>  }<a name="line.83"></a>
+<span class="sourceLineNo">084</span><a name="line.84"></a>
+<span class="sourceLineNo">085</span>  @Test<a name="line.85"></a>
+<span class="sourceLineNo">086</span>  public void testOffheapMemstoreHigherWaterMarkLimitsDueToHeapSize() {<a name="line.86"></a>
+<span class="sourceLineNo">087</span>    // setting 1G as offheap data size<a name="line.87"></a>
+<span class="sourceLineNo">088</span>    conf.setLong(MemorySizeUtil.OFFHEAP_MEMSTORE_SIZE_KEY, (1L * 1024L));<a name="line.88"></a>
+<span class="sourceLineNo">089</span>    // try for default cases<a name="line.89"></a>
+<span class="sourceLineNo">090</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.90"></a>
+<span class="sourceLineNo">091</span>    // this will breach higher limit as heap size is higher and not due to offheap size<a name="line.91"></a>
+<span class="sourceLineNo">092</span>    long dataSize = regionServerAccounting.getGlobalOnHeapMemStoreLimit();<a name="line.92"></a>
+<span class="sourceLineNo">093</span>    MemStoreSize memstoreSize =<a name="line.93"></a>
+<span class="sourceLineNo">094</span>        new MemStoreSize(dataSize, dataSize, 0);<a name="line.94"></a>
+<span class="sourceLineNo">095</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.95"></a>
+<span class="sourceLineNo">096</span>    assertEquals(FlushType.ABOVE_ONHEAP_HIGHER_MARK,<a name="line.96"></a>
+<span class="sourceLineNo">097</span>      regionServerAccounting.isAboveHighWaterMark());<a name="line.97"></a>
+<span class="sourceLineNo">098</span>  }<a name="line.98"></a>
+<span class="sourceLineNo">099</span><a name="line.99"></a>
+<span class="sourceLineNo">100</span>  @Test<a name="line.100"></a>
+<span class="sourceLineNo">101</span>  public void testOffheapMemstoreLowerWaterMarkLimitsDueToDataSize() {<a name="line.101"></a>
+<span class="sourceLineNo">102</span>    // setting 1G as offheap data size<a name="line.102"></a>
+<span class="sourceLineNo">103</span>    conf.setLong(MemorySizeUtil.OFFHEAP_MEMSTORE_SIZE_KEY, (1L * 1024L));<a name="line.103"></a>
+<span class="sourceLineNo">104</span>    // try for default cases<a name="line.104"></a>
+<span class="sourceLineNo">105</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.105"></a>
+<span class="sourceLineNo">106</span>    // this will breach offheap limit as data size is higher and not due to heap size<a name="line.106"></a>
+<span class="sourceLineNo">107</span>    MemStoreSize memstoreSize =<a name="line.107"></a>
+<span class="sourceLineNo">108</span>        new MemStoreSize((3L * 1024L * 1024L * 1024L), 0, (1L * 1024L * 1024L * 1024L));<a name="line.108"></a>
+<span class="sourceLineNo">109</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.109"></a>
+<span class="sourceLineNo">110</span>    assertEquals(FlushType.ABOVE_OFFHEAP_LOWER_MARK,<a name="line.110"></a>
+<span class="sourceLineNo">111</span>      regionServerAccounting.isAboveLowWaterMark());<a name="line.111"></a>
+<span class="sourceLineNo">112</span>  }<a name="line.112"></a>
+<span class="sourceLineNo">113</span><a name="line.113"></a>
+<span class="sourceLineNo">114</span>  @Test<a name="line.114"></a>
+<span class="sourceLineNo">115</span>  public void testOffheapMemstoreLowerWaterMarkLimitsDueToHeapSize() {<a name="line.115"></a>
+<span class="sourceLineNo">116</span>    // setting 1G as offheap data size<a name="line.116"></a>
+<span class="sourceLineNo">117</span>    conf.setLong(MemorySizeUtil.OFFHEAP_MEMSTORE_SIZE_KEY, (1L * 1024L));<a name="line.117"></a>
+<span class="sourceLineNo">118</span>    // try for default cases<a name="line.118"></a>
+<span class="sourceLineNo">119</span>    RegionServerAccounting regionServerAccounting = new RegionServerAccounting(conf);<a name="line.119"></a>
+<span class="sourceLineNo">120</span>    // this will breach higher limit as heap size is higher and not due to offheap size<a name="line.120"></a>
+<span class="sourceLineNo">121</span>    long dataSize = regionServerAccounting.getGlobalOnHeapMemStoreLimit();<a name="line.121"></a>
+<span class="sourceLineNo">122</span>    MemStoreSize memstoreSize =<a name="line.122"></a>
+<span class="sourceLineNo">123</span>        new MemStoreSize(dataSize, dataSize, 0);<a name="line.123"></a>
+<span class="sourceLineNo">124</span>    regionServerAccounting.incGlobalMemStoreSize(memstoreSize);<a name="line.124"></a>
+<span class="sourceLineNo">125</span>    assertEquals(FlushType.ABOVE_ONHEAP_LOWER_MARK,<a name="line.125"></a>
+<span class="sourceLineNo">126</span>      regionServerAccounting.isAboveLowWaterMark());<a name="line.126"></a>
+<span class="sourceLineNo">127</span>  }<a name="line.127"></a>
+<span class="sourceLineNo">128</span>}<a name="line.128"></a>
 
 
 


[26/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="so

<TRUNCATED>

[16/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {

<TRUNCATED>

[30/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    String cmdName = nu

<TRUNCATED>

[13/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="so

<TRUNCATED>

[12/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627

<TRUNCATED>

[43/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/checkstyle.rss
----------------------------------------------------------------------
diff --git a/checkstyle.rss b/checkstyle.rss
index 252788a..db00e1e 100644
--- a/checkstyle.rss
+++ b/checkstyle.rss
@@ -26,7 +26,7 @@ under the License.
     <copyright>&#169;2007 - 2018 The Apache Software Foundation</copyright>
     <item>
       <title>File: 3609,
-             Errors: 15875,
+             Errors: 15879,
              Warnings: 0,
              Infos: 0
       </title>
@@ -4605,7 +4605,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  34
+                  37
                 </td>
               </tr>
                           <tr>
@@ -34579,7 +34579,7 @@ under the License.
                   0
                 </td>
                 <td>
-                  0
+                  1
                 </td>
               </tr>
                           <tr>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/coc.html
----------------------------------------------------------------------
diff --git a/coc.html b/coc.html
index 951de45..f8bfe45 100644
--- a/coc.html
+++ b/coc.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Code of Conduct Policy
@@ -375,7 +375,7 @@ email to <a class="externalLink" href="mailto:private@hbase.apache.org">the priv
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/dependencies.html
----------------------------------------------------------------------
diff --git a/dependencies.html b/dependencies.html
index 24260bb..7c53d9b 100644
--- a/dependencies.html
+++ b/dependencies.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependencies</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/dependency-convergence.html
----------------------------------------------------------------------
diff --git a/dependency-convergence.html b/dependency-convergence.html
index f76fb50..3f36672 100644
--- a/dependency-convergence.html
+++ b/dependency-convergence.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Reactor Dependency Convergence</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -1105,7 +1105,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/dependency-info.html
----------------------------------------------------------------------
diff --git a/dependency-info.html b/dependency-info.html
index 49d0a12..689be40 100644
--- a/dependency-info.html
+++ b/dependency-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Dependency Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -313,7 +313,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/dependency-management.html
----------------------------------------------------------------------
diff --git a/dependency-management.html b/dependency-management.html
index ce06f8c..98d10b8 100644
--- a/dependency-management.html
+++ b/dependency-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Dependency Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -969,7 +969,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/devapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/devapidocs/constant-values.html b/devapidocs/constant-values.html
index 170b4f1..de81d02 100644
--- a/devapidocs/constant-values.html
+++ b/devapidocs/constant-values.html
@@ -3768,14 +3768,14 @@
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#date">date</a></code></td>
-<td class="colLast"><code>"Mon May  7 14:39:14 UTC 2018"</code></td>
+<td class="colLast"><code>"Tue May  8 14:39:27 UTC 2018"</code></td>
 </tr>
 <tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.revision">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/Version.html#revision">revision</a></code></td>
-<td class="colLast"><code>"8e6ff689e806138e602a46730886d8c5f524fdcd"</code></td>
+<td class="colLast"><code>"1825af45b328cd54680c5c552f07bb12c4705fdb"</code></td>
 </tr>
 <tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.Version.srcChecksum">

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
----------------------------------------------------------------------
diff --git a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
index 6ff7f3f..602e218 100644
--- a/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
+++ b/devapidocs/src-html/org/apache/hadoop/hbase/Version.html
@@ -16,9 +16,9 @@
 <span class="sourceLineNo">008</span>@InterfaceAudience.Private<a name="line.8"></a>
 <span class="sourceLineNo">009</span>public class Version {<a name="line.9"></a>
 <span class="sourceLineNo">010</span>  public static final String version = "3.0.0-SNAPSHOT";<a name="line.10"></a>
-<span class="sourceLineNo">011</span>  public static final String revision = "8e6ff689e806138e602a46730886d8c5f524fdcd";<a name="line.11"></a>
+<span class="sourceLineNo">011</span>  public static final String revision = "1825af45b328cd54680c5c552f07bb12c4705fdb";<a name="line.11"></a>
 <span class="sourceLineNo">012</span>  public static final String user = "jenkins";<a name="line.12"></a>
-<span class="sourceLineNo">013</span>  public static final String date = "Mon May  7 14:39:14 UTC 2018";<a name="line.13"></a>
+<span class="sourceLineNo">013</span>  public static final String date = "Tue May  8 14:39:27 UTC 2018";<a name="line.13"></a>
 <span class="sourceLineNo">014</span>  public static final String url = "git://jenkins-websites1.apache.org/home/jenkins/jenkins-slave/workspace/hbase_generate_website/hbase";<a name="line.14"></a>
 <span class="sourceLineNo">015</span>  public static final String srcChecksum = "ffc5680715ed56f21d5623cc15a65008";<a name="line.15"></a>
 <span class="sourceLineNo">016</span>}<a name="line.16"></a>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/downloads.html
----------------------------------------------------------------------
diff --git a/downloads.html b/downloads.html
index 33b2194..34efd15 100644
--- a/downloads.html
+++ b/downloads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase Downloads</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -339,8 +339,8 @@ under the License. -->
       </td>
       
 <td style="test-align: left">
-        <a class="externalLink" href="http://www.apache.org/dyn/closer.lua/hbase/2.0.0/hbase-2.0.0-src.tar.gz"></a> (<a class="externalLink" href="http://apache.org/dist/hbase/2.0.0/hbase-2.0.0-src.tar.gz.sha512">sha512</a> <a class="externalLink" href="http://apache.org/dist/hbase/2.0.0/hbase-2.0.0-src.tar.gz.asc">asc</a>) <br />
-        <a class="externalLink" href="http://www.apache.org/dyn/closer.lua/hbase/2.0.0/hbase-2.0.0-bin.tar.gz"></a> (<a class="externalLink" href="http://apache.org/dist/hbase/2.0.0/hbase-2.0.0-bin.tar.gz.sha512">sha512</a> <a class="externalLink" href="http://apache.org/dist/hbase/2.0.0/hbase-2.0.0-bin.tar.gz.asc">asc</a>)
+        <a class="externalLink" href="http://www.apache.org/dyn/closer.lua/hbase/2.0.0/hbase-2.0.0-src.tar.gz">src</a> (<a class="externalLink" href="http://apache.org/dist/hbase/2.0.0/hbase-2.0.0-src.tar.gz.sha512">sha512</a> <a class="externalLink" href="http://apache.org/dist/hbase/2.0.0/hbase-2.0.0-src.tar.gz.asc">asc</a>) <br />
+        <a class="externalLink" href="http://www.apache.org/dyn/closer.lua/hbase/2.0.0/hbase-2.0.0-bin.tar.gz">bin</a> (<a class="externalLink" href="http://apache.org/dist/hbase/2.0.0/hbase-2.0.0-bin.tar.gz.sha512">sha512</a> <a class="externalLink" href="http://apache.org/dist/hbase/2.0.0/hbase-2.0.0-bin.tar.gz.asc">asc</a>)
       </td>
     </tr>
   </table>
@@ -366,7 +366,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/export_control.html
----------------------------------------------------------------------
diff --git a/export_control.html b/export_control.html
index 6943f2f..0191db6 100644
--- a/export_control.html
+++ b/export_control.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Export Control
@@ -331,7 +331,7 @@ for more details.</p>
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/index.html
----------------------------------------------------------------------
diff --git a/index.html b/index.html
index 8eca754..da14698 100644
--- a/index.html
+++ b/index.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBaseâ„¢ Home</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -409,7 +409,7 @@ Apache HBase is an open-source, distributed, versioned, non-relational database
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/integration.html
----------------------------------------------------------------------
diff --git a/integration.html b/integration.html
index eb303a6..40defbe 100644
--- a/integration.html
+++ b/integration.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; CI Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -291,7 +291,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/issue-tracking.html
----------------------------------------------------------------------
diff --git a/issue-tracking.html b/issue-tracking.html
index a3f7b70..12aa6ea 100644
--- a/issue-tracking.html
+++ b/issue-tracking.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Issue Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -288,7 +288,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/license.html
----------------------------------------------------------------------
diff --git a/license.html b/license.html
index 85e0c3e..92ece62 100644
--- a/license.html
+++ b/license.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Licenses</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -491,7 +491,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/mail-lists.html
----------------------------------------------------------------------
diff --git a/mail-lists.html b/mail-lists.html
index ca556c7..8d2afb0 100644
--- a/mail-lists.html
+++ b/mail-lists.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Mailing Lists</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -341,7 +341,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/metrics.html
----------------------------------------------------------------------
diff --git a/metrics.html b/metrics.html
index 20611dc..478e946 100644
--- a/metrics.html
+++ b/metrics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) Metrics
@@ -459,7 +459,7 @@ export HBASE_REGIONSERVER_OPTS=&quot;$HBASE_JMX_OPTS -Dcom.sun.management.jmxrem
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/old_news.html
----------------------------------------------------------------------
diff --git a/old_news.html b/old_news.html
index 8579ab4..6e4cffa 100644
--- a/old_news.html
+++ b/old_news.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Old Apache HBase (TM) News
@@ -440,7 +440,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/plugin-management.html
----------------------------------------------------------------------
diff --git a/plugin-management.html b/plugin-management.html
index a8ebc89..fbb2909 100644
--- a/plugin-management.html
+++ b/plugin-management.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugin Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -440,7 +440,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/plugins.html
----------------------------------------------------------------------
diff --git a/plugins.html b/plugins.html
index df69907..f8c3a7a 100644
--- a/plugins.html
+++ b/plugins.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Plugins</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -375,7 +375,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/poweredbyhbase.html
----------------------------------------------------------------------
diff --git a/poweredbyhbase.html b/poweredbyhbase.html
index b52ea95..bfa07f7 100644
--- a/poweredbyhbase.html
+++ b/poweredbyhbase.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Powered By Apache HBase™</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -769,7 +769,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/project-info.html
----------------------------------------------------------------------
diff --git a/project-info.html b/project-info.html
index f658665..17469d0 100644
--- a/project-info.html
+++ b/project-info.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Information</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -335,7 +335,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/project-reports.html
----------------------------------------------------------------------
diff --git a/project-reports.html b/project-reports.html
index ff73c9e..b84284f 100644
--- a/project-reports.html
+++ b/project-reports.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Generated Reports</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -305,7 +305,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/project-summary.html
----------------------------------------------------------------------
diff --git a/project-summary.html b/project-summary.html
index 41923e4..42edeed 100644
--- a/project-summary.html
+++ b/project-summary.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Summary</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -331,7 +331,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/pseudo-distributed.html
----------------------------------------------------------------------
diff --git a/pseudo-distributed.html b/pseudo-distributed.html
index 3b32c5d..b0b4f01 100644
--- a/pseudo-distributed.html
+++ b/pseudo-distributed.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
 Running Apache HBase (TM) in pseudo-distributed mode
@@ -308,7 +308,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/replication.html
----------------------------------------------------------------------
diff --git a/replication.html b/replication.html
index cf558bf..7eb44bd 100644
--- a/replication.html
+++ b/replication.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; 
       Apache HBase (TM) Replication
@@ -303,7 +303,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/resources.html
----------------------------------------------------------------------
diff --git a/resources.html b/resources.html
index d6b2c10..d3ef3ea 100644
--- a/resources.html
+++ b/resources.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Other Apache HBase (TM) Resources</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -331,7 +331,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/source-repository.html
----------------------------------------------------------------------
diff --git a/source-repository.html b/source-repository.html
index 1df62f3..1ba2564 100644
--- a/source-repository.html
+++ b/source-repository.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Source Code Management</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -299,7 +299,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/sponsors.html
----------------------------------------------------------------------
diff --git a/sponsors.html b/sponsors.html
index c1f958f..bd595ef 100644
--- a/sponsors.html
+++ b/sponsors.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Apache HBase™ Sponsors</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -333,7 +333,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/supportingprojects.html
----------------------------------------------------------------------
diff --git a/supportingprojects.html b/supportingprojects.html
index 93faed0..88b7d09 100644
--- a/supportingprojects.html
+++ b/supportingprojects.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Supporting Projects</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -520,7 +520,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/team-list.html
----------------------------------------------------------------------
diff --git a/team-list.html b/team-list.html
index a6573d7..e77082e 100644
--- a/team-list.html
+++ b/team-list.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Project Team</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -730,7 +730,7 @@
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/constant-values.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/constant-values.html b/testdevapidocs/constant-values.html
index a1aa8c3..d5d21fc 100644
--- a/testdevapidocs/constant-values.html
+++ b/testdevapidocs/constant-values.html
@@ -1184,41 +1184,48 @@
 <td class="colLast"><code>1000</code></td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.PerformanceEvaluation.FAMILY_NAME_BASE">
+<!--   -->
+</a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td><code><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#FAMILY_NAME_BASE">FAMILY_NAME_BASE</a></code></td>
+<td class="colLast"><code>"info"</code></td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.PerformanceEvaluation.ONE_GB">
 <!--   -->
 </a><code>private&nbsp;static&nbsp;final&nbsp;int</code></td>
 <td><code><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#ONE_GB">ONE_GB</a></code></td>
 <td class="colLast"><code>1048576000</code></td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.PerformanceEvaluation.RANDOM_READ">
 <!--   -->
 </a><code>static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#RANDOM_READ">RANDOM_READ</a></code></td>
 <td class="colLast"><code>"randomRead"</code></td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.PerformanceEvaluation.RANDOM_SEEK_SCAN">
 <!--   -->
 </a><code>static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#RANDOM_SEEK_SCAN">RANDOM_SEEK_SCAN</a></code></td>
 <td class="colLast"><code>"randomSeekScan"</code></td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.PerformanceEvaluation.ROW_LENGTH">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;int</code></td>
 <td><code><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#ROW_LENGTH">ROW_LENGTH</a></code></td>
 <td class="colLast"><code>26</code></td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.PerformanceEvaluation.TABLE_NAME">
 <!--   -->
 </a><code>public&nbsp;static&nbsp;final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td><code><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#TABLE_NAME">TABLE_NAME</a></code></td>
 <td class="colLast"><code>"TestTable"</code></td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><a name="org.apache.hadoop.hbase.PerformanceEvaluation.TAG_LENGTH">
 <!--   -->
 </a><code>private&nbsp;static&nbsp;final&nbsp;int</code></td>
@@ -9826,6 +9833,25 @@
 </li>
 <li class="blockList">
 <table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
+<caption><span>org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionServerAccounting</a></span><span class="tabEnd">&nbsp;</span></caption>
+<tr>
+<th class="colFirst" scope="col">Modifier and Type</th>
+<th scope="col">Constant Field</th>
+<th class="colLast" scope="col">Value</th>
+</tr>
+<tbody>
+<tr class="altColor">
+<td class="colFirst"><a name="org.apache.hadoop.hbase.regionserver.TestRegionServerAccounting.DEFAULT_MEMSTORE_SIZE">
+<!--   -->
+</a><code>private&nbsp;static&nbsp;final&nbsp;float</code></td>
+<td><code><a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#DEFAULT_MEMSTORE_SIZE">DEFAULT_MEMSTORE_SIZE</a></code></td>
+<td class="colLast"><code>0.20000000298023224f</code></td>
+</tr>
+</tbody>
+</table>
+</li>
+<li class="blockList">
+<table class="constantsSummary" border="0" cellpadding="3" cellspacing="0" summary="Constant Field Values table, listing constant fields, and values">
 <caption><span>org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionServerHostname.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionServerHostname</a></span><span class="tabEnd">&nbsp;</span></caption>
 <tr>
 <th class="colFirst" scope="col">Modifier and Type</th>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/index-all.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/index-all.html b/testdevapidocs/index-all.html
index 2b71a2b..5f98900 100644
--- a/testdevapidocs/index-all.html
+++ b/testdevapidocs/index-all.html
@@ -3116,7 +3116,7 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.html#calculateBlockSizeDefault-long-int-">calculateBlockSizeDefault(long, int)</a></span> - Method in class org.apache.hadoop.hbase.io.hfile.<a href="org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.html" title="class in org.apache.hadoop.hbase.io.hfile">TestLruBlockCache</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#calculateMbps-int-long-int-int-">calculateMbps(int, long, int, int)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation</a></dt>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#calculateMbps-int-long-int-int-int-">calculateMbps(int, long, int, int, int)</a></span> - Static method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation</a></dt>
 <dd>
 <div class="block">Compute a throughput rate in MB/s.</div>
 </dd>
@@ -7988,6 +7988,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.html#conf">conf</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAbort.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionServerAbort</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#conf">conf</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionServerAccounting</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.html#conf">conf</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionServerMetrics.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionServerMetrics</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionServerOnlineConfigChange.html#conf">conf</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionServerOnlineConfigChange.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionServerOnlineConfigChange</a></dt>
@@ -11017,6 +11019,8 @@
 </dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/chaos/actions/SplitAllRegionOfTableAction.html#DEFAULT_MAX_SPLITS">DEFAULT_MAX_SPLITS</a></span> - Static variable in class org.apache.hadoop.hbase.chaos.actions.<a href="org/apache/hadoop/hbase/chaos/actions/SplitAllRegionOfTableAction.html" title="class in org.apache.hadoop.hbase.chaos.actions">SplitAllRegionOfTableAction</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#DEFAULT_MEMSTORE_SIZE">DEFAULT_MEMSTORE_SIZE</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionServerAccounting</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/chaos/factories/MonkeyConstants.html#DEFAULT_MOVE_RANDOM_REGION_SLEEP_TIME">DEFAULT_MOVE_RANDOM_REGION_SLEEP_TIME</a></span> - Static variable in interface org.apache.hadoop.hbase.chaos.factories.<a href="org/apache/hadoop/hbase/chaos/factories/MonkeyConstants.html" title="interface in org.apache.hadoop.hbase.chaos.factories">MonkeyConstants</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/chaos/factories/MonkeyConstants.html#DEFAULT_MOVE_REGIONS_MAX_TIME">DEFAULT_MOVE_REGIONS_MAX_TIME</a></span> - Static variable in interface org.apache.hadoop.hbase.chaos.factories.<a href="org/apache/hadoop/hbase/chaos/factories/MonkeyConstants.html" title="interface in org.apache.hadoop.hbase.chaos.factories">MonkeyConstants</a></dt>
@@ -13475,6 +13479,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/TestMasterTransitions.html#FAMILIES">FAMILIES</a></span> - Static variable in class org.apache.hadoop.hbase.master.<a href="org/apache/hadoop/hbase/master/TestMasterTransitions.html" title="class in org.apache.hadoop.hbase.master">TestMasterTransitions</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#families">families</a></span> - Variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html#families">families</a></span> - Variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHRegion.PutThread.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegion.PutThread</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.html#FAMILIES">FAMILIES</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegionFileSystem</a></dt>
@@ -13885,8 +13891,6 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TestTimeRangeMapRed.html#FAMILY_NAME">FAMILY_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TestTimeRangeMapRed.html" title="class in org.apache.hadoop.hbase.mapreduce">TestTimeRangeMapRed</a></dt>
 <dd>&nbsp;</dd>
-<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#FAMILY_NAME">FAMILY_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation</a></dt>
-<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.html#FAMILY_NAME">FAMILY_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestHRegionFileSystem.html" title="class in org.apache.hadoop.hbase.regionserver">TestHRegionFileSystem</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#FAMILY_NAME">FAMILY_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html" title="class in org.apache.hadoop.hbase.regionserver">TestScannerRetriableFailure</a></dt>
@@ -13903,6 +13907,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TimestampTestBase.html#FAMILY_NAME">FAMILY_NAME</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TimestampTestBase.html" title="class in org.apache.hadoop.hbase">TimestampTestBase</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#FAMILY_NAME_BASE">FAMILY_NAME_BASE</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/filter/TestInvocationRecordFilter.html#FAMILY_NAME_BYTES">FAMILY_NAME_BYTES</a></span> - Static variable in class org.apache.hadoop.hbase.filter.<a href="org/apache/hadoop/hbase/filter/TestInvocationRecordFilter.html" title="class in org.apache.hadoop.hbase.filter">TestInvocationRecordFilter</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/chaos/util/ChaosMonkeyRunner.html#FAMILY_NAME_OPT">FAMILY_NAME_OPT</a></span> - Static variable in class org.apache.hadoop.hbase.chaos.util.<a href="org/apache/hadoop/hbase/chaos/util/ChaosMonkeyRunner.html" title="class in org.apache.hadoop.hbase.chaos.util">ChaosMonkeyRunner</a></dt>
@@ -13913,6 +13919,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/master/assignment/TestAssignmentOnRSCrash.html#FAMILY_STR">FAMILY_STR</a></span> - Static variable in class org.apache.hadoop.hbase.master.assignment.<a href="org/apache/hadoop/hbase/master/assignment/TestAssignmentOnRSCrash.html" title="class in org.apache.hadoop.hbase.master.assignment">TestAssignmentOnRSCrash</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.html#FAMILY_ZERO">FAMILY_ZERO</a></span> - Static variable in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/coprocessor/TestSecureExport.html#FAMILYA">FAMILYA</a></span> - Static variable in class org.apache.hadoop.hbase.coprocessor.<a href="org/apache/hadoop/hbase/coprocessor/TestSecureExport.html" title="class in org.apache.hadoop.hbase.coprocessor">TestSecureExport</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/mapreduce/TestImportExport.html#FAMILYA">FAMILYA</a></span> - Static variable in class org.apache.hadoop.hbase.mapreduce.<a href="org/apache/hadoop/hbase/mapreduce/TestImportExport.html" title="class in org.apache.hadoop.hbase.mapreduce">TestImportExport</a></dt>
@@ -16093,6 +16101,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/wal/FaultyProtobufLogReader.html#getFailureType--">getFailureType()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.wal.<a href="org/apache/hadoop/hbase/regionserver/wal/FaultyProtobufLogReader.html" title="class in org.apache.hadoop.hbase.regionserver.wal">FaultyProtobufLogReader</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getFamilies--">getFamilies()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClient.html#getFamiliesFromFS-org.apache.hadoop.hbase.TableName-">getFamiliesFromFS(TableName)</a></span> - Method in class org.apache.hadoop.hbase.client.<a href="org/apache/hadoop/hbase/client/TestRestoreSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.client">TestRestoreSnapshotFromClient</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/TestCellUtil.NonExtendedCell.html#getFamilyArray--">getFamilyArray()</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/TestCellUtil.NonExtendedCell.html" title="class in org.apache.hadoop.hbase">TestCellUtil.NonExtendedCell</a></dt>
@@ -35208,6 +35218,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/wal/FaultyFSLog.html#setFailureType-org.apache.hadoop.hbase.wal.FaultyFSLog.FailureType-">setFailureType(FaultyFSLog.FailureType)</a></span> - Method in class org.apache.hadoop.hbase.wal.<a href="org/apache/hadoop/hbase/wal/FaultyFSLog.html" title="class in org.apache.hadoop.hbase.wal">FaultyFSLog</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setFamilies-int-">setFamilies(int)</a></span> - Method in class org.apache.hadoop.hbase.<a href="org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/util/RedundantKVGenerator.html#setFamily-byte:A-">setFamily(byte[])</a></span> - Method in class org.apache.hadoop.hbase.util.<a href="org/apache/hadoop/hbase/util/RedundantKVGenerator.html" title="class in org.apache.hadoop.hbase.util">RedundantKVGenerator</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/compactions/TestStripeCompactionPolicy.html#setFileStripe-org.apache.hadoop.hbase.regionserver.HStoreFile-byte:A-byte:A-">setFileStripe(HStoreFile, byte[], byte[])</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.compactions.<a href="org/apache/hadoop/hbase/regionserver/compactions/TestStripeCompactionPolicy.html" title="class in org.apache.hadoop.hbase.regionserver.compactions">TestStripeCompactionPolicy</a></dt>
@@ -37228,6 +37240,8 @@
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestCompactSplitThread.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestCompactSplitThread.html" title="class in org.apache.hadoop.hbase.regionserver">TestCompactSplitThread</a></dt>
 <dd>&nbsp;</dd>
+<dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#setUpConf--">setUpConf()</a></span> - Method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html" title="class in org.apache.hadoop.hbase.regionserver">TestRegionServerAccounting</a></dt>
+<dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.regionserver.<a href="org/apache/hadoop/hbase/regionserver/TestScannerRetriableFailure.html" title="class in org.apache.hadoop.hbase.regionserver">TestScannerRetriableFailure</a></dt>
 <dd>&nbsp;</dd>
 <dt><span class="memberNameLink"><a href="org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html#setupConf-org.apache.hadoop.conf.Configuration-">setupConf(Configuration)</a></span> - Static method in class org.apache.hadoop.hbase.snapshot.<a href="org/apache/hadoop/hbase/snapshot/TestFlushSnapshotFromClient.html" title="class in org.apache.hadoop.hbase.snapshot">TestFlushSnapshotFromClient</a></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
index 65d830d..236500d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1979">PerformanceEvaluation.AppendTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2034">PerformanceEvaluation.AppendTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CASTableTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AppendTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.1980">AppendTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.2035">AppendTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
            <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
            <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.1985">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html#line.2040">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
index 854bd4a..e6f93d7 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1401">PerformanceEvaluation.AsyncRandomReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1418">PerformanceEvaluation.AsyncRandomReadTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTableTest</a></pre>
 </li>
 </ul>
@@ -284,7 +284,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>consistency</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.client.Consistency <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1402">consistency</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.client.Consistency <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1419">consistency</a></pre>
 </li>
 </ul>
 <a name="gets">
@@ -293,7 +293,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>gets</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;org.apache.hadoop.hbase.client.Get&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1403">gets</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;org.apache.hadoop.hbase.client.Get&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1420">gets</a></pre>
 </li>
 </ul>
 <a name="rd">
@@ -302,7 +302,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>rd</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1404">rd</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1421">rd</a></pre>
 </li>
 </ul>
 </li>
@@ -319,7 +319,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncRandomReadTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1406">AsyncRandomReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1423">AsyncRandomReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -338,7 +338,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1416">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1433">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -356,7 +356,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>runtime</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html?is-external=true" title="class or interface in java.lang">RuntimeException</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1451">runtime</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/RuntimeException.html?is-external=true" title="class or interface in java.lang">RuntimeException</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1471">runtime</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Throwable.html?is-external=true" title="class or interface in java.lang">Throwable</a>&nbsp;e)</pre>
 </li>
 </ul>
 <a name="propagate-java.util.concurrent.Callable-">
@@ -365,7 +365,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>propagate</h4>
-<pre>public static&nbsp;&lt;V&gt;&nbsp;V&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1458">propagate</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;V&gt;&nbsp;callable)</pre>
+<pre>public static&nbsp;&lt;V&gt;&nbsp;V&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1478">propagate</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/Callable.html?is-external=true" title="class or interface in java.util.concurrent">Callable</a>&lt;V&gt;&nbsp;callable)</pre>
 </li>
 </ul>
 <a name="getReportingPeriod--">
@@ -374,7 +374,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>getReportingPeriod</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1467">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1487">getReportingPeriod</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>
@@ -387,7 +387,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testTakedown</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1473">testTakedown</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html#line.1493">testTakedown</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
index 22febd5..7d76d91 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1482">PerformanceEvaluation.AsyncRandomWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1502">PerformanceEvaluation.AsyncRandomWriteTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTableTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncRandomWriteTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1483">AsyncRandomWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1503">AsyncRandomWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
                      <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                      <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1488">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html#line.1508">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
index ca68f65..130ab8d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1519">PerformanceEvaluation.AsyncScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1542">PerformanceEvaluation.AsyncScanTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTableTest</a></pre>
 </li>
 </ul>
@@ -272,7 +272,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>testScanner</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1520">testScanner</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1543">testScanner</a></pre>
 </li>
 </ul>
 <a name="asyncTable">
@@ -281,7 +281,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>asyncTable</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.AsyncTable&lt;?&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1521">asyncTable</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.AsyncTable&lt;?&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1544">asyncTable</a></pre>
 </li>
 </ul>
 </li>
@@ -298,7 +298,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncScanTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1523">AsyncScanTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1546">AsyncScanTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
               <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
               <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -317,7 +317,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>onStartup</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1528">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1551">onStartup</a>()
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -333,7 +333,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>testTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1535">testTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1558">testTakedown</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -349,7 +349,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1544">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html#line.1567">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
index 8bb15e0..e546c2f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1568">PerformanceEvaluation.AsyncSequentialReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1594">PerformanceEvaluation.AsyncSequentialReadTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTableTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncSequentialReadTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1569">AsyncSequentialReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1595">AsyncSequentialReadTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
                         <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                         <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1574">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html#line.1600">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
index 1a6b9c8..95955c4 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1593">PerformanceEvaluation.AsyncSequentialWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1624">PerformanceEvaluation.AsyncSequentialWriteTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTableTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncSequentialWriteTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1594">AsyncSequentialWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1625">AsyncSequentialWriteTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
                          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1599">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html#line.1630">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
index 176fbf8..4807060 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1384">PerformanceEvaluation.AsyncTableTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1401">PerformanceEvaluation.AsyncTableTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.AsyncTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>table</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.AsyncTable&lt;?&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1385">table</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.AsyncTable&lt;?&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1402">table</a></pre>
 </li>
 </ul>
 </li>
@@ -266,7 +266,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncTableTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1387">AsyncTableTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1404">AsyncTableTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
                <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -285,7 +285,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockList">
 <li class="blockList">
 <h4>onStartup</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1392">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1409">onStartup</a>()
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -301,7 +301,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Async
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1397">onTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html#line.1414">onTakedown</a>()
          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>


[25/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627

<TRUNCATED>

[06/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    String cmdName = nu

<TRUNCATED>

[05/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    String cmdName = null;<a name="line.627"></a

<TRUNCATED>

[29/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span clas

<TRUNCATED>

[28/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    Stri

<TRUNCATED>

[34/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncScanTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   

<TRUNCATED>

[24/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   

<TRUNCATED>

[36/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomReadTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span clas

<TRUNCATED>

[42/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
index 1c14b10..4639252 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1339">PerformanceEvaluation.AsyncTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1356">PerformanceEvaluation.AsyncTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></pre>
 </li>
 </ul>
@@ -230,7 +230,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>connection</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.AsyncConnection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1340">connection</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.AsyncConnection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1357">connection</a></pre>
 </li>
 </ul>
 </li>
@@ -247,7 +247,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>AsyncTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1342">AsyncTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1359">AsyncTest</a>(org.apache.hadoop.hbase.client.AsyncConnection&nbsp;con,
           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -266,7 +266,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockList">
 <li class="blockList">
 <h4>createConnection</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1348">createConnection</a>()</pre>
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1365">createConnection</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#createConnection--">createConnection</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>
@@ -279,7 +279,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>closeConnection</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1359">closeConnection</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTest.html#line.1376">closeConnection</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
index 4092ce1..a75ee34 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1630">PerformanceEvaluation.BufferedMutatorTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1664">PerformanceEvaluation.BufferedMutatorTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.Test</a></pre>
 </li>
 </ul>
@@ -253,7 +253,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockList">
 <li class="blockList">
 <h4>mutator</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.BufferedMutator <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1631">mutator</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.BufferedMutator <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1665">mutator</a></pre>
 </li>
 </ul>
 <a name="table">
@@ -262,7 +262,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>table</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1632">table</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1666">table</a></pre>
 </li>
 </ul>
 </li>
@@ -279,7 +279,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>BufferedMutatorTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1634">BufferedMutatorTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1668">BufferedMutatorTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -298,7 +298,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockList">
 <li class="blockList">
 <h4>onStartup</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1639">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1673">onStartup</a>()
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -314,7 +314,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1647">onTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html#line.1681">onTakedown</a>()
          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
index 49cdd9c..217e0da 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html
@@ -132,7 +132,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1944">PerformanceEvaluation.CASTableTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1993">PerformanceEvaluation.CASTableTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 <div class="block">Base class for operations that are CAS-like; that read a value and then set it based off what
  they read. In this category is increment, append, checkAndPut, etc.
@@ -278,7 +278,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>qualifier</h4>
-<pre>private final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1945">qualifier</a></pre>
+<pre>private final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1994">qualifier</a></pre>
 </li>
 </ul>
 </li>
@@ -295,7 +295,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CASTableTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1946">CASTableTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1995">CASTableTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
              <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
              <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -314,7 +314,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>getQualifier</h4>
-<pre>byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1951">getQualifier</a>()</pre>
+<pre>byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.2000">getQualifier</a>()</pre>
 </li>
 </ul>
 <a name="getStartRow--">
@@ -323,7 +323,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartRow</h4>
-<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1956">getStartRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.2005">getStartRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getStartRow--">getStartRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>
@@ -336,7 +336,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getLastRow</h4>
-<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.1961">getLastRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html#line.2010">getLastRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getLastRow--">getLastRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
index a384484..9a02d7c 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2029">PerformanceEvaluation.CheckAndDeleteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2092">PerformanceEvaluation.CheckAndDeleteTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CASTableTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CheckAndDeleteTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2030">CheckAndDeleteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2093">CheckAndDeleteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2035">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html#line.2098">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
index 3ea16e6..b378829 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1993">PerformanceEvaluation.CheckAndMutateTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2054">PerformanceEvaluation.CheckAndMutateTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CASTableTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CheckAndMutateTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.1994">CheckAndMutateTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.2055">CheckAndMutateTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.1999">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndMutateTest.html#line.2060">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
index 04aefab..4c7b88a 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2012">PerformanceEvaluation.CheckAndPutTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2074">PerformanceEvaluation.CheckAndPutTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CASTableTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CheckAndPutTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2013">CheckAndPutTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2075">CheckAndPutTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2018">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndPutTest.html#line.2080">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
index 178b6ea..ad58a4d 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.595">PerformanceEvaluation.CmdDescriptor</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.602">PerformanceEvaluation.CmdDescriptor</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Describes a command.</div>
 </li>
@@ -220,7 +220,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cmdClass</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.596">cmdClass</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.603">cmdClass</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -229,7 +229,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>name</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.597">name</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.604">name</a></pre>
 </li>
 </ul>
 <a name="description">
@@ -238,7 +238,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>description</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.598">description</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.605">description</a></pre>
 </li>
 </ul>
 </li>
@@ -255,7 +255,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>CmdDescriptor</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.600">CmdDescriptor</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmdClass,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.607">CmdDescriptor</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmdClass,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
               <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;description)</pre>
 </li>
@@ -274,7 +274,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getCmdClass</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.606">getCmdClass</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.613">getCmdClass</a>()</pre>
 </li>
 </ul>
 <a name="getName--">
@@ -283,7 +283,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getName</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.610">getName</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.617">getName</a>()</pre>
 </li>
 </ul>
 <a name="getDescription--">
@@ -292,7 +292,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getDescription</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.614">getDescription</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html#line.621">getDescription</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
index 074c441..ee36c90 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected static enum <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.210">PerformanceEvaluation.Counter</a>
+<pre>protected static enum <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.211">PerformanceEvaluation.Counter</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang">Enum</a>&lt;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a>&gt;</pre>
 <div class="block">Enum for map metrics.  Keep it out here rather than inside in the Map
  inner-class so we can find associated properties.</div>
@@ -216,7 +216,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>ELAPSED_TIME</h4>
-<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.212">ELAPSED_TIME</a></pre>
+<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.213">ELAPSED_TIME</a></pre>
 <div class="block">elapsed time</div>
 </li>
 </ul>
@@ -226,7 +226,7 @@ the order they are declared.</div>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ROWS</h4>
-<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.214">ROWS</a></pre>
+<pre>public static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.215">ROWS</a></pre>
 <div class="block">number of rows</div>
 </li>
 </ul>
@@ -244,7 +244,7 @@ the order they are declared.</div>
 <ul class="blockList">
 <li class="blockList">
 <h4>values</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a>[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.210">values</a>()</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a>[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.211">values</a>()</pre>
 <div class="block">Returns an array containing the constants of this enum type, in
 the order they are declared.  This method may be used to iterate
 over the constants as follows:
@@ -264,7 +264,7 @@ for (PerformanceEvaluation.Counter c : PerformanceEvaluation.Counter.values())
 <ul class="blockListLast">
 <li class="blockList">
 <h4>valueOf</h4>
-<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.210">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
+<pre>public static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase">PerformanceEvaluation.Counter</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html#line.211">valueOf</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name)</pre>
 <div class="block">Returns the enum constant of this type with the specified name.
 The string must match <i>exactly</i> an identifier used to declare an
 enum constant in this type.  (Extraneous whitespace characters are 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
index 9029f66..59f08e5 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
@@ -118,7 +118,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>public static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.265">PerformanceEvaluation.EvaluationMapTask</a>
+<pre>public static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.266">PerformanceEvaluation.EvaluationMapTask</a>
 extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,org.apache.hadoop.io.Text,org.apache.hadoop.io.LongWritable,org.apache.hadoop.io.LongWritable&gt;</pre>
 <div class="block">MapReduce job that runs a performance evaluation client in each map task.</div>
 </li>
@@ -252,7 +252,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockList">
 <li class="blockList">
 <h4>CMD_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.269">CMD_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.270">CMD_KEY</a></pre>
 <div class="block">configuration parameter name that contains the command</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -266,7 +266,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockList">
 <li class="blockList">
 <h4>PE_KEY</h4>
-<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.271">PE_KEY</a></pre>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.272">PE_KEY</a></pre>
 <div class="block">configuration parameter name that contains the PE impl</div>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
@@ -280,7 +280,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockListLast">
 <li class="blockList">
 <h4>cmd</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.Test</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.273">cmd</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.Test</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.274">cmd</a></pre>
 </li>
 </ul>
 </li>
@@ -297,7 +297,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockListLast">
 <li class="blockList">
 <h4>EvaluationMapTask</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.265">EvaluationMapTask</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.266">EvaluationMapTask</a>()</pre>
 </li>
 </ul>
 </li>
@@ -314,7 +314,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockList">
 <li class="blockList">
 <h4>setup</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.276">setup</a>(org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context)
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.277">setup</a>(org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context)
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -332,7 +332,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockList">
 <li class="blockList">
 <h4>forName</h4>
-<pre>private&nbsp;&lt;Type&gt;&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends Type&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.290">forName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;className,
+<pre>private&nbsp;&lt;Type&gt;&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends Type&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.291">forName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;className,
                                              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;Type&gt;&nbsp;type)</pre>
 </li>
 </ul>
@@ -342,7 +342,7 @@ extends org.apache.hadoop.mapreduce.Mapper&lt;org.apache.hadoop.io.LongWritable,
 <ul class="blockListLast">
 <li class="blockList">
 <h4>map</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.299">map</a>(org.apache.hadoop.io.LongWritable&nbsp;key,
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html#line.300">map</a>(org.apache.hadoop.io.LongWritable&nbsp;key,
                    org.apache.hadoop.io.Text&nbsp;value,
                    org.apache.hadoop.mapreduce.Mapper.Context&nbsp;context)
             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
index 54a6284..600d0f9 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2106">PerformanceEvaluation.FilteredScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2178">PerformanceEvaluation.FilteredScanTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -264,7 +264,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>LOG</h4>
-<pre>protected static final&nbsp;org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2107">LOG</a></pre>
+<pre>protected static final&nbsp;org.slf4j.Logger <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2179">LOG</a></pre>
 </li>
 </ul>
 </li>
@@ -281,7 +281,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>FilteredScanTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2109">FilteredScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2181">FilteredScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                  <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                  <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -300,7 +300,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2114">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2186">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -316,7 +316,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>constructScan</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.Scan&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2131">constructScan</a>(byte[]&nbsp;valuePrefix)
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.Scan&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html#line.2203">constructScan</a>(byte[]&nbsp;valuePrefix)
                                                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
index 585fb01..9f9abf3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1966">PerformanceEvaluation.IncrementTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2015">PerformanceEvaluation.IncrementTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CASTableTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>IncrementTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.1967">IncrementTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.2016">IncrementTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
               <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
               <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CASTa
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.1972">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html#line.2021">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
index 424c970..0ed43d3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1798">PerformanceEvaluation.RandomReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1838">PerformanceEvaluation.RandomReadTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -276,7 +276,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>consistency</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.client.Consistency <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1799">consistency</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.client.Consistency <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1839">consistency</a></pre>
 </li>
 </ul>
 <a name="gets">
@@ -285,7 +285,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>gets</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;org.apache.hadoop.hbase.client.Get&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1800">gets</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html?is-external=true" title="class or interface in java.util">ArrayList</a>&lt;org.apache.hadoop.hbase.client.Get&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1840">gets</a></pre>
 </li>
 </ul>
 <a name="rd">
@@ -294,7 +294,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>rd</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1801">rd</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1841">rd</a></pre>
 </li>
 </ul>
 </li>
@@ -311,7 +311,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomReadTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1803">RandomReadTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1843">RandomReadTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -330,7 +330,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1813">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1853">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
              <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -348,7 +348,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>getReportingPeriod</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1844">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1887">getReportingPeriod</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>
@@ -361,7 +361,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testTakedown</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1850">testTakedown</a>()
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html#line.1893">testTakedown</a>()
                      throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
index 00cf600..422739e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1787">PerformanceEvaluation.RandomScanWithRange10000Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1827">PerformanceEvaluation.RandomScanWithRange10000Test</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomScanWithRange10000Test</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html#line.1788">RandomScanWithRange10000Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html#line.1828">RandomScanWithRange10000Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                              <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                              <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getStartAndStopRow</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html#line.1793">getStartAndStopRow</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html#line.1833">getStartAndStopRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#getStartAndStopRow--">getStartAndStopRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
index 25fdc97..85f1d5f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1776">PerformanceEvaluation.RandomScanWithRange1000Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1816">PerformanceEvaluation.RandomScanWithRange1000Test</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomScanWithRange1000Test</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html#line.1777">RandomScanWithRange1000Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html#line.1817">RandomScanWithRange1000Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                             <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                             <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getStartAndStopRow</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html#line.1782">getStartAndStopRow</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html#line.1822">getStartAndStopRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#getStartAndStopRow--">getStartAndStopRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
index 249d530..7c91a65 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1765">PerformanceEvaluation.RandomScanWithRange100Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1805">PerformanceEvaluation.RandomScanWithRange100Test</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomScanWithRange100Test</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html#line.1766">RandomScanWithRange100Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html#line.1806">RandomScanWithRange100Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                            <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                            <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getStartAndStopRow</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html#line.1771">getStartAndStopRow</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange100Test.html#line.1811">getStartAndStopRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#getStartAndStopRow--">getStartAndStopRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
index 4b37c6e..204decc 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
@@ -133,7 +133,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1754">PerformanceEvaluation.RandomScanWithRange10Test</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1794">PerformanceEvaluation.RandomScanWithRange10Test</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></pre>
 </li>
 </ul>
@@ -261,7 +261,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomScanWithRange10Test</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html#line.1755">RandomScanWithRange10Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html#line.1795">RandomScanWithRange10Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -280,7 +280,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Rando
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getStartAndStopRow</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html#line.1760">getStartAndStopRow</a>()</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html#line.1800">getStartAndStopRow</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#getStartAndStopRow--">getStartAndStopRow</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RandomScanWithRangeTest</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
index 878fa44..ef04864 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
@@ -132,7 +132,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1697">PerformanceEvaluation.RandomScanWithRangeTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1734">PerformanceEvaluation.RandomScanWithRangeTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -265,7 +265,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomScanWithRangeTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1698">RandomScanWithRangeTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1735">RandomScanWithRangeTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                         <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                         <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -284,7 +284,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1703">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1740">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -300,7 +300,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartAndStopRow</h4>
-<pre>protected abstract&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1739">getStartAndStopRow</a>()</pre>
+<pre>protected abstract&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1779">getStartAndStopRow</a>()</pre>
 </li>
 </ul>
 <a name="generateStartAndStopRows-int-">
@@ -309,7 +309,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>generateStartAndStopRows</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1741">generateStartAndStopRows</a>(int&nbsp;maxRange)</pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.util.Pair&lt;byte[],byte[]&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1781">generateStartAndStopRows</a>(int&nbsp;maxRange)</pre>
 </li>
 </ul>
 <a name="getReportingPeriod--">
@@ -318,7 +318,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getReportingPeriod</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1748">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html#line.1788">getReportingPeriod</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
index 200c764..fba7522 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1653">PerformanceEvaluation.RandomSeekScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1687">PerformanceEvaluation.RandomSeekScanTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -253,7 +253,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomSeekScanTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1654">RandomSeekScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1688">RandomSeekScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -272,7 +272,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1659">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1693">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -288,7 +288,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>getReportingPeriod</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1690">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomSeekScanTest.html#line.1727">getReportingPeriod</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#getReportingPeriod--">getReportingPeriod</a></code>&nbsp;in class&nbsp;<code><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></code></dd>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
index 5ae928e..14667f1 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1859">PerformanceEvaluation.RandomWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1902">PerformanceEvaluation.RandomWriteTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.BufferedMutatorTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Buffe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RandomWriteTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1860">RandomWriteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1903">RandomWriteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Buffe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1865">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomWriteTest.html#line.1908">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
index 2c40f78..b615329 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>protected static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.217">PerformanceEvaluation.RunResult</a>
+<pre>protected static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.218">PerformanceEvaluation.RunResult</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>
 implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&gt;</pre>
 </li>
@@ -215,7 +215,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>duration</h4>
-<pre>public final&nbsp;long <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.223">duration</a></pre>
+<pre>public final&nbsp;long <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.224">duration</a></pre>
 </li>
 </ul>
 <a name="hist">
@@ -224,7 +224,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>hist</h4>
-<pre>public final&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.224">hist</a></pre>
+<pre>public final&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.225">hist</a></pre>
 </li>
 </ul>
 </li>
@@ -241,7 +241,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>RunResult</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.218">RunResult</a>(long&nbsp;duration,
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.219">RunResult</a>(long&nbsp;duration,
                  com.codahale.metrics.Histogram&nbsp;hist)</pre>
 </li>
 </ul>
@@ -259,7 +259,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockList">
 <li class="blockList">
 <h4>toString</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.227">toString</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.228">toString</a>()</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true#toString--" title="class or interface in java.lang">toString</a></code>&nbsp;in class&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></code></dd>
@@ -272,7 +272,7 @@ implements <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparab
 <ul class="blockListLast">
 <li class="blockList">
 <h4>compareTo</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.231">compareTo</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&nbsp;o)</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html#line.232">compareTo</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&nbsp;o)</pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
 <dd><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true#compareTo-T-" title="class or interface in java.lang">compareTo</a></code>&nbsp;in interface&nbsp;<code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&gt;</code></dd>


[27/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.CheckAndDeleteTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="so

<TRUNCATED>

[33/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialReadTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.6

<TRUNCATED>

[02/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    String cmdName = null;<a name="line.627"></a>
-<span class="sourceLin

<TRUNCATED>

[15/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10Test.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a na

<TRUNCATED>

[04/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    String cmdName = null;<a

<TRUNCATED>

[03/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    String cm

<TRUNCATED>

[14/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRangeTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.6

<TRUNCATED>

[10/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    String cmdName = null;<a

<TRUNCATED>

[41/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
index 52d05d8..df30a00 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1896">PerformanceEvaluation.ScanTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1942">PerformanceEvaluation.ScanTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -264,7 +264,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testScanner</h4>
-<pre>private&nbsp;org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1897">testScanner</a></pre>
+<pre>private&nbsp;org.apache.hadoop.hbase.client.ResultScanner <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1943">testScanner</a></pre>
 </li>
 </ul>
 </li>
@@ -281,7 +281,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>ScanTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1899">ScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1945">ScanTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -300,7 +300,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockList">
 <li class="blockList">
 <h4>testTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1904">testTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1950">testTakedown</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Overrides:</span></dt>
@@ -316,7 +316,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1913">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.ScanTest.html#line.1959">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
index daa53a1..fe182c6 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2048">PerformanceEvaluation.SequentialReadTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2112">PerformanceEvaluation.SequentialReadTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TableTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SequentialReadTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2049">SequentialReadTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2113">SequentialReadTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                    <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Table
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2054">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html#line.2118">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
index 4c8f51d..d5d599f 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
@@ -128,7 +128,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2069">PerformanceEvaluation.SequentialWriteTest</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2138">PerformanceEvaluation.SequentialWriteTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.BufferedMutatorTest.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.BufferedMutatorTest</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Buffe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>SequentialWriteTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2070">SequentialWriteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2139">SequentialWriteTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
                     <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -268,7 +268,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Buffe
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2075">testRow</a>(int&nbsp;i)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html#line.2144">testRow</a>(int&nbsp;i)
       throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
index 532dda5..02fdcb3 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
@@ -105,7 +105,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static interface <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.253">PerformanceEvaluation.Status</a></pre>
+<pre>static interface <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.254">PerformanceEvaluation.Status</a></pre>
 <div class="block">Implementations can have their status set.</div>
 </li>
 </ul>
@@ -152,7 +152,7 @@ var activeTableTab = "activeTableTab";
 <ul class="blockListLast">
 <li class="blockList">
 <h4>setStatus</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html#line.259">setStatus</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html#line.260">setStatus</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;msg)
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <div class="block">Sets status</div>
 <dl>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
index 13d490f..33ba00e 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html
@@ -127,7 +127,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1366">PerformanceEvaluation.TableTest</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1383">PerformanceEvaluation.TableTest</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.Test</a></pre>
 </li>
 </ul>
@@ -249,7 +249,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>table</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1367">table</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.Table <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1384">table</a></pre>
 </li>
 </ul>
 </li>
@@ -266,7 +266,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TableTest</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1369">TableTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1386">TableTest</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -285,7 +285,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockList">
 <li class="blockList">
 <h4>onStartup</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1374">onStartup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1391">onStartup</a>()
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -301,7 +301,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Test.
 <ul class="blockListLast">
 <li class="blockList">
 <h4>onTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1379">onTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TableTest.html#line.1396">onTakedown</a>()
          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
index 3320f91..409c387 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html
@@ -122,7 +122,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1316">PerformanceEvaluation.Test</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1333">PerformanceEvaluation.Test</a>
 extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a></pre>
 </li>
 </ul>
@@ -230,7 +230,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>connection</h4>
-<pre>protected&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1317">connection</a></pre>
+<pre>protected&nbsp;org.apache.hadoop.hbase.client.Connection <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1334">connection</a></pre>
 </li>
 </ul>
 </li>
@@ -247,7 +247,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>Test</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1319">Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1336">Test</a>(org.apache.hadoop.hbase.client.Connection&nbsp;con,
      <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
      <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 </li>
@@ -266,7 +266,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockList">
 <li class="blockList">
 <h4>createConnection</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1325">createConnection</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1342">createConnection</a>()
                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -282,7 +282,7 @@ extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestB
 <ul class="blockListLast">
 <li class="blockList">
 <h4>closeConnection</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1332">closeConnection</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Test.html#line.1349">closeConnection</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
index d10e033..77279ca 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html
@@ -117,7 +117,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1040">PerformanceEvaluation.TestBase</a>
+<pre>abstract static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.1057">PerformanceEvaluation.TestBase</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -372,7 +372,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>randomSeed</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1043">randomSeed</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1060">randomSeed</a></pre>
 </li>
 </ul>
 <a name="everyN">
@@ -381,7 +381,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>everyN</h4>
-<pre>private final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1048">everyN</a></pre>
+<pre>private final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1065">everyN</a></pre>
 </li>
 </ul>
 <a name="rand">
@@ -390,7 +390,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>rand</h4>
-<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1050">rand</a></pre>
+<pre>protected final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1067">rand</a></pre>
 </li>
 </ul>
 <a name="conf">
@@ -399,7 +399,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>conf</h4>
-<pre>protected final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1051">conf</a></pre>
+<pre>protected final&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1068">conf</a></pre>
 </li>
 </ul>
 <a name="opts">
@@ -408,7 +408,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>opts</h4>
-<pre>protected final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1052">opts</a></pre>
+<pre>protected final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1069">opts</a></pre>
 </li>
 </ul>
 <a name="status">
@@ -417,7 +417,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>status</h4>
-<pre>private final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1054">status</a></pre>
+<pre>private final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1071">status</a></pre>
 </li>
 </ul>
 <a name="traceSampler">
@@ -426,7 +426,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>traceSampler</h4>
-<pre>private final&nbsp;org.apache.htrace.core.Sampler <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1055">traceSampler</a></pre>
+<pre>private final&nbsp;org.apache.htrace.core.Sampler <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1072">traceSampler</a></pre>
 </li>
 </ul>
 <a name="receiverHost">
@@ -435,7 +435,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>receiverHost</h4>
-<pre>private final&nbsp;org.apache.hadoop.hbase.trace.SpanReceiverHost <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1056">receiverHost</a></pre>
+<pre>private final&nbsp;org.apache.hadoop.hbase.trace.SpanReceiverHost <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1073">receiverHost</a></pre>
 </li>
 </ul>
 <a name="testName">
@@ -444,7 +444,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testName</h4>
-<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1058">testName</a></pre>
+<pre>private&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1075">testName</a></pre>
 </li>
 </ul>
 <a name="latencyHistogram">
@@ -453,7 +453,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>latencyHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1059">latencyHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1076">latencyHistogram</a></pre>
 </li>
 </ul>
 <a name="valueSizeHistogram">
@@ -462,7 +462,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>valueSizeHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1060">valueSizeHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1077">valueSizeHistogram</a></pre>
 </li>
 </ul>
 <a name="rpcCallsHistogram">
@@ -471,7 +471,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>rpcCallsHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1061">rpcCallsHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1078">rpcCallsHistogram</a></pre>
 </li>
 </ul>
 <a name="remoteRpcCallsHistogram">
@@ -480,7 +480,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>remoteRpcCallsHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1062">remoteRpcCallsHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1079">remoteRpcCallsHistogram</a></pre>
 </li>
 </ul>
 <a name="millisBetweenNextHistogram">
@@ -489,7 +489,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>millisBetweenNextHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1063">millisBetweenNextHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1080">millisBetweenNextHistogram</a></pre>
 </li>
 </ul>
 <a name="regionsScannedHistogram">
@@ -498,7 +498,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>regionsScannedHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1064">regionsScannedHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1081">regionsScannedHistogram</a></pre>
 </li>
 </ul>
 <a name="bytesInResultsHistogram">
@@ -507,7 +507,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>bytesInResultsHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1065">bytesInResultsHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1082">bytesInResultsHistogram</a></pre>
 </li>
 </ul>
 <a name="bytesInRemoteResultsHistogram">
@@ -516,7 +516,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>bytesInRemoteResultsHistogram</h4>
-<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1066">bytesInRemoteResultsHistogram</a></pre>
+<pre>private&nbsp;com.codahale.metrics.Histogram <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1083">bytesInRemoteResultsHistogram</a></pre>
 </li>
 </ul>
 <a name="zipf">
@@ -525,7 +525,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>zipf</h4>
-<pre>private&nbsp;<a href="../../../../org/apache/hadoop/hbase/io/hfile/RandomDistribution.Zipf.html" title="class in org.apache.hadoop.hbase.io.hfile">RandomDistribution.Zipf</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1067">zipf</a></pre>
+<pre>private&nbsp;<a href="../../../../org/apache/hadoop/hbase/io/hfile/RandomDistribution.Zipf.html" title="class in org.apache.hadoop.hbase.io.hfile">RandomDistribution.Zipf</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1084">zipf</a></pre>
 </li>
 </ul>
 </li>
@@ -542,7 +542,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestBase</h4>
-<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1073">TestBase</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
+<pre><a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1090">TestBase</a>(org.apache.hadoop.conf.Configuration&nbsp;conf,
          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;options,
          <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Status.html" title="interface in org.apache.hadoop.hbase">PerformanceEvaluation.Status</a>&nbsp;status)</pre>
 <div class="block">Note that all subclasses of this class must provide a public constructor
@@ -563,7 +563,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>nextRandomSeed</h4>
-<pre>private static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1045">nextRandomSeed</a>()</pre>
+<pre>private static&nbsp;long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1062">nextRandomSeed</a>()</pre>
 </li>
 </ul>
 <a name="getValueLength-java.util.Random-">
@@ -572,7 +572,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getValueLength</h4>
-<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1094">getValueLength</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;r)</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1111">getValueLength</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;r)</pre>
 </li>
 </ul>
 <a name="updateValueSize-org.apache.hadoop.hbase.client.Result:A-">
@@ -581,7 +581,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateValueSize</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1104">updateValueSize</a>(org.apache.hadoop.hbase.client.Result[]&nbsp;rs)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1121">updateValueSize</a>(org.apache.hadoop.hbase.client.Result[]&nbsp;rs)
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -595,7 +595,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateValueSize</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1109">updateValueSize</a>(org.apache.hadoop.hbase.client.Result&nbsp;r)
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1126">updateValueSize</a>(org.apache.hadoop.hbase.client.Result&nbsp;r)
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -609,7 +609,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateValueSize</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1118">updateValueSize</a>(int&nbsp;valueSize)</pre>
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1135">updateValueSize</a>(int&nbsp;valueSize)</pre>
 </li>
 </ul>
 <a name="updateScanMetrics-org.apache.hadoop.hbase.client.metrics.ScanMetrics-">
@@ -618,7 +618,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>updateScanMetrics</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1123">updateScanMetrics</a>(org.apache.hadoop.hbase.client.metrics.ScanMetrics&nbsp;metrics)</pre>
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1140">updateScanMetrics</a>(org.apache.hadoop.hbase.client.metrics.ScanMetrics&nbsp;metrics)</pre>
 </li>
 </ul>
 <a name="generateStatus-int-int-int-">
@@ -627,7 +627,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>generateStatus</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1151">generateStatus</a>(int&nbsp;sr,
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1168">generateStatus</a>(int&nbsp;sr,
                       int&nbsp;i,
                       int&nbsp;lr)</pre>
 </li>
@@ -638,7 +638,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isRandomValueSize</h4>
-<pre>boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1156">isRandomValueSize</a>()</pre>
+<pre>boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1173">isRandomValueSize</a>()</pre>
 </li>
 </ul>
 <a name="getReportingPeriod--">
@@ -647,7 +647,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getReportingPeriod</h4>
-<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1160">getReportingPeriod</a>()</pre>
+<pre>protected&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1177">getReportingPeriod</a>()</pre>
 </li>
 </ul>
 <a name="getLatencyHistogram--">
@@ -656,7 +656,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getLatencyHistogram</h4>
-<pre>public&nbsp;com.codahale.metrics.Histogram&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1167">getLatencyHistogram</a>()</pre>
+<pre>public&nbsp;com.codahale.metrics.Histogram&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1184">getLatencyHistogram</a>()</pre>
 <div class="block">Populated by testTakedown. Only implemented by RandomReadTest at the moment.</div>
 </li>
 </ul>
@@ -666,7 +666,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testSetup</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1171">testSetup</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1188">testSetup</a>()
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -680,7 +680,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createConnection</h4>
-<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1187">createConnection</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1204">createConnection</a>()
                         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -694,7 +694,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>onStartup</h4>
-<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1189">onStartup</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1206">onStartup</a>()
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -708,7 +708,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTakedown</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1191">testTakedown</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1208">testTakedown</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -722,7 +722,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>onTakedown</h4>
-<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1235">onTakedown</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1252">onTakedown</a>()
                   throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -736,7 +736,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>closeConnection</h4>
-<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1237">closeConnection</a>()
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1254">closeConnection</a>()
                        throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -750,7 +750,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>test</h4>
-<pre>long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1244">test</a>()
+<pre>long&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1261">test</a>()
    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
           <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -766,7 +766,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartRow</h4>
-<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1256">getStartRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1273">getStartRow</a>()</pre>
 </li>
 </ul>
 <a name="getLastRow--">
@@ -775,7 +775,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getLastRow</h4>
-<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1260">getLastRow</a>()</pre>
+<pre>int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1277">getLastRow</a>()</pre>
 </li>
 </ul>
 <a name="testTimed--">
@@ -784,7 +784,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testTimed</h4>
-<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1267">testTimed</a>()
+<pre>void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1284">testTimed</a>()
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <div class="block">Provides an extension point for tests that don't want a per row invocation.</div>
@@ -801,7 +801,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getShortLatencyReport</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1298">getShortLatencyReport</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1315">getShortLatencyReport</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Subset of the histograms' calculation.</dd>
@@ -814,7 +814,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getShortValueSizeReport</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1305">getShortValueSizeReport</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1322">getShortValueSizeReport</a>()</pre>
 <dl>
 <dt><span class="returnLabel">Returns:</span></dt>
 <dd>Subset of the histograms' calculation.</dd>
@@ -827,7 +827,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testRow</h4>
-<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1313">testRow</a>(int&nbsp;i)
+<pre>abstract&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html#line.1330">testRow</a>(int&nbsp;i)
                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>


[38/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html
index d0285e1..66519d2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.32">TestRegionServerAccounting</a>
+<pre>public class <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.33">TestRegionServerAccounting</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -133,6 +133,14 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colFirst"><code>static <a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#CLASS_RULE">CLASS_RULE</a></span></code>&nbsp;</td>
 </tr>
+<tr class="rowColor">
+<td class="colFirst"><code>private static org.apache.hadoop.conf.Configuration</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#conf">conf</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
+<td class="colFirst"><code>private static float</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#DEFAULT_MEMSTORE_SIZE">DEFAULT_MEMSTORE_SIZE</a></span></code>&nbsp;</td>
+</tr>
 </table>
 </li>
 </ul>
@@ -167,26 +175,30 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 </tr>
 <tr id="i0" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOffheapMemstoreHigherWaterMarkLimitsDueToDataSize--">testOffheapMemstoreHigherWaterMarkLimitsDueToDataSize</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#setUpConf--">setUpConf</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i1" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOffheapMemstoreHigherWaterMarkLimitsDueToHeapSize--">testOffheapMemstoreHigherWaterMarkLimitsDueToHeapSize</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOffheapMemstoreHigherWaterMarkLimitsDueToDataSize--">testOffheapMemstoreHigherWaterMarkLimitsDueToDataSize</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i2" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOffheapMemstoreLowerWaterMarkLimitsDueToDataSize--">testOffheapMemstoreLowerWaterMarkLimitsDueToDataSize</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOffheapMemstoreHigherWaterMarkLimitsDueToHeapSize--">testOffheapMemstoreHigherWaterMarkLimitsDueToHeapSize</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i3" class="rowColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOffheapMemstoreLowerWaterMarkLimitsDueToHeapSize--">testOffheapMemstoreLowerWaterMarkLimitsDueToHeapSize</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOffheapMemstoreLowerWaterMarkLimitsDueToDataSize--">testOffheapMemstoreLowerWaterMarkLimitsDueToDataSize</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i4" class="altColor">
 <td class="colFirst"><code>void</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOnheapMemstoreHigherWaterMarkLimits--">testOnheapMemstoreHigherWaterMarkLimits</a></span>()</code>&nbsp;</td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOffheapMemstoreLowerWaterMarkLimitsDueToHeapSize--">testOffheapMemstoreLowerWaterMarkLimitsDueToHeapSize</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i5" class="rowColor">
 <td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOnheapMemstoreHigherWaterMarkLimits--">testOnheapMemstoreHigherWaterMarkLimits</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i6" class="altColor">
+<td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#testOnheapMemstoreLowerWaterMarkLimits--">testOnheapMemstoreLowerWaterMarkLimits</a></span>()</code>&nbsp;</td>
 </tr>
 </table>
@@ -214,10 +226,32 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <a name="CLASS_RULE">
 <!--   -->
 </a>
-<ul class="blockListLast">
+<ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.35">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.36">CLASS_RULE</a></pre>
+</li>
+</ul>
+<a name="DEFAULT_MEMSTORE_SIZE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>DEFAULT_MEMSTORE_SIZE</h4>
+<pre>private static final&nbsp;float <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.39">DEFAULT_MEMSTORE_SIZE</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../../constant-values.html#org.apache.hadoop.hbase.regionserver.TestRegionServerAccounting.DEFAULT_MEMSTORE_SIZE">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="conf">
+<!--   -->
+</a>
+<ul class="blockListLast">
+<li class="blockList">
+<h4>conf</h4>
+<pre>private static&nbsp;org.apache.hadoop.conf.Configuration <a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.41">conf</a></pre>
 </li>
 </ul>
 </li>
@@ -234,7 +268,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestRegionServerAccounting</h4>
-<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.32">TestRegionServerAccounting</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.33">TestRegionServerAccounting</a>()</pre>
 </li>
 </ul>
 </li>
@@ -245,13 +279,22 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <!--   -->
 </a>
 <h3>Method Detail</h3>
+<a name="setUpConf--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setUpConf</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.44">setUpConf</a>()</pre>
+</li>
+</ul>
 <a name="testOnheapMemstoreHigherWaterMarkLimits--">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>testOnheapMemstoreHigherWaterMarkLimits</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.39">testOnheapMemstoreHigherWaterMarkLimits</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.50">testOnheapMemstoreHigherWaterMarkLimits</a>()</pre>
 </li>
 </ul>
 <a name="testOnheapMemstoreLowerWaterMarkLimits--">
@@ -260,7 +303,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testOnheapMemstoreLowerWaterMarkLimits</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.52">testOnheapMemstoreLowerWaterMarkLimits</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.61">testOnheapMemstoreLowerWaterMarkLimits</a>()</pre>
 </li>
 </ul>
 <a name="testOffheapMemstoreHigherWaterMarkLimitsDueToDataSize--">
@@ -269,7 +312,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testOffheapMemstoreHigherWaterMarkLimitsDueToDataSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.65">testOffheapMemstoreHigherWaterMarkLimitsDueToDataSize</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.72">testOffheapMemstoreHigherWaterMarkLimitsDueToDataSize</a>()</pre>
 </li>
 </ul>
 <a name="testOffheapMemstoreHigherWaterMarkLimitsDueToHeapSize--">
@@ -278,7 +321,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testOffheapMemstoreHigherWaterMarkLimitsDueToHeapSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.80">testOffheapMemstoreHigherWaterMarkLimitsDueToHeapSize</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.86">testOffheapMemstoreHigherWaterMarkLimitsDueToHeapSize</a>()</pre>
 </li>
 </ul>
 <a name="testOffheapMemstoreLowerWaterMarkLimitsDueToDataSize--">
@@ -287,7 +330,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testOffheapMemstoreLowerWaterMarkLimitsDueToDataSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.96">testOffheapMemstoreLowerWaterMarkLimitsDueToDataSize</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.101">testOffheapMemstoreLowerWaterMarkLimitsDueToDataSize</a>()</pre>
 </li>
 </ul>
 <a name="testOffheapMemstoreLowerWaterMarkLimitsDueToHeapSize--">
@@ -296,7 +339,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>testOffheapMemstoreLowerWaterMarkLimitsDueToHeapSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.111">testOffheapMemstoreLowerWaterMarkLimitsDueToHeapSize</a>()</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../../src-html/org/apache/hadoop/hbase/regionserver/TestRegionServerAccounting.html#line.115">testOffheapMemstoreLowerWaterMarkLimitsDueToHeapSize</a>()</pre>
 </li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
index ffff9f6..ab8055b 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/regionserver/package-tree.html
@@ -655,11 +655,11 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/DataBlockEncodingTool.Manipulation.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">DataBlockEncodingTool.Manipulation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestAtomicOperation.TestStep.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestAtomicOperation.TestStep</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestRegionServerReadRequestMetrics.Metric.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestRegionServerReadRequestMetrics.Metric</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestMultiLogThreshold.ActionType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestMultiLogThreshold.ActionType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.regionserver.<a href="../../../../../org/apache/hadoop/hbase/regionserver/TestCacheOnWriteInSchema.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.regionserver"><span class="typeNameLink">TestCacheOnWriteInSchema.CacheOnWriteType</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
index 1d0bd63..bae8c22 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/test/package-tree.html
@@ -253,9 +253,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Verify.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Verify.Counts</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestBigLinkedList.Generator.Counts.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestBigLinkedList.Generator.Counts</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestLoadAndVerify.Counters</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.test.<a href="../../../../../org/apache/hadoop/hbase/test/IntegrationTestWithCellVisibilityLoadAndVerify.Counters.html" title="enum in org.apache.hadoop.hbase.test"><span class="typeNameLink">IntegrationTestWithCellVisibilityLoadAndVerify.Counters</span></a></li>
 </ul>
 </li>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
index cc06fe6..4edd3f8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/wal/package-tree.html
@@ -139,9 +139,9 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
+<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/FaultyFSLog.FailureType.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">FaultyFSLog.FailureType</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/TestWALSplit.Corruptions.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">TestWALSplit.Corruptions</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.wal.<a href="../../../../../org/apache/hadoop/hbase/wal/IOTestProvider.AllowedOperations.html" title="enum in org.apache.hadoop.hbase.wal"><span class="typeNameLink">IOTestProvider.AllowedOperations</span></a></li>
 </ul>
 </li>
 </ul>


[08/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialWriteTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span clas

<TRUNCATED>

[39/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
index b684b50..0653ad2 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.html
@@ -352,56 +352,60 @@ implements org.apache.hadoop.util.Tool</pre>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#DEFAULT_VALUE_LENGTH">DEFAULT_VALUE_LENGTH</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
-<td class="colFirst"><code>static byte[]</code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#FAMILY_NAME">FAMILY_NAME</a></span></code>&nbsp;</td>
+<td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#FAMILY_NAME_BASE">FAMILY_NAME_BASE</a></span></code>&nbsp;</td>
 </tr>
 <tr class="altColor">
+<td class="colFirst"><code>static byte[]</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#FAMILY_ZERO">FAMILY_ZERO</a></span></code>&nbsp;</td>
+</tr>
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html?is-external=true" title="class or interface in java.text">DecimalFormat</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#FMT">FMT</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#JOB_INPUT_FILENAME">JOB_INPUT_FILENAME</a></span></code>
 <div class="block">Each client has one mapper to do the work,  and client do the resulting count in a map task.</div>
 </td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.slf4j.Logger</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#LOG">LOG</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static com.fasterxml.jackson.databind.ObjectMapper</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#MAPPER">MAPPER</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html?is-external=true" title="class or interface in java.math">BigDecimal</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#MS_PER_SEC">MS_PER_SEC</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#ONE_GB">ONE_GB</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>private static org.apache.hadoop.fs.Path</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#PERF_EVAL_DIR">PERF_EVAL_DIR</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#RANDOM_READ">RANDOM_READ</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#RANDOM_SEEK_SCAN">RANDOM_SEEK_SCAN</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>static int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#ROW_LENGTH">ROW_LENGTH</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#TABLE_NAME">TABLE_NAME</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>private static int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#TAG_LENGTH">TAG_LENGTH</a></span></code>&nbsp;</td>
 </tr>
@@ -447,9 +451,10 @@ implements org.apache.hadoop.util.Tool</pre>
 </tr>
 <tr id="i1" class="rowColor">
 <td class="colFirst"><code>private static <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
-<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#calculateMbps-int-long-int-int-">calculateMbps</a></span>(int&nbsp;rows,
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html#calculateMbps-int-long-int-int-int-">calculateMbps</a></span>(int&nbsp;rows,
              long&nbsp;timeMs,
              int&nbsp;valueSize,
+             int&nbsp;families,
              int&nbsp;columns)</code>
 <div class="block">Compute a throughput rate in MB/s.</div>
 </td>
@@ -670,13 +675,26 @@ implements org.apache.hadoop.util.Tool</pre>
 </dl>
 </li>
 </ul>
-<a name="FAMILY_NAME">
+<a name="FAMILY_NAME_BASE">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>FAMILY_NAME_BASE</h4>
+<pre>public static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.142">FAMILY_NAME_BASE</a></pre>
+<dl>
+<dt><span class="seeLabel">See Also:</span></dt>
+<dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.FAMILY_NAME_BASE">Constant Field Values</a></dd>
+</dl>
+</li>
+</ul>
+<a name="FAMILY_ZERO">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
-<h4>FAMILY_NAME</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.142">FAMILY_NAME</a></pre>
+<h4>FAMILY_ZERO</h4>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.143">FAMILY_ZERO</a></pre>
 </li>
 </ul>
 <a name="COLUMN_ZERO">
@@ -685,7 +703,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>COLUMN_ZERO</h4>
-<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.143">COLUMN_ZERO</a></pre>
+<pre>public static final&nbsp;byte[] <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.144">COLUMN_ZERO</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_VALUE_LENGTH">
@@ -694,7 +712,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_VALUE_LENGTH</h4>
-<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.144">DEFAULT_VALUE_LENGTH</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.145">DEFAULT_VALUE_LENGTH</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.DEFAULT_VALUE_LENGTH">Constant Field Values</a></dd>
@@ -707,7 +725,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>ROW_LENGTH</h4>
-<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.145">ROW_LENGTH</a></pre>
+<pre>public static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.146">ROW_LENGTH</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.ROW_LENGTH">Constant Field Values</a></dd>
@@ -720,7 +738,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>ONE_GB</h4>
-<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.147">ONE_GB</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.148">ONE_GB</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.ONE_GB">Constant Field Values</a></dd>
@@ -733,7 +751,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_ROWS_PER_GB</h4>
-<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.148">DEFAULT_ROWS_PER_GB</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.149">DEFAULT_ROWS_PER_GB</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.DEFAULT_ROWS_PER_GB">Constant Field Values</a></dd>
@@ -746,7 +764,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>TAG_LENGTH</h4>
-<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.150">TAG_LENGTH</a></pre>
+<pre>private static final&nbsp;int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.151">TAG_LENGTH</a></pre>
 <dl>
 <dt><span class="seeLabel">See Also:</span></dt>
 <dd><a href="../../../../constant-values.html#org.apache.hadoop.hbase.PerformanceEvaluation.TAG_LENGTH">Constant Field Values</a></dd>
@@ -759,7 +777,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>FMT</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html?is-external=true" title="class or interface in java.text">DecimalFormat</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.151">FMT</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html?is-external=true" title="class or interface in java.text">DecimalFormat</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.152">FMT</a></pre>
 </li>
 </ul>
 <a name="CXT">
@@ -768,7 +786,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>CXT</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/MathContext.html?is-external=true" title="class or interface in java.math">MathContext</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.152">CXT</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/MathContext.html?is-external=true" title="class or interface in java.math">MathContext</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.153">CXT</a></pre>
 </li>
 </ul>
 <a name="MS_PER_SEC">
@@ -777,7 +795,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>MS_PER_SEC</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html?is-external=true" title="class or interface in java.math">BigDecimal</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.153">MS_PER_SEC</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html?is-external=true" title="class or interface in java.math">BigDecimal</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.154">MS_PER_SEC</a></pre>
 </li>
 </ul>
 <a name="BYTES_PER_MB">
@@ -786,7 +804,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>BYTES_PER_MB</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html?is-external=true" title="class or interface in java.math">BigDecimal</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.154">BYTES_PER_MB</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/math/BigDecimal.html?is-external=true" title="class or interface in java.math">BigDecimal</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.155">BYTES_PER_MB</a></pre>
 </li>
 </ul>
 <a name="DEFAULT_OPTS">
@@ -795,7 +813,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>DEFAULT_OPTS</h4>
-<pre>private static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.155">DEFAULT_OPTS</a></pre>
+<pre>private static final&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.156">DEFAULT_OPTS</a></pre>
 </li>
 </ul>
 <a name="COMMANDS">
@@ -804,7 +822,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>COMMANDS</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CmdDescriptor</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.157">COMMANDS</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Map.html?is-external=true" title="class or interface in java.util">Map</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>,<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.CmdDescriptor.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.CmdDescriptor</a>&gt; <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.158">COMMANDS</a></pre>
 </li>
 </ul>
 <a name="PERF_EVAL_DIR">
@@ -813,7 +831,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>PERF_EVAL_DIR</h4>
-<pre>private static final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.158">PERF_EVAL_DIR</a></pre>
+<pre>private static final&nbsp;org.apache.hadoop.fs.Path <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.159">PERF_EVAL_DIR</a></pre>
 </li>
 </ul>
 <a name="JOB_INPUT_FILENAME">
@@ -822,7 +840,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>JOB_INPUT_FILENAME</h4>
-<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.545">JOB_INPUT_FILENAME</a></pre>
+<pre>static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.552">JOB_INPUT_FILENAME</a></pre>
 <div class="block">Each client has one mapper to do the work,  and client do the resulting count in a map task.</div>
 </li>
 </ul>
@@ -840,7 +858,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>PerformanceEvaluation</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.240">PerformanceEvaluation</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.241">PerformanceEvaluation</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)</pre>
 <div class="block">Constructor</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -862,7 +880,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>addCommandDescriptor</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.244">addCommandDescriptor</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmdClass,
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.245">addCommandDescriptor</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmdClass,
                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;name,
                                            <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;description)</pre>
 </li>
@@ -873,7 +891,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>checkTable</h4>
-<pre>static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.336">checkTable</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
+<pre>static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.337">checkTable</a>(org.apache.hadoop.hbase.client.Admin&nbsp;admin,
                           <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)
                    throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -888,7 +906,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getTableDescriptor</h4>
-<pre>protected static&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.395">getTableDescriptor</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>protected static&nbsp;org.apache.hadoop.hbase.HTableDescriptor&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.399">getTableDescriptor</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 <div class="block">Create an HTableDescriptor from provided TestOptions.</div>
 </li>
 </ul>
@@ -898,7 +916,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getSplits</h4>
-<pre>protected static&nbsp;byte[][]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.419">getSplits</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>protected static&nbsp;byte[][]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.426">getSplits</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 <div class="block">generates splits based on total number of rows and specified split regions</div>
 </li>
 </ul>
@@ -908,7 +926,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>doLocalClients</h4>
-<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.436">doLocalClients</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts,
+<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.443">doLocalClients</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts,
                                                         org.apache.hadoop.conf.Configuration&nbsp;conf)
                                                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                                         <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
@@ -927,7 +945,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>doMapReduce</h4>
-<pre>static&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.501">doMapReduce</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts,
+<pre>static&nbsp;org.apache.hadoop.mapreduce.Job&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.508">doMapReduce</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts,
                                                    org.apache.hadoop.conf.Configuration&nbsp;conf)
                                             throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                                    <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
@@ -946,7 +964,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>writeInputFile</h4>
-<pre>static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.553">writeInputFile</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
+<pre>static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.560">writeInputFile</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
                                                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)
                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
@@ -961,7 +979,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>writeInputFile</h4>
-<pre>static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.557">writeInputFile</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
+<pre>static&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.564">writeInputFile</a>(org.apache.hadoop.conf.Configuration&nbsp;c,
                                                 <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts,
                                                 org.apache.hadoop.fs.Path&nbsp;basedir)
                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
@@ -971,15 +989,16 @@ implements org.apache.hadoop.util.Tool</pre>
 </dl>
 </li>
 </ul>
-<a name="calculateMbps-int-long-int-int-">
+<a name="calculateMbps-int-long-int-int-int-">
 <!--   -->
 </a>
 <ul class="blockList">
 <li class="blockList">
 <h4>calculateMbps</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2163">calculateMbps</a>(int&nbsp;rows,
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2233">calculateMbps</a>(int&nbsp;rows,
                                     long&nbsp;timeMs,
                                     int&nbsp;valueSize,
+                                    int&nbsp;families,
                                     int&nbsp;columns)</pre>
 <div class="block">Compute a throughput rate in MB/s.</div>
 <dl>
@@ -997,7 +1016,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>format</h4>
-<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2178">format</a>(int&nbsp;number)</pre>
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2248">format</a>(int&nbsp;number)</pre>
 </li>
 </ul>
 <a name="generateData-java.util.Random-int-">
@@ -1006,7 +1025,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>generateData</h4>
-<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2194">generateData</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;r,
+<pre>public static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2264">generateData</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;r,
                                   int&nbsp;length)</pre>
 </li>
 </ul>
@@ -1016,7 +1035,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getRandomRow</h4>
-<pre>static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2216">getRandomRow</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random,
+<pre>static&nbsp;byte[]&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2286">getRandomRow</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random,
                            int&nbsp;totalRows)</pre>
 </li>
 </ul>
@@ -1026,7 +1045,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>generateRandomRow</h4>
-<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2220">generateRandomRow</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random,
+<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2290">generateRandomRow</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Random.html?is-external=true" title="class or interface in java.util">Random</a>&nbsp;random,
                              int&nbsp;totalRows)</pre>
 </li>
 </ul>
@@ -1036,7 +1055,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>runOneClient</h4>
-<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2224">runOneClient</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmd,
+<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.RunResult</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2294">runOneClient</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmd,
                                                     org.apache.hadoop.conf.Configuration&nbsp;conf,
                                                     org.apache.hadoop.hbase.client.Connection&nbsp;con,
                                                     org.apache.hadoop.hbase.client.AsyncConnection&nbsp;asyncCon,
@@ -1057,7 +1076,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getAverageValueLength</h4>
-<pre>private static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2262">getAverageValueLength</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>private static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2332">getAverageValueLength</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 </li>
 </ul>
 <a name="runTest-java.lang.Class-org.apache.hadoop.hbase.PerformanceEvaluation.TestOptions-">
@@ -1066,7 +1085,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>runTest</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2266">runTest</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmd,
+<pre>private&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2336">runTest</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;cmd,
                      <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                      <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
@@ -1087,7 +1106,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2288">printUsage</a>()</pre>
+<pre>protected&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2358">printUsage</a>()</pre>
 </li>
 </ul>
 <a name="printUsage-java.lang.String-">
@@ -1096,7 +1115,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2292">printUsage</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;message)</pre>
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2362">printUsage</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;message)</pre>
 </li>
 </ul>
 <a name="printUsageAndExit-java.lang.String-int-">
@@ -1105,7 +1124,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsageAndExit</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2296">printUsageAndExit</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;message,
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2366">printUsageAndExit</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;message,
                                         int&nbsp;exitCode)</pre>
 </li>
 </ul>
@@ -1115,7 +1134,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>printUsage</h4>
-<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2301">printUsage</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;className,
+<pre>protected static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2371">printUsage</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;className,
                                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;message)</pre>
 </li>
 </ul>
@@ -1125,7 +1144,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>parseOpts</h4>
-<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2407">parseOpts</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html?is-external=true" title="class or interface in java.util">Queue</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;args)</pre>
+<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2478">parseOpts</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/util/Queue.html?is-external=true" title="class or interface in java.util">Queue</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&gt;&nbsp;args)</pre>
 <div class="block">Parse options passed in via an arguments array. Assumes that array has been split
  on white-space and placed into a <code>Queue</code>. Any unknown arguments will remain
  in the queue at the conclusion of this method call. It's up to the caller to deal
@@ -1138,7 +1157,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>calculateRowsAndSize</h4>
-<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2681">calculateRowsAndSize</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>static&nbsp;<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2758">calculateRowsAndSize</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 </li>
 </ul>
 <a name="getRowsPerGB-org.apache.hadoop.hbase.PerformanceEvaluation.TestOptions-">
@@ -1147,7 +1166,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>getRowsPerGB</h4>
-<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2699">getRowsPerGB</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
+<pre>static&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2776">getRowsPerGB</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;opts)</pre>
 </li>
 </ul>
 <a name="run-java.lang.String:A-">
@@ -1156,7 +1175,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>run</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2704">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2782">run</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
         throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="overrideSpecifyLabel">Specified by:</span></dt>
@@ -1172,7 +1191,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>isCommandClass</h4>
-<pre>private static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2749">isCommandClass</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
+<pre>private static&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2827">isCommandClass</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
 </li>
 </ul>
 <a name="determineCommandClass-java.lang.String-">
@@ -1181,7 +1200,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockList">
 <li class="blockList">
 <h4>determineCommandClass</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2753">determineCommandClass</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestBase.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestBase</a>&gt;&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2831">determineCommandClass</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmd)</pre>
 </li>
 </ul>
 <a name="main-java.lang.String:A-">
@@ -1190,7 +1209,7 @@ implements org.apache.hadoop.util.Tool</pre>
 <ul class="blockListLast">
 <li class="blockList">
 <h4>main</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2758">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
+<pre>public static&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.2836">main</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>[]&nbsp;args)
                  throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html b/testdevapidocs/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html
index e059912..c899a22 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html
@@ -109,7 +109,7 @@ var activeTableTab = "activeTableTab";
 <li class="blockList">
 <hr>
 <br>
-<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.81">TestSaslFanOutOneBlockAsyncDFSOutput</a>
+<pre>public class <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.83">TestSaslFanOutOneBlockAsyncDFSOutput</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 </li>
 </ul>
@@ -313,7 +313,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CLASS_RULE</h4>
-<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.84">CLASS_RULE</a></pre>
+<pre>public static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseClassTestRule.html" title="class in org.apache.hadoop.hbase">HBaseClassTestRule</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.86">CLASS_RULE</a></pre>
 </li>
 </ul>
 <a name="TEST_UTIL">
@@ -322,7 +322,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_UTIL</h4>
-<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.87">TEST_UTIL</a></pre>
+<pre>private static final&nbsp;<a href="../../../../../../org/apache/hadoop/hbase/HBaseTestingUtility.html" title="class in org.apache.hadoop.hbase">HBaseTestingUtility</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.89">TEST_UTIL</a></pre>
 </li>
 </ul>
 <a name="FS">
@@ -331,7 +331,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>FS</h4>
-<pre>private static&nbsp;org.apache.hadoop.hdfs.DistributedFileSystem <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.89">FS</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.hdfs.DistributedFileSystem <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.91">FS</a></pre>
 </li>
 </ul>
 <a name="EVENT_LOOP_GROUP">
@@ -340,7 +340,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>EVENT_LOOP_GROUP</h4>
-<pre>private static&nbsp;org.apache.hbase.thirdparty.io.netty.channel.EventLoopGroup <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.91">EVENT_LOOP_GROUP</a></pre>
+<pre>private static&nbsp;org.apache.hbase.thirdparty.io.netty.channel.EventLoopGroup <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.93">EVENT_LOOP_GROUP</a></pre>
 </li>
 </ul>
 <a name="CHANNEL_CLASS">
@@ -349,7 +349,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>CHANNEL_CLASS</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends org.apache.hbase.thirdparty.io.netty.channel.Channel&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.93">CHANNEL_CLASS</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Class.html?is-external=true" title="class or interface in java.lang">Class</a>&lt;? extends org.apache.hbase.thirdparty.io.netty.channel.Channel&gt; <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.95">CHANNEL_CLASS</a></pre>
 </li>
 </ul>
 <a name="READ_TIMEOUT_MS">
@@ -358,7 +358,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>READ_TIMEOUT_MS</h4>
-<pre>private static&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.95">READ_TIMEOUT_MS</a></pre>
+<pre>private static&nbsp;int <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.97">READ_TIMEOUT_MS</a></pre>
 </li>
 </ul>
 <a name="KEYTAB_FILE">
@@ -367,7 +367,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KEYTAB_FILE</h4>
-<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/File.html?is-external=true" title="class or interface in java.io">File</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.97">KEYTAB_FILE</a></pre>
+<pre>private static final&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/io/File.html?is-external=true" title="class or interface in java.io">File</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.99">KEYTAB_FILE</a></pre>
 </li>
 </ul>
 <a name="KDC">
@@ -376,7 +376,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>KDC</h4>
-<pre>private static&nbsp;org.apache.hadoop.minikdc.MiniKdc <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.100">KDC</a></pre>
+<pre>private static&nbsp;org.apache.hadoop.minikdc.MiniKdc <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.102">KDC</a></pre>
 </li>
 </ul>
 <a name="HOST">
@@ -385,7 +385,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>HOST</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.102">HOST</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.104">HOST</a></pre>
 </li>
 </ul>
 <a name="USERNAME">
@@ -394,7 +394,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>USERNAME</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.104">USERNAME</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.106">USERNAME</a></pre>
 </li>
 </ul>
 <a name="PRINCIPAL">
@@ -403,7 +403,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>PRINCIPAL</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.106">PRINCIPAL</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.108">PRINCIPAL</a></pre>
 </li>
 </ul>
 <a name="HTTP_PRINCIPAL">
@@ -412,7 +412,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>HTTP_PRINCIPAL</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.108">HTTP_PRINCIPAL</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.110">HTTP_PRINCIPAL</a></pre>
 </li>
 </ul>
 <a name="TEST_KEY_NAME">
@@ -421,7 +421,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TEST_KEY_NAME</h4>
-<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.110">TEST_KEY_NAME</a></pre>
+<pre>private static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.112">TEST_KEY_NAME</a></pre>
 </li>
 </ul>
 <a name="name">
@@ -430,7 +430,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>name</h4>
-<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.113">name</a></pre>
+<pre>public&nbsp;org.junit.rules.TestName <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.115">name</a></pre>
 </li>
 </ul>
 <a name="protection">
@@ -439,7 +439,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>protection</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.116">protection</a></pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.118">protection</a></pre>
 </li>
 </ul>
 <a name="encryptionAlgorithm">
@@ -448,7 +448,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>encryptionAlgorithm</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.119">encryptionAlgorithm</a></pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.121">encryptionAlgorithm</a></pre>
 </li>
 </ul>
 <a name="cipherSuite">
@@ -457,7 +457,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cipherSuite</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.122">cipherSuite</a></pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.124">cipherSuite</a></pre>
 </li>
 </ul>
 <a name="testDirOnTestFs">
@@ -466,7 +466,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>testDirOnTestFs</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.194">testDirOnTestFs</a></pre>
+<pre>private&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.196">testDirOnTestFs</a></pre>
 </li>
 </ul>
 <a name="entryptionTestDirOnTestFs">
@@ -475,7 +475,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>entryptionTestDirOnTestFs</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.196">entryptionTestDirOnTestFs</a></pre>
+<pre>private&nbsp;org.apache.hadoop.fs.Path <a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.198">entryptionTestDirOnTestFs</a></pre>
 </li>
 </ul>
 </li>
@@ -492,7 +492,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestSaslFanOutOneBlockAsyncDFSOutput</h4>
-<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.81">TestSaslFanOutOneBlockAsyncDFSOutput</a>()</pre>
+<pre>public&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.83">TestSaslFanOutOneBlockAsyncDFSOutput</a>()</pre>
 </li>
 </ul>
 </li>
@@ -509,7 +509,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>data</h4>
-<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.125">data</a>()</pre>
+<pre>public static&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Iterable.html?is-external=true" title="class or interface in java.lang">Iterable</a>&lt;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a>[]&gt;&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.127">data</a>()</pre>
 </li>
 </ul>
 <a name="setHdfsSecuredConfiguration-org.apache.hadoop.conf.Configuration-">
@@ -518,7 +518,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setHdfsSecuredConfiguration</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.137">setHdfsSecuredConfiguration</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.139">setHdfsSecuredConfiguration</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
                                          throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -532,7 +532,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUpKeyProvider</h4>
-<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.156">setUpKeyProvider</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
+<pre>private static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.158">setUpKeyProvider</a>(org.apache.hadoop.conf.Configuration&nbsp;conf)
                               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -546,7 +546,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUpBeforeClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.167">setUpBeforeClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.169">setUpBeforeClass</a>()
                              throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -560,7 +560,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDownAfterClass</h4>
-<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.185">tearDownAfterClass</a>()
+<pre>public static&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.187">tearDownAfterClass</a>()
                                throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                                       <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a></pre>
 <dl>
@@ -576,7 +576,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>createEncryptionZone</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.198">createEncryptionZone</a>()
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.200">createEncryptionZone</a>()
                            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -590,7 +590,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUp</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.205">setUp</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.207">setUp</a>()
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Exception.html?is-external=true" title="class or interface in java.lang">Exception</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -604,7 +604,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tearDown</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.233">tearDown</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.235">tearDown</a>()
               throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a></pre>
 <dl>
 <dt><span class="throwsLabel">Throws:</span></dt>
@@ -618,7 +618,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getTestFile</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.237">getTestFile</a>()</pre>
+<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.239">getTestFile</a>()</pre>
 </li>
 </ul>
 <a name="getEncryptionTestFile--">
@@ -627,7 +627,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getEncryptionTestFile</h4>
-<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.241">getEncryptionTestFile</a>()</pre>
+<pre>private&nbsp;org.apache.hadoop.fs.Path&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.243">getEncryptionTestFile</a>()</pre>
 </li>
 </ul>
 <a name="test-org.apache.hadoop.fs.Path-">
@@ -636,7 +636,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>test</h4>
-<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.245">test</a>(org.apache.hadoop.fs.Path&nbsp;file)
+<pre>private&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.247">test</a>(org.apache.hadoop.fs.Path&nbsp;file)
            throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
                   <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutionException.html?is-external=true" title="class or interface in java.util.concurrent">ExecutionException</a></pre>
@@ -654,7 +654,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>test</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.253">test</a>()
+<pre>public&nbsp;void&nbsp;<a href="../../../../../../src-html/org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.html#line.255">test</a>()
           throws <a href="https://docs.oracle.com/javase/8/docs/api/java/io/IOException.html?is-external=true" title="class or interface in java.io">IOException</a>,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/InterruptedException.html?is-external=true" title="class or interface in java.lang">InterruptedException</a>,
                  <a href="https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutionException.html?is-external=true" title="class or interface in java.util.concurrent">ExecutionException</a></pre>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
index 4837d80..ec56445 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/io/hfile/package-tree.html
@@ -158,8 +158,8 @@
 <ul>
 <li type="circle">java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Enum.html?is-external=true" title="class or interface in java.lang"><span class="typeNameLink">Enum</span></a>&lt;E&gt; (implements java.lang.<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Comparable.html?is-external=true" title="class or interface in java.lang">Comparable</a>&lt;T&gt;, java.io.<a href="https://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html?is-external=true" title="class or interface in java.io">Serializable</a>)
 <ul>
-<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.CacheOnWriteType.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TestCacheOnWrite.CacheOnWriteType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.io.hfile.<a href="../../../../../../org/apache/hadoop/hbase/io/hfile/TagUsage.html" title="enum in org.apache.hadoop.hbase.io.hfile"><span class="typeNameLink">TagUsage</span></a></li>
 </ul>
 </li>
 </ul>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
index 27b1eca..5d0ff09 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/package-tree.html
@@ -571,13 +571,13 @@
 <ul>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ScanPerformanceEvaluation.ScanCounter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ScanPerformanceEvaluation.ScanCounter</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.RoleCommand.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.RoleCommand</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
-<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestRegionReplicaPerf.Stat.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestRegionReplicaPerf.Stat</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">PerformanceEvaluation.Counter</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/HBaseClusterManager.CommandProvider.Operation.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">HBaseClusterManager.CommandProvider.Operation</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ResourceChecker.Phase.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ResourceChecker.Phase</span></a></li>
 <li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/ClusterManager.ServiceType.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">ClusterManager.ServiceType</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/RESTApiClusterManager.Service.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">RESTApiClusterManager.Service</span></a></li>
+<li type="circle">org.apache.hadoop.hbase.<a href="../../../../org/apache/hadoop/hbase/IntegrationTestDDLMasterFailover.ACTION.html" title="enum in org.apache.hadoop.hbase"><span class="typeNameLink">IntegrationTestDDLMasterFailover.ACTION</span></a></li>
 </ul>
 </li>
 </ul>


[17/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange1000Test.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOpti

<TRUNCATED>

[20/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.IncrementTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>   

<TRUNCATED>

[45/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.


Project: http://git-wip-us.apache.org/repos/asf/hbase-site/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase-site/commit/d70bb89e
Tree: http://git-wip-us.apache.org/repos/asf/hbase-site/tree/d70bb89e
Diff: http://git-wip-us.apache.org/repos/asf/hbase-site/diff/d70bb89e

Branch: refs/heads/asf-site
Commit: d70bb89e80991158b127c88133145cc218e32874
Parents: 8b3429d
Author: jenkins <bu...@apache.org>
Authored: Tue May 8 14:47:57 2018 +0000
Committer: jenkins <bu...@apache.org>
Committed: Tue May 8 14:47:57 2018 +0000

----------------------------------------------------------------------
 acid-semantics.html                             |    4 +-
 apache_hbase_reference_guide.pdf                |    4 +-
 book.html                                       |    2 +-
 bulk-loads.html                                 |    4 +-
 checkstyle-aggregate.html                       | 5152 ++++++++---------
 checkstyle.rss                                  |    6 +-
 coc.html                                        |    4 +-
 dependencies.html                               |    4 +-
 dependency-convergence.html                     |    4 +-
 dependency-info.html                            |    4 +-
 dependency-management.html                      |    4 +-
 devapidocs/constant-values.html                 |    4 +-
 .../org/apache/hadoop/hbase/Version.html        |    4 +-
 downloads.html                                  |    8 +-
 export_control.html                             |    4 +-
 index.html                                      |    4 +-
 integration.html                                |    4 +-
 issue-tracking.html                             |    4 +-
 license.html                                    |    4 +-
 mail-lists.html                                 |    4 +-
 metrics.html                                    |    4 +-
 old_news.html                                   |    4 +-
 plugin-management.html                          |    4 +-
 plugins.html                                    |    4 +-
 poweredbyhbase.html                             |    4 +-
 project-info.html                               |    4 +-
 project-reports.html                            |    4 +-
 project-summary.html                            |    4 +-
 pseudo-distributed.html                         |    4 +-
 replication.html                                |    4 +-
 resources.html                                  |    4 +-
 source-repository.html                          |    4 +-
 sponsors.html                                   |    4 +-
 supportingprojects.html                         |    4 +-
 team-list.html                                  |    4 +-
 testdevapidocs/constant-values.html             |   36 +-
 testdevapidocs/index-all.html                   |   20 +-
 .../hbase/PerformanceEvaluation.AppendTest.html |    6 +-
 ...rformanceEvaluation.AsyncRandomReadTest.html |   20 +-
 ...formanceEvaluation.AsyncRandomWriteTest.html |    6 +-
 .../PerformanceEvaluation.AsyncScanTest.html    |   14 +-
 ...manceEvaluation.AsyncSequentialReadTest.html |    6 +-
 ...anceEvaluation.AsyncSequentialWriteTest.html |    6 +-
 .../PerformanceEvaluation.AsyncTableTest.html   |   10 +-
 .../hbase/PerformanceEvaluation.AsyncTest.html  |   10 +-
 ...rformanceEvaluation.BufferedMutatorTest.html |   12 +-
 .../PerformanceEvaluation.CASTableTest.html     |   12 +-
 ...erformanceEvaluation.CheckAndDeleteTest.html |    6 +-
 ...erformanceEvaluation.CheckAndMutateTest.html |    6 +-
 .../PerformanceEvaluation.CheckAndPutTest.html  |    6 +-
 .../PerformanceEvaluation.CmdDescriptor.html    |   16 +-
 .../hbase/PerformanceEvaluation.Counter.html    |   10 +-
 ...PerformanceEvaluation.EvaluationMapTask.html |   16 +-
 .../PerformanceEvaluation.FilteredScanTest.html |   10 +-
 .../PerformanceEvaluation.IncrementTest.html    |    6 +-
 .../PerformanceEvaluation.RandomReadTest.html   |   16 +-
 ...Evaluation.RandomScanWithRange10000Test.html |    6 +-
 ...eEvaluation.RandomScanWithRange1000Test.html |    6 +-
 ...ceEvaluation.RandomScanWithRange100Test.html |    6 +-
 ...nceEvaluation.RandomScanWithRange10Test.html |    6 +-
 ...manceEvaluation.RandomScanWithRangeTest.html |   12 +-
 ...erformanceEvaluation.RandomSeekScanTest.html |    8 +-
 .../PerformanceEvaluation.RandomWriteTest.html  |    6 +-
 .../hbase/PerformanceEvaluation.RunResult.html  |   12 +-
 .../hbase/PerformanceEvaluation.ScanTest.html   |   10 +-
 ...erformanceEvaluation.SequentialReadTest.html |    6 +-
 ...rformanceEvaluation.SequentialWriteTest.html |    6 +-
 .../hbase/PerformanceEvaluation.Status.html     |    4 +-
 .../hbase/PerformanceEvaluation.TableTest.html  |   10 +-
 .../hbase/PerformanceEvaluation.Test.html       |   10 +-
 .../hbase/PerformanceEvaluation.TestBase.html   |   86 +-
 .../PerformanceEvaluation.TestOptions.html      |  477 +-
 .../hadoop/hbase/PerformanceEvaluation.html     |  139 +-
 .../TestSaslFanOutOneBlockAsyncDFSOutput.html   |   66 +-
 .../hadoop/hbase/io/hfile/package-tree.html     |    2 +-
 .../org/apache/hadoop/hbase/package-tree.html   |    8 +-
 .../TestRegionServerAccounting.html             |   75 +-
 .../hadoop/hbase/regionserver/package-tree.html |    6 +-
 .../apache/hadoop/hbase/test/package-tree.html  |    2 +-
 .../apache/hadoop/hbase/wal/package-tree.html   |    2 +-
 .../hbase/PerformanceEvaluation.AppendTest.html | 5266 +++++++++---------
 ...rformanceEvaluation.AsyncRandomReadTest.html | 5266 +++++++++---------
 ...formanceEvaluation.AsyncRandomWriteTest.html | 5266 +++++++++---------
 .../PerformanceEvaluation.AsyncScanTest.html    | 5266 +++++++++---------
 ...manceEvaluation.AsyncSequentialReadTest.html | 5266 +++++++++---------
 ...anceEvaluation.AsyncSequentialWriteTest.html | 5266 +++++++++---------
 .../PerformanceEvaluation.AsyncTableTest.html   | 5266 +++++++++---------
 .../hbase/PerformanceEvaluation.AsyncTest.html  | 5266 +++++++++---------
 ...rformanceEvaluation.BufferedMutatorTest.html | 5266 +++++++++---------
 .../PerformanceEvaluation.CASTableTest.html     | 5266 +++++++++---------
 ...erformanceEvaluation.CheckAndDeleteTest.html | 5266 +++++++++---------
 ...erformanceEvaluation.CheckAndMutateTest.html | 5266 +++++++++---------
 .../PerformanceEvaluation.CheckAndPutTest.html  | 5266 +++++++++---------
 .../PerformanceEvaluation.CmdDescriptor.html    | 5266 +++++++++---------
 .../hbase/PerformanceEvaluation.Counter.html    | 5266 +++++++++---------
 ...PerformanceEvaluation.EvaluationMapTask.html | 5266 +++++++++---------
 .../PerformanceEvaluation.FilteredScanTest.html | 5266 +++++++++---------
 .../PerformanceEvaluation.IncrementTest.html    | 5266 +++++++++---------
 .../PerformanceEvaluation.RandomReadTest.html   | 5266 +++++++++---------
 ...Evaluation.RandomScanWithRange10000Test.html | 5266 +++++++++---------
 ...eEvaluation.RandomScanWithRange1000Test.html | 5266 +++++++++---------
 ...ceEvaluation.RandomScanWithRange100Test.html | 5266 +++++++++---------
 ...nceEvaluation.RandomScanWithRange10Test.html | 5266 +++++++++---------
 ...manceEvaluation.RandomScanWithRangeTest.html | 5266 +++++++++---------
 ...erformanceEvaluation.RandomSeekScanTest.html | 5266 +++++++++---------
 .../PerformanceEvaluation.RandomWriteTest.html  | 5266 +++++++++---------
 .../hbase/PerformanceEvaluation.RunResult.html  | 5266 +++++++++---------
 .../hbase/PerformanceEvaluation.ScanTest.html   | 5266 +++++++++---------
 ...erformanceEvaluation.SequentialReadTest.html | 5266 +++++++++---------
 ...rformanceEvaluation.SequentialWriteTest.html | 5266 +++++++++---------
 .../hbase/PerformanceEvaluation.Status.html     | 5266 +++++++++---------
 .../hbase/PerformanceEvaluation.TableTest.html  | 5266 +++++++++---------
 .../hbase/PerformanceEvaluation.Test.html       | 5266 +++++++++---------
 .../hbase/PerformanceEvaluation.TestBase.html   | 5266 +++++++++---------
 .../PerformanceEvaluation.TestOptions.html      | 5266 +++++++++---------
 .../hadoop/hbase/PerformanceEvaluation.html     | 5266 +++++++++---------
 .../TestSaslFanOutOneBlockAsyncDFSOutput.html   |  360 +-
 .../TestRegionServerAccounting.html             |  201 +-
 118 files changed, 99821 insertions(+), 96829 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/acid-semantics.html
----------------------------------------------------------------------
diff --git a/acid-semantics.html b/acid-semantics.html
index e2052fc..b58d659 100644
--- a/acid-semantics.html
+++ b/acid-semantics.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Apache HBase (TM) ACID Properties
@@ -601,7 +601,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/apache_hbase_reference_guide.pdf
----------------------------------------------------------------------
diff --git a/apache_hbase_reference_guide.pdf b/apache_hbase_reference_guide.pdf
index 5bf7146..982e0bf 100644
--- a/apache_hbase_reference_guide.pdf
+++ b/apache_hbase_reference_guide.pdf
@@ -5,8 +5,8 @@
 /Author (Apache HBase Team)
 /Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2)
 /Producer (Apache HBase Team)
-/ModDate (D:20180507142956+00'00')
-/CreationDate (D:20180507144445+00'00')
+/ModDate (D:20180508142954+00'00')
+/CreationDate (D:20180508144458+00'00')
 >>
 endobj
 2 0 obj

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/book.html
----------------------------------------------------------------------
diff --git a/book.html b/book.html
index bf2f23c..6714b18 100644
--- a/book.html
+++ b/book.html
@@ -37873,7 +37873,7 @@ The server will return cellblocks compressed using this same compressor as long
 <div id="footer">
 <div id="footer-text">
 Version 3.0.0-SNAPSHOT<br>
-Last updated 2018-05-07 14:29:56 UTC
+Last updated 2018-05-08 14:29:54 UTC
 </div>
 </div>
 </body>

http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/bulk-loads.html
----------------------------------------------------------------------
diff --git a/bulk-loads.html b/bulk-loads.html
index 862a507..ca7dc16 100644
--- a/bulk-loads.html
+++ b/bulk-loads.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013;  
       Bulk Loads in Apache HBase (TM)
@@ -306,7 +306,7 @@ under the License. -->
                         <a href="https://www.apache.org/">The Apache Software Foundation</a>.
             All rights reserved.      
                     
-                  <li id="publishDate" class="pull-right">Last Published: 2018-05-07</li>
+                  <li id="publishDate" class="pull-right">Last Published: 2018-05-08</li>
             </p>
                 </div>
 


[11/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RunResult.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    String cmdName = nu

<TRUNCATED>

[32/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncSequentialWriteTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="l

<TRUNCATED>

[37/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AppendTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    String cmdName

<TRUNCATED>

[35/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncRandomWriteTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span

<TRUNCATED>

[09/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.SequentialReadTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="so

<TRUNCATED>

[21/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.FilteredScanTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo

<TRUNCATED>

[22/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.EvaluationMapTask.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceL

<TRUNCATED>

[18/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomScanWithRange10000Test.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class Tes

<TRUNCATED>

[23/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Counter.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    String cmdName = null;<a name

<TRUNCATED>

[44/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/checkstyle-aggregate.html
----------------------------------------------------------------------
diff --git a/checkstyle-aggregate.html b/checkstyle-aggregate.html
index 6b1e876..9aba02b 100644
--- a/checkstyle-aggregate.html
+++ b/checkstyle-aggregate.html
@@ -7,7 +7,7 @@
   <head>
     <meta charset="UTF-8" />
     <meta name="viewport" content="width=device-width, initial-scale=1.0" />
-    <meta name="Date-Revision-yyyymmdd" content="20180507" />
+    <meta name="Date-Revision-yyyymmdd" content="20180508" />
     <meta http-equiv="Content-Language" content="en" />
     <title>Apache HBase &#x2013; Checkstyle Results</title>
     <link rel="stylesheet" href="./css/apache-maven-fluido-1.5-HBASE.min.css" />
@@ -284,7 +284,7 @@
 <td>3609</td>
 <td>0</td>
 <td>0</td>
-<td>15875</td></tr></table></div>
+<td>15879</td></tr></table></div>
 <div class="section">
 <h2><a name="Files"></a>Files</h2>
 <table border="0" class="table table-striped">
@@ -617,7 +617,7 @@
 <td><a href="#org.apache.hadoop.hbase.PerformanceEvaluation.java">org/apache/hadoop/hbase/PerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
-<td>34</td></tr>
+<td>37</td></tr>
 <tr class="a">
 <td><a href="#org.apache.hadoop.hbase.PerformanceEvaluationCommons.java">org/apache/hadoop/hbase/PerformanceEvaluationCommons.java</a></td>
 <td>0</td>
@@ -3254,6951 +3254,6956 @@
 <td>0</td>
 <td>4</td></tr>
 <tr class="b">
+<td><a href="#org.apache.hadoop.hbase.io.asyncfs.TestSaslFanOutOneBlockAsyncDFSOutput.java">org/apache/hadoop/hbase/io/asyncfs/TestSaslFanOutOneBlockAsyncDFSOutput.java</a></td>
+<td>0</td>
+<td>0</td>
+<td>1</td></tr>
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.compress.Compression.java">org/apache/hadoop/hbase/io/compress/Compression.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.Cipher.java">org/apache/hadoop/hbase/io/crypto/Cipher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.Decryptor.java">org/apache/hadoop/hbase/io/crypto/Decryptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.Encryption.java">org/apache/hadoop/hbase/io/crypto/Encryption.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>53</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.Encryptor.java">org/apache/hadoop/hbase/io/crypto/Encryptor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.KeyProvider.java">org/apache/hadoop/hbase/io/crypto/KeyProvider.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.TestEncryption.java">org/apache/hadoop/hbase/io/crypto/TestEncryption.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.crypto.aes.CryptoAES.java">org/apache/hadoop/hbase/io/crypto/aes/CryptoAES.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.BufferedDataBlockEncoder.java">org/apache/hadoop/hbase/io/encoding/BufferedDataBlockEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.CopyKeyDataBlockEncoder.java">org/apache/hadoop/hbase/io/encoding/CopyKeyDataBlockEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.DataBlockEncoder.java">org/apache/hadoop/hbase/io/encoding/DataBlockEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.DataBlockEncoding.java">org/apache/hadoop/hbase/io/encoding/DataBlockEncoding.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.EncodedDataBlock.java">org/apache/hadoop/hbase/io/encoding/EncodedDataBlock.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.HFileBlockDecodingContext.java">org/apache/hadoop/hbase/io/encoding/HFileBlockDecodingContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.HFileBlockDefaultEncodingContext.java">org/apache/hadoop/hbase/io/encoding/HFileBlockDefaultEncodingContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.HFileBlockEncodingContext.java">org/apache/hadoop/hbase/io/encoding/HFileBlockEncodingContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.RowIndexCodecV1.java">org/apache/hadoop/hbase/io/encoding/RowIndexCodecV1.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.TestDataBlockEncoders.java">org/apache/hadoop/hbase/io/encoding/TestDataBlockEncoders.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.encoding.TestEncodedSeekers.java">org/apache/hadoop/hbase/io/encoding/TestEncodedSeekers.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hadoopbackport.ThrottledInputStream.java">org/apache/hadoop/hbase/io/hadoopbackport/ThrottledInputStream.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.BlockCache.java">org/apache/hadoop/hbase/io/hfile/BlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.BlockCacheKey.java">org/apache/hadoop/hbase/io/hfile/BlockCacheKey.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.BlockCacheUtil.java">org/apache/hadoop/hbase/io/hfile/BlockCacheUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.BlockCachesIterator.java">org/apache/hadoop/hbase/io/hfile/BlockCachesIterator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.BlockType.java">org/apache/hadoop/hbase/io/hfile/BlockType.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CacheConfig.java">org/apache/hadoop/hbase/io/hfile/CacheConfig.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CacheStats.java">org/apache/hadoop/hbase/io/hfile/CacheStats.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CacheTestUtils.java">org/apache/hadoop/hbase/io/hfile/CacheTestUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.Cacheable.java">org/apache/hadoop/hbase/io/hfile/Cacheable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CacheableDeserializer.java">org/apache/hadoop/hbase/io/hfile/CacheableDeserializer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CacheableDeserializerIdManager.java">org/apache/hadoop/hbase/io/hfile/CacheableDeserializerIdManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.ChecksumUtil.java">org/apache/hadoop/hbase/io/hfile/ChecksumUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CombinedBlockCache.java">org/apache/hadoop/hbase/io/hfile/CombinedBlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CompoundBloomFilter.java">org/apache/hadoop/hbase/io/hfile/CompoundBloomFilter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CompoundBloomFilterBase.java">org/apache/hadoop/hbase/io/hfile/CompoundBloomFilterBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CompoundBloomFilterWriter.java">org/apache/hadoop/hbase/io/hfile/CompoundBloomFilterWriter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.CorruptHFileException.java">org/apache/hadoop/hbase/io/hfile/CorruptHFileException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.FixedFileTrailer.java">org/apache/hadoop/hbase/io/hfile/FixedFileTrailer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFile.java">org/apache/hadoop/hbase/io/hfile/HFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>38</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileBlock.java">org/apache/hadoop/hbase/io/hfile/HFileBlock.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileBlockIndex.java">org/apache/hadoop/hbase/io/hfile/HFileBlockIndex.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>39</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileContext.java">org/apache/hadoop/hbase/io/hfile/HFileContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileDataBlockEncoder.java">org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileDataBlockEncoderImpl.java">org/apache/hadoop/hbase/io/hfile/HFileDataBlockEncoderImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFilePrettyPrinter.java">org/apache/hadoop/hbase/io/hfile/HFilePrettyPrinter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileReaderImpl.java">org/apache/hadoop/hbase/io/hfile/HFileReaderImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>51</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileScanner.java">org/apache/hadoop/hbase/io/hfile/HFileScanner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>23</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileUtil.java">org/apache/hadoop/hbase/io/hfile/HFileUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.HFileWriterImpl.java">org/apache/hadoop/hbase/io/hfile/HFileWriterImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.KVGenerator.java">org/apache/hadoop/hbase/io/hfile/KVGenerator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.LruBlockCache.java">org/apache/hadoop/hbase/io/hfile/LruBlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.LruCachedBlock.java">org/apache/hadoop/hbase/io/hfile/LruCachedBlock.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.LruCachedBlockQueue.java">org/apache/hadoop/hbase/io/hfile/LruCachedBlockQueue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.NanoTimer.java">org/apache/hadoop/hbase/io/hfile/NanoTimer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.NoOpDataBlockEncoder.java">org/apache/hadoop/hbase/io/hfile/NoOpDataBlockEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.PrefetchExecutor.java">org/apache/hadoop/hbase/io/hfile/PrefetchExecutor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.RandomKeyValueUtil.java">org/apache/hadoop/hbase/io/hfile/RandomKeyValueUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestBlockCacheReporting.java">org/apache/hadoop/hbase/io/hfile/TestBlockCacheReporting.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestCacheConfig.java">org/apache/hadoop/hbase/io/hfile/TestCacheConfig.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestCacheOnWrite.java">org/apache/hadoop/hbase/io/hfile/TestCacheOnWrite.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestCachedBlockQueue.java">org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>19</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestChecksum.java">org/apache/hadoop/hbase/io/hfile/TestChecksum.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestFixedFileTrailer.java">org/apache/hadoop/hbase/io/hfile/TestFixedFileTrailer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestForceCacheImportantBlocks.java">org/apache/hadoop/hbase/io/hfile/TestForceCacheImportantBlocks.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestHFile.java">org/apache/hadoop/hbase/io/hfile/TestHFile.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>27</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestHFileBlock.java">org/apache/hadoop/hbase/io/hfile/TestHFileBlock.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestHFileBlockIndex.java">org/apache/hadoop/hbase/io/hfile/TestHFileBlockIndex.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestHFileBlockPositionalRead.java">org/apache/hadoop/hbase/io/hfile/TestHFileBlockPositionalRead.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestHFileDataBlockEncoder.java">org/apache/hadoop/hbase/io/hfile/TestHFileDataBlockEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestHFileWriterV3.java">org/apache/hadoop/hbase/io/hfile/TestHFileWriterV3.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestLruBlockCache.java">org/apache/hadoop/hbase/io/hfile/TestLruBlockCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestPrefetch.java">org/apache/hadoop/hbase/io/hfile/TestPrefetch.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestScannerFromBucketCache.java">org/apache/hadoop/hbase/io/hfile/TestScannerFromBucketCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.TestScannerSelectionUsingKeyRange.java">org/apache/hadoop/hbase/io/hfile/TestScannerSelectionUsingKeyRange.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.BucketAllocator.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.BucketCache.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>39</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.BucketCacheStats.java">org/apache/hadoop/hbase/io/hfile/bucket/BucketCacheStats.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.ByteBufferIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/ByteBufferIOEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.CachedEntryQueue.java">org/apache/hadoop/hbase/io/hfile/bucket/CachedEntryQueue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.FileIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/FileIOEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.FileMmapEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/FileMmapEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.IOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/IOEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.TestBucketCache.java">org/apache/hadoop/hbase/io/hfile/bucket/TestBucketCache.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.TestBucketWriterThread.java">org/apache/hadoop/hbase/io/hfile/bucket/TestBucketWriterThread.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.TestFileIOEngine.java">org/apache/hadoop/hbase/io/hfile/bucket/TestFileIOEngine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.hfile.bucket.UniqueIndexMap.java">org/apache/hadoop/hbase/io/hfile/bucket/UniqueIndexMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.util.Dictionary.java">org/apache/hadoop/hbase/io/util/Dictionary.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.util.LRUDictionary.java">org/apache/hadoop/hbase/io/util/LRUDictionary.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.io.util.MemorySizeUtil.java">org/apache/hadoop/hbase/io/util/MemorySizeUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.io.util.StreamUtils.java">org/apache/hadoop/hbase/io/util/StreamUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.AbstractRpcClient.java">org/apache/hadoop/hbase/ipc/AbstractRpcClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.AbstractTestIPC.java">org/apache/hadoop/hbase/ipc/AbstractTestIPC.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.AdaptiveLifoCoDelCallQueue.java">org/apache/hadoop/hbase/ipc/AdaptiveLifoCoDelCallQueue.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.BlockingRpcCallback.java">org/apache/hadoop/hbase/ipc/BlockingRpcCallback.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.BlockingRpcClient.java">org/apache/hadoop/hbase/ipc/BlockingRpcClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.BlockingRpcConnection.java">org/apache/hadoop/hbase/ipc/BlockingRpcConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.BufferCallBeforeInitHandler.java">org/apache/hadoop/hbase/ipc/BufferCallBeforeInitHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.BufferChain.java">org/apache/hadoop/hbase/ipc/BufferChain.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.Call.java">org/apache/hadoop/hbase/ipc/Call.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.CallQueueInfo.java">org/apache/hadoop/hbase/ipc/CallQueueInfo.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.CallRunner.java">org/apache/hadoop/hbase/ipc/CallRunner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.CellBlockBuilder.java">org/apache/hadoop/hbase/ipc/CellBlockBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.CoprocessorRpcUtils.java">org/apache/hadoop/hbase/ipc/CoprocessorRpcUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.DefaultNettyEventLoopConfig.java">org/apache/hadoop/hbase/ipc/DefaultNettyEventLoopConfig.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.DelegatingHBaseRpcController.java">org/apache/hadoop/hbase/ipc/DelegatingHBaseRpcController.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.FailedServers.java">org/apache/hadoop/hbase/ipc/FailedServers.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.FifoRpcScheduler.java">org/apache/hadoop/hbase/ipc/FifoRpcScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.HBaseRpcController.java">org/apache/hadoop/hbase/ipc/HBaseRpcController.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.HBaseRpcControllerImpl.java">org/apache/hadoop/hbase/ipc/HBaseRpcControllerImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.IPCUtil.java">org/apache/hadoop/hbase/ipc/IPCUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.IntegrationTestRpcClient.java">org/apache/hadoop/hbase/ipc/IntegrationTestRpcClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.MetricsHBaseServer.java">org/apache/hadoop/hbase/ipc/MetricsHBaseServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.MetricsHBaseServerSourceImpl.java">org/apache/hadoop/hbase/ipc/MetricsHBaseServerSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyRpcClient.java">org/apache/hadoop/hbase/ipc/NettyRpcClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyRpcClientConfigHelper.java">org/apache/hadoop/hbase/ipc/NettyRpcClientConfigHelper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyRpcConnection.java">org/apache/hadoop/hbase/ipc/NettyRpcConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyRpcDuplexHandler.java">org/apache/hadoop/hbase/ipc/NettyRpcDuplexHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyRpcServer.java">org/apache/hadoop/hbase/ipc/NettyRpcServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyRpcServerPreambleHandler.java">org/apache/hadoop/hbase/ipc/NettyRpcServerPreambleHandler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyRpcServerRequestDecoder.java">org/apache/hadoop/hbase/ipc/NettyRpcServerRequestDecoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyRpcServerResponseEncoder.java">org/apache/hadoop/hbase/ipc/NettyRpcServerResponseEncoder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyServerCall.java">org/apache/hadoop/hbase/ipc/NettyServerCall.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.NettyServerRpcConnection.java">org/apache/hadoop/hbase/ipc/NettyServerRpcConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.PriorityFunction.java">org/apache/hadoop/hbase/ipc/PriorityFunction.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RWQueueRpcExecutor.java">org/apache/hadoop/hbase/ipc/RWQueueRpcExecutor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RemoteWithExtrasException.java">org/apache/hadoop/hbase/ipc/RemoteWithExtrasException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcCall.java">org/apache/hadoop/hbase/ipc/RpcCall.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcCallContext.java">org/apache/hadoop/hbase/ipc/RpcCallContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcClient.java">org/apache/hadoop/hbase/ipc/RpcClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcClientFactory.java">org/apache/hadoop/hbase/ipc/RpcClientFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcConnection.java">org/apache/hadoop/hbase/ipc/RpcConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcControllerFactory.java">org/apache/hadoop/hbase/ipc/RpcControllerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcExecutor.java">org/apache/hadoop/hbase/ipc/RpcExecutor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcScheduler.java">org/apache/hadoop/hbase/ipc/RpcScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcSchedulerContext.java">org/apache/hadoop/hbase/ipc/RpcSchedulerContext.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcServer.java">org/apache/hadoop/hbase/ipc/RpcServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcServerFactory.java">org/apache/hadoop/hbase/ipc/RpcServerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.RpcServerInterface.java">org/apache/hadoop/hbase/ipc/RpcServerInterface.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.ServerCall.java">org/apache/hadoop/hbase/ipc/ServerCall.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.ServerRpcConnection.java">org/apache/hadoop/hbase/ipc/ServerRpcConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>24</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.ServerRpcController.java">org/apache/hadoop/hbase/ipc/ServerRpcController.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.SimpleRpcScheduler.java">org/apache/hadoop/hbase/ipc/SimpleRpcScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.SimpleRpcServer.java">org/apache/hadoop/hbase/ipc/SimpleRpcServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.SimpleRpcServerResponder.java">org/apache/hadoop/hbase/ipc/SimpleRpcServerResponder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.SimpleServerCall.java">org/apache/hadoop/hbase/ipc/SimpleServerCall.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.SimpleServerRpcConnection.java">org/apache/hadoop/hbase/ipc/SimpleServerRpcConnection.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestBufferChain.java">org/apache/hadoop/hbase/ipc/TestBufferChain.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestCellBlockBuilder.java">org/apache/hadoop/hbase/ipc/TestCellBlockBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestFifoRpcScheduler.java">org/apache/hadoop/hbase/ipc/TestFifoRpcScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestHBaseClient.java">org/apache/hadoop/hbase/ipc/TestHBaseClient.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>41</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestHBaseRpcControllerImpl.java">org/apache/hadoop/hbase/ipc/TestHBaseRpcControllerImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestProtobufRpcServiceImpl.java">org/apache/hadoop/hbase/ipc/TestProtobufRpcServiceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestRpcMetrics.java">org/apache/hadoop/hbase/ipc/TestRpcMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.ipc.TestSimpleRpcScheduler.java">org/apache/hadoop/hbase/ipc/TestSimpleRpcScheduler.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.log.HBaseMarkers.java">org/apache/hadoop/hbase/log/HBaseMarkers.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.Driver.java">org/apache/hadoop/hbase/mapred/Driver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.GroupingTableMap.java">org/apache/hadoop/hbase/mapred/GroupingTableMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.HRegionPartitioner.java">org/apache/hadoop/hbase/mapred/HRegionPartitioner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.IdentityTableMap.java">org/apache/hadoop/hbase/mapred/IdentityTableMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.IdentityTableReduce.java">org/apache/hadoop/hbase/mapred/IdentityTableReduce.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.MultiTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapred/MultiTableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.RowCounter.java">org/apache/hadoop/hbase/mapred/RowCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableInputFormat.java">org/apache/hadoop/hbase/mapred/TableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableInputFormatBase.java">org/apache/hadoop/hbase/mapred/TableInputFormatBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableMap.java">org/apache/hadoop/hbase/mapred/TableMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableMapReduceUtil.java">org/apache/hadoop/hbase/mapred/TableMapReduceUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableOutputFormat.java">org/apache/hadoop/hbase/mapred/TableOutputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableRecordReader.java">org/apache/hadoop/hbase/mapred/TableRecordReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableRecordReaderImpl.java">org/apache/hadoop/hbase/mapred/TableRecordReaderImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableReduce.java">org/apache/hadoop/hbase/mapred/TableReduce.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapred/TableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TableSplit.java">org/apache/hadoop/hbase/mapred/TableSplit.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestGroupingTableMap.java">org/apache/hadoop/hbase/mapred/TestGroupingTableMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestIdentityTableMap.java">org/apache/hadoop/hbase/mapred/TestIdentityTableMap.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestRowCounter.java">org/apache/hadoop/hbase/mapred/TestRowCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestSplitTable.java">org/apache/hadoop/hbase/mapred/TestSplitTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestTableInputFormat.java">org/apache/hadoop/hbase/mapred/TestTableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>25</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestTableMapReduce.java">org/apache/hadoop/hbase/mapred/TestTableMapReduce.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestTableMapReduceUtil.java">org/apache/hadoop/hbase/mapred/TestTableMapReduceUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapred.TestTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapred/TestTableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CellCounter.java">org/apache/hadoop/hbase/mapreduce/CellCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CellCreator.java">org/apache/hadoop/hbase/mapreduce/CellCreator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CellSerialization.java">org/apache/hadoop/hbase/mapreduce/CellSerialization.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CellSortReducer.java">org/apache/hadoop/hbase/mapreduce/CellSortReducer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.CopyTable.java">org/apache/hadoop/hbase/mapreduce/CopyTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.DefaultVisibilityExpressionResolver.java">org/apache/hadoop/hbase/mapreduce/DefaultVisibilityExpressionResolver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.Driver.java">org/apache/hadoop/hbase/mapreduce/Driver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.Export.java">org/apache/hadoop/hbase/mapreduce/Export.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.ExportUtils.java">org/apache/hadoop/hbase/mapreduce/ExportUtils.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.GroupingTableMapper.java">org/apache/hadoop/hbase/mapreduce/GroupingTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.HFileInputFormat.java">org/apache/hadoop/hbase/mapreduce/HFileInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.HFileOutputFormat2.java">org/apache/hadoop/hbase/mapreduce/HFileOutputFormat2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.HRegionPartitioner.java">org/apache/hadoop/hbase/mapreduce/HRegionPartitioner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.HashTable.java">org/apache/hadoop/hbase/mapreduce/HashTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.IdentityTableMapper.java">org/apache/hadoop/hbase/mapreduce/IdentityTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.IdentityTableReducer.java">org/apache/hadoop/hbase/mapreduce/IdentityTableReducer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.Import.java">org/apache/hadoop/hbase/mapreduce/Import.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.ImportTsv.java">org/apache/hadoop/hbase/mapreduce/ImportTsv.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.IndexBuilder.java">org/apache/hadoop/hbase/mapreduce/IndexBuilder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.IntegrationTestBulkLoad.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestBulkLoad.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.IntegrationTestImportTsv.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestImportTsv.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.IntegrationTestTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/IntegrationTestTableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.JobUtil.java">org/apache/hadoop/hbase/mapreduce/JobUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MapreduceTestingShim.java">org/apache/hadoop/hbase/mapreduce/MapreduceTestingShim.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableHFileOutputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableHFileOutputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableInputFormatTestBase.java">org/apache/hadoop/hbase/mapreduce/MultiTableInputFormatTestBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableOutputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableOutputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultiTableSnapshotInputFormatImpl.java">org/apache/hadoop/hbase/mapreduce/MultiTableSnapshotInputFormatImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MultithreadedTableMapper.java">org/apache/hadoop/hbase/mapreduce/MultithreadedTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.MutationSerialization.java">org/apache/hadoop/hbase/mapreduce/MutationSerialization.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.NMapInputFormat.java">org/apache/hadoop/hbase/mapreduce/NMapInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.PutCombiner.java">org/apache/hadoop/hbase/mapreduce/PutCombiner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.PutSortReducer.java">org/apache/hadoop/hbase/mapreduce/PutSortReducer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.ResultSerialization.java">org/apache/hadoop/hbase/mapreduce/ResultSerialization.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.RowCounter.java">org/apache/hadoop/hbase/mapreduce/RowCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.RowCounter_Counters.properties">org/apache/hadoop/hbase/mapreduce/RowCounter_Counters.properties</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.SampleUploader.java">org/apache/hadoop/hbase/mapreduce/SampleUploader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.SimpleTotalOrderPartitioner.java">org/apache/hadoop/hbase/mapreduce/SimpleTotalOrderPartitioner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.SyncTable.java">org/apache/hadoop/hbase/mapreduce/SyncTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/TableInputFormatBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>20</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil.java">org/apache/hadoop/hbase/mapreduce/TableMapReduceUtil.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>55</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableMapper.java">org/apache/hadoop/hbase/mapreduce/TableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableOutputCommitter.java">org/apache/hadoop/hbase/mapreduce/TableOutputCommitter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableOutputFormat.java">org/apache/hadoop/hbase/mapreduce/TableOutputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableRecordReader.java">org/apache/hadoop/hbase/mapreduce/TableRecordReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.java">org/apache/hadoop/hbase/mapreduce/TableRecordReaderImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableReducer.java">org/apache/hadoop/hbase/mapreduce/TableReducer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormat.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormatImpl.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableSnapshotInputFormatTestBase.java">org/apache/hadoop/hbase/mapreduce/TableSnapshotInputFormatTestBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TableSplit.java">org/apache/hadoop/hbase/mapreduce/TableSplit.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestCellCounter.java">org/apache/hadoop/hbase/mapreduce/TestCellCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestCopyTable.java">org/apache/hadoop/hbase/mapreduce/TestCopyTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestGroupingTableMapper.java">org/apache/hadoop/hbase/mapreduce/TestGroupingTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestHBaseMRTestingUtility.java">org/apache/hadoop/hbase/mapreduce/TestHBaseMRTestingUtility.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestHFileOutputFormat2.java">org/apache/hadoop/hbase/mapreduce/TestHFileOutputFormat2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>38</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestHRegionPartitioner.java">org/apache/hadoop/hbase/mapreduce/TestHRegionPartitioner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestHashTable.java">org/apache/hadoop/hbase/mapreduce/TestHashTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportExport.java">org/apache/hadoop/hbase/mapreduce/TestImportExport.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTSVWithOperationAttributes.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithOperationAttributes.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTSVWithTTLs.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithTTLs.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTSVWithVisibilityLabels.java">org/apache/hadoop/hbase/mapreduce/TestImportTSVWithVisibilityLabels.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>27</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTsv.java">org/apache/hadoop/hbase/mapreduce/TestImportTsv.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestImportTsvParser.java">org/apache/hadoop/hbase/mapreduce/TestImportTsvParser.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestMapReduceExamples.java">org/apache/hadoop/hbase/mapreduce/TestMapReduceExamples.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestMultiTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestMultiTableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/TestMultiTableInputFormatBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestMultiTableSnapshotInputFormatImpl.java">org/apache/hadoop/hbase/mapreduce/TestMultiTableSnapshotInputFormatImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestMultithreadedTableMapper.java">org/apache/hadoop/hbase/mapreduce/TestMultithreadedTableMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>12</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestRegionSizeCalculator.java">org/apache/hadoop/hbase/mapreduce/TestRegionSizeCalculator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestRowCounter.java">org/apache/hadoop/hbase/mapreduce/TestRowCounter.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>37</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestSimpleTotalOrderPartitioner.java">org/apache/hadoop/hbase/mapreduce/TestSimpleTotalOrderPartitioner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestSyncTable.java">org/apache/hadoop/hbase/mapreduce/TestSyncTable.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableInputFormat.java">org/apache/hadoop/hbase/mapreduce/TestTableInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableInputFormatBase.java">org/apache/hadoop/hbase/mapreduce/TestTableInputFormatBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableInputFormatScan1.java">org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan1.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableInputFormatScan2.java">org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScan2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>18</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableInputFormatScanBase.java">org/apache/hadoop/hbase/mapreduce/TestTableInputFormatScanBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableMapReduce.java">org/apache/hadoop/hbase/mapreduce/TestTableMapReduce.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableMapReduceBase.java">org/apache/hadoop/hbase/mapreduce/TestTableMapReduceBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTableSplit.java">org/apache/hadoop/hbase/mapreduce/TestTableSplit.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestTimeRangeMapRed.java">org/apache/hadoop/hbase/mapreduce/TestTimeRangeMapRed.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestWALPlayer.java">org/apache/hadoop/hbase/mapreduce/TestWALPlayer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TestWALRecordReader.java">org/apache/hadoop/hbase/mapreduce/TestWALRecordReader.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TextSortReducer.java">org/apache/hadoop/hbase/mapreduce/TextSortReducer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TsvImporterCustomTestMapper.java">org/apache/hadoop/hbase/mapreduce/TsvImporterCustomTestMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TsvImporterMapper.java">org/apache/hadoop/hbase/mapreduce/TsvImporterMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.TsvImporterTextMapper.java">org/apache/hadoop/hbase/mapreduce/TsvImporterTextMapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.VisibilityExpressionResolver.java">org/apache/hadoop/hbase/mapreduce/VisibilityExpressionResolver.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.WALInputFormat.java">org/apache/hadoop/hbase/mapreduce/WALInputFormat.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>11</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.WALPlayer.java">org/apache/hadoop/hbase/mapreduce/WALPlayer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.mapreduce.replication.VerifyReplication.java">org/apache/hadoop/hbase/mapreduce/replication/VerifyReplication.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.AbstractTestDLS.java">org/apache/hadoop/hbase/master/AbstractTestDLS.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.ActiveMasterManager.java">org/apache/hadoop/hbase/master/ActiveMasterManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.AssignmentVerificationReport.java">org/apache/hadoop/hbase/master/AssignmentVerificationReport.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.CatalogJanitor.java">org/apache/hadoop/hbase/master/CatalogJanitor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.ClusterSchema.java">org/apache/hadoop/hbase/master/ClusterSchema.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.ClusterSchemaServiceImpl.java">org/apache/hadoop/hbase/master/ClusterSchemaServiceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.DeadServer.java">org/apache/hadoop/hbase/master/DeadServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>6</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.DrainingServerTracker.java">org/apache/hadoop/hbase/master/DrainingServerTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.ExpiredMobFileCleanerChore.java">org/apache/hadoop/hbase/master/ExpiredMobFileCleanerChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.HMaster.java">org/apache/hadoop/hbase/master/HMaster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>160</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.HMasterCommandLine.java">org/apache/hadoop/hbase/master/HMasterCommandLine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.LoadBalancer.java">org/apache/hadoop/hbase/master/LoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MasterCoprocessorHost.java">org/apache/hadoop/hbase/master/MasterCoprocessorHost.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MasterFileSystem.java">org/apache/hadoop/hbase/master/MasterFileSystem.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MasterMobCompactionThread.java">org/apache/hadoop/hbase/master/MasterMobCompactionThread.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MasterRpcServices.java">org/apache/hadoop/hbase/master/MasterRpcServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MasterServices.java">org/apache/hadoop/hbase/master/MasterServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>41</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MasterStatusServlet.java">org/apache/hadoop/hbase/master/MasterStatusServlet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MasterWalManager.java">org/apache/hadoop/hbase/master/MasterWalManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsAssignmentManager.java">org/apache/hadoop/hbase/master/MetricsAssignmentManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsAssignmentManagerSourceImpl.java">org/apache/hadoop/hbase/master/MetricsAssignmentManagerSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsMaster.java">org/apache/hadoop/hbase/master/MetricsMaster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsMasterFilesystemSourceImpl.java">org/apache/hadoop/hbase/master/MetricsMasterFilesystemSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsMasterProcSourceImpl.java">org/apache/hadoop/hbase/master/MetricsMasterProcSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsMasterQuotaSourceImpl.java">org/apache/hadoop/hbase/master/MetricsMasterQuotaSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsMasterSourceImpl.java">org/apache/hadoop/hbase/master/MetricsMasterSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsMasterWrapperImpl.java">org/apache/hadoop/hbase/master/MetricsMasterWrapperImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MetricsSnapshotSourceImpl.java">org/apache/hadoop/hbase/master/MetricsSnapshotSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MirroringTableStateManager.java">org/apache/hadoop/hbase/master/MirroringTableStateManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MobCompactionChore.java">org/apache/hadoop/hbase/master/MobCompactionChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.MockNoopMasterServices.java">org/apache/hadoop/hbase/master/MockNoopMasterServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.MockRegionServer.java">org/apache/hadoop/hbase/master/MockRegionServer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.RackManager.java">org/apache/hadoop/hbase/master/RackManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.RegionPlacementMaintainer.java">org/apache/hadoop/hbase/master/RegionPlacementMaintainer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>26</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.RegionServerTracker.java">org/apache/hadoop/hbase/master/RegionServerTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.RegionState.java">org/apache/hadoop/hbase/master/RegionState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>86</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.ServerListener.java">org/apache/hadoop/hbase/master/ServerListener.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.ServerManager.java">org/apache/hadoop/hbase/master/ServerManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>21</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.SnapshotOfRegionAssignmentFromMeta.java">org/apache/hadoop/hbase/master/SnapshotOfRegionAssignmentFromMeta.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.SnapshotSentinel.java">org/apache/hadoop/hbase/master/SnapshotSentinel.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.SplitLogManager.java">org/apache/hadoop/hbase/master/SplitLogManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.SplitOrMergeTracker.java">org/apache/hadoop/hbase/master/SplitOrMergeTracker.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TableNamespaceManager.java">org/apache/hadoop/hbase/master/TableNamespaceManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TableStateManager.java">org/apache/hadoop/hbase/master/TableStateManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestActiveMasterManager.java">org/apache/hadoop/hbase/master/TestActiveMasterManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestCatalogJanitor.java">org/apache/hadoop/hbase/master/TestCatalogJanitor.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestCatalogJanitorInMemoryStates.java">org/apache/hadoop/hbase/master/TestCatalogJanitorInMemoryStates.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestClusterStatusPublisher.java">org/apache/hadoop/hbase/master/TestClusterStatusPublisher.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestHMasterCommandLine.java">org/apache/hadoop/hbase/master/TestHMasterCommandLine.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestHMasterRPCException.java">org/apache/hadoop/hbase/master/TestHMasterRPCException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestMaster.java">org/apache/hadoop/hbase/master/TestMaster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterFailoverBalancerPersistence.java">org/apache/hadoop/hbase/master/TestMasterFailoverBalancerPersistence.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterFileSystem.java">org/apache/hadoop/hbase/master/TestMasterFileSystem.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterFileSystemWithWALDir.java">org/apache/hadoop/hbase/master/TestMasterFileSystemWithWALDir.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterMetrics.java">org/apache/hadoop/hbase/master/TestMasterMetrics.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterMetricsWrapper.java">org/apache/hadoop/hbase/master/TestMasterMetricsWrapper.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterNoCluster.java">org/apache/hadoop/hbase/master/TestMasterNoCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>17</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterOperationsForRegionReplicas.java">org/apache/hadoop/hbase/master/TestMasterOperationsForRegionReplicas.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterStatusServlet.java">org/apache/hadoop/hbase/master/TestMasterStatusServlet.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestMasterTransitions.java">org/apache/hadoop/hbase/master/TestMasterTransitions.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestMetricsMasterSourceImpl.java">org/apache/hadoop/hbase/master/TestMetricsMasterSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestMirroringTableStateManager.java">org/apache/hadoop/hbase/master/TestMirroringTableStateManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestRegionPlacement.java">org/apache/hadoop/hbase/master/TestRegionPlacement.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>21</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestRegionPlacement2.java">org/apache/hadoop/hbase/master/TestRegionPlacement2.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestRollingRestart.java">org/apache/hadoop/hbase/master/TestRollingRestart.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestSplitLogManager.java">org/apache/hadoop/hbase/master/TestSplitLogManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.TestTableStateManager.java">org/apache/hadoop/hbase/master/TestTableStateManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.TestWarmupRegion.java">org/apache/hadoop/hbase/master/TestWarmupRegion.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>19</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.AssignProcedure.java">org/apache/hadoop/hbase/master/assignment/AssignProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.AssignmentManager.java">org/apache/hadoop/hbase/master/assignment/AssignmentManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>30</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.GCMergedRegionsProcedure.java">org/apache/hadoop/hbase/master/assignment/GCMergedRegionsProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>14</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.GCRegionProcedure.java">org/apache/hadoop/hbase/master/assignment/GCRegionProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.MergeTableRegionsProcedure.java">org/apache/hadoop/hbase/master/assignment/MergeTableRegionsProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.MockMasterServices.java">org/apache/hadoop/hbase/master/assignment/MockMasterServices.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.RegionStateStore.java">org/apache/hadoop/hbase/master/assignment/RegionStateStore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>5</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.RegionStates.java">org/apache/hadoop/hbase/master/assignment/RegionStates.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>25</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.RegionTransitionProcedure.java">org/apache/hadoop/hbase/master/assignment/RegionTransitionProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>10</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.SplitTableRegionProcedure.java">org/apache/hadoop/hbase/master/assignment/SplitTableRegionProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>8</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.TestAssignmentManager.java">org/apache/hadoop/hbase/master/assignment/TestAssignmentManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>15</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.TestAssignmentOnRSCrash.java">org/apache/hadoop/hbase/master/assignment/TestAssignmentOnRSCrash.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.TestRegionStates.java">org/apache/hadoop/hbase/master/assignment/TestRegionStates.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.TestSplitTableRegionProcedure.java">org/apache/hadoop/hbase/master/assignment/TestSplitTableRegionProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.TestUnexpectedStateException.java">org/apache/hadoop/hbase/master/assignment/TestUnexpectedStateException.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.UnassignProcedure.java">org/apache/hadoop/hbase/master/assignment/UnassignProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.assignment.Util.java">org/apache/hadoop/hbase/master/assignment/Util.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.BalancerChore.java">org/apache/hadoop/hbase/master/balancer/BalancerChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.BalancerTestBase.java">org/apache/hadoop/hbase/master/balancer/BalancerTestBase.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>75</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.BaseLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/BaseLoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>61</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.ClusterLoadState.java">org/apache/hadoop/hbase/master/balancer/ClusterLoadState.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.ClusterStatusChore.java">org/apache/hadoop/hbase/master/balancer/ClusterStatusChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.FavoredStochasticBalancer.java">org/apache/hadoop/hbase/master/balancer/FavoredStochasticBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.LoadBalancerFactory.java">org/apache/hadoop/hbase/master/balancer/LoadBalancerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.LoadBalancerPerformanceEvaluation.java">org/apache/hadoop/hbase/master/balancer/LoadBalancerPerformanceEvaluation.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.MetricsBalancerSourceImpl.java">org/apache/hadoop/hbase/master/balancer/MetricsBalancerSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.MetricsStochasticBalancerSourceImpl.java">org/apache/hadoop/hbase/master/balancer/MetricsStochasticBalancerSourceImpl.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>7</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.RegionInfoComparator.java">org/apache/hadoop/hbase/master/balancer/RegionInfoComparator.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.RegionLocationFinder.java">org/apache/hadoop/hbase/master/balancer/RegionLocationFinder.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.ServerAndLoad.java">org/apache/hadoop/hbase/master/balancer/ServerAndLoad.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.SimpleLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/SimpleLoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.StochasticLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/StochasticLoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>32</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.TestBaseLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/TestBaseLoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>16</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.TestDefaultLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/TestDefaultLoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>48</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.TestFavoredNodeTableImport.java">org/apache/hadoop/hbase/master/balancer/TestFavoredNodeTableImport.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.TestFavoredStochasticBalancerPickers.java">org/apache/hadoop/hbase/master/balancer/TestFavoredStochasticBalancerPickers.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.TestRegionsOnMasterOptions.java">org/apache/hadoop/hbase/master/balancer/TestRegionsOnMasterOptions.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>13</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.TestServerAndLoad.java">org/apache/hadoop/hbase/master/balancer/TestServerAndLoad.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.balancer.TestStochasticLoadBalancer.java">org/apache/hadoop/hbase/master/balancer/TestStochasticLoadBalancer.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>33</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.BaseFileCleanerDelegate.java">org/apache/hadoop/hbase/master/cleaner/BaseFileCleanerDelegate.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.BaseLogCleanerDelegate.java">org/apache/hadoop/hbase/master/cleaner/BaseLogCleanerDelegate.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.CleanerChore.java">org/apache/hadoop/hbase/master/cleaner/CleanerChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.FileCleanerDelegate.java">org/apache/hadoop/hbase/master/cleaner/FileCleanerDelegate.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.HFileLinkCleaner.java">org/apache/hadoop/hbase/master/cleaner/HFileLinkCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.TestCleanerChore.java">org/apache/hadoop/hbase/master/cleaner/TestCleanerChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.TestHFileCleaner.java">org/apache/hadoop/hbase/master/cleaner/TestHFileCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.TestHFileLinkCleaner.java">org/apache/hadoop/hbase/master/cleaner/TestHFileLinkCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.TestSnapshotFromMaster.java">org/apache/hadoop/hbase/master/cleaner/TestSnapshotFromMaster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.TimeToLiveHFileCleaner.java">org/apache/hadoop/hbase/master/cleaner/TimeToLiveHFileCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.cleaner.TimeToLiveLogCleaner.java">org/apache/hadoop/hbase/master/cleaner/TimeToLiveLogCleaner.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.locking.LockManager.java">org/apache/hadoop/hbase/master/locking/LockManager.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.locking.LockProcedure.java">org/apache/hadoop/hbase/master/locking/LockProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>4</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.normalizer.EmptyNormalizationPlan.java">org/apache/hadoop/hbase/master/normalizer/EmptyNormalizationPlan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.normalizer.NormalizationPlan.java">org/apache/hadoop/hbase/master/normalizer/NormalizationPlan.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.normalizer.RegionNormalizerChore.java">org/apache/hadoop/hbase/master/normalizer/RegionNormalizerChore.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.normalizer.RegionNormalizerFactory.java">org/apache/hadoop/hbase/master/normalizer/RegionNormalizerFactory.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.normalizer.TestSimpleRegionNormalizerOnCluster.java">org/apache/hadoop/hbase/master/normalizer/TestSimpleRegionNormalizerOnCluster.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.AbstractStateMachineNamespaceProcedure.java">org/apache/hadoop/hbase/master/procedure/AbstractStateMachineNamespaceProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.AbstractStateMachineRegionProcedure.java">org/apache/hadoop/hbase/master/procedure/AbstractStateMachineRegionProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>2</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.AbstractStateMachineTableProcedure.java">org/apache/hadoop/hbase/master/procedure/AbstractStateMachineTableProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>3</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.CloneSnapshotProcedure.java">org/apache/hadoop/hbase/master/procedure/CloneSnapshotProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>9</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.CreateNamespaceProcedure.java">org/apache/hadoop/hbase/master/procedure/CreateNamespaceProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>31</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.CreateTableProcedure.java">org/apache/hadoop/hbase/master/procedure/CreateTableProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>1</td></tr>
-<tr class="a">
+<tr class="b">
 <td><a href="#org.apache.hadoop.hbase.master.procedure.DeleteNamespaceProcedure.java">org/apache/hadoop/hbase/master/procedure/DeleteNamespaceProcedure.java</a></td>
 <td>0</td>
 <td>0</td>
 <td>34</td></tr>
-<tr class="b">
+<tr class="a">
 <td><a href="#org.apac

<TRUNCATED>

[07/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.Status.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</span>    String cmdName = null;<a name="lin

<TRUNCATED>

[19/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.RandomReadTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</spa

<TRUNCATED>

[31/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
index 7cf23c4..3f8844b 100644
--- a/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
+++ b/testdevapidocs/src-html/org/apache/hadoop/hbase/PerformanceEvaluation.AsyncTableTest.html
@@ -147,2627 +147,2705 @@
 <span class="sourceLineNo">139</span>  }<a name="line.139"></a>
 <span class="sourceLineNo">140</span><a name="line.140"></a>
 <span class="sourceLineNo">141</span>  public static final String TABLE_NAME = "TestTable";<a name="line.141"></a>
-<span class="sourceLineNo">142</span>  public static final byte[] FAMILY_NAME = Bytes.toBytes("info");<a name="line.142"></a>
-<span class="sourceLineNo">143</span>  public static final byte [] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.143"></a>
-<span class="sourceLineNo">144</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.144"></a>
-<span class="sourceLineNo">145</span>  public static final int ROW_LENGTH = 26;<a name="line.145"></a>
-<span class="sourceLineNo">146</span><a name="line.146"></a>
-<span class="sourceLineNo">147</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.147"></a>
-<span class="sourceLineNo">148</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.148"></a>
-<span class="sourceLineNo">149</span>  // TODO : should we make this configurable<a name="line.149"></a>
-<span class="sourceLineNo">150</span>  private static final int TAG_LENGTH = 256;<a name="line.150"></a>
-<span class="sourceLineNo">151</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.151"></a>
-<span class="sourceLineNo">152</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.152"></a>
-<span class="sourceLineNo">153</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.153"></a>
-<span class="sourceLineNo">154</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.154"></a>
-<span class="sourceLineNo">155</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.155"></a>
-<span class="sourceLineNo">156</span><a name="line.156"></a>
-<span class="sourceLineNo">157</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.157"></a>
-<span class="sourceLineNo">158</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.158"></a>
-<span class="sourceLineNo">159</span><a name="line.159"></a>
-<span class="sourceLineNo">160</span>  static {<a name="line.160"></a>
-<span class="sourceLineNo">161</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.161"></a>
-<span class="sourceLineNo">162</span>        "Run async random read test");<a name="line.162"></a>
-<span class="sourceLineNo">163</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.163"></a>
-<span class="sourceLineNo">164</span>        "Run async random write test");<a name="line.164"></a>
-<span class="sourceLineNo">165</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.165"></a>
-<span class="sourceLineNo">166</span>        "Run async sequential read test");<a name="line.166"></a>
-<span class="sourceLineNo">167</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.167"></a>
-<span class="sourceLineNo">168</span>        "Run async sequential write test");<a name="line.168"></a>
-<span class="sourceLineNo">169</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.169"></a>
-<span class="sourceLineNo">170</span>        "Run async scan test (read every row)");<a name="line.170"></a>
-<span class="sourceLineNo">171</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.171"></a>
-<span class="sourceLineNo">172</span>      "Run random read test");<a name="line.172"></a>
-<span class="sourceLineNo">173</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.173"></a>
-<span class="sourceLineNo">174</span>      "Run random seek and scan 100 test");<a name="line.174"></a>
-<span class="sourceLineNo">175</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.175"></a>
-<span class="sourceLineNo">176</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.176"></a>
-<span class="sourceLineNo">177</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.177"></a>
-<span class="sourceLineNo">178</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.178"></a>
-<span class="sourceLineNo">179</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.179"></a>
-<span class="sourceLineNo">180</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.180"></a>
-<span class="sourceLineNo">181</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.181"></a>
-<span class="sourceLineNo">182</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.182"></a>
-<span class="sourceLineNo">183</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.183"></a>
-<span class="sourceLineNo">184</span>      "Run random write test");<a name="line.184"></a>
-<span class="sourceLineNo">185</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.185"></a>
-<span class="sourceLineNo">186</span>      "Run sequential read test");<a name="line.186"></a>
-<span class="sourceLineNo">187</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.187"></a>
-<span class="sourceLineNo">188</span>      "Run sequential write test");<a name="line.188"></a>
-<span class="sourceLineNo">189</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.189"></a>
-<span class="sourceLineNo">190</span>      "Run scan test (read every row)");<a name="line.190"></a>
-<span class="sourceLineNo">191</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.191"></a>
-<span class="sourceLineNo">192</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.192"></a>
-<span class="sourceLineNo">193</span>      "(make sure to use --rows=20)");<a name="line.193"></a>
-<span class="sourceLineNo">194</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.194"></a>
-<span class="sourceLineNo">195</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.195"></a>
-<span class="sourceLineNo">196</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.196"></a>
-<span class="sourceLineNo">197</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.197"></a>
-<span class="sourceLineNo">198</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.198"></a>
-<span class="sourceLineNo">199</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.199"></a>
-<span class="sourceLineNo">200</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.200"></a>
-<span class="sourceLineNo">201</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.201"></a>
-<span class="sourceLineNo">202</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.202"></a>
-<span class="sourceLineNo">203</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.203"></a>
-<span class="sourceLineNo">204</span>  }<a name="line.204"></a>
-<span class="sourceLineNo">205</span><a name="line.205"></a>
-<span class="sourceLineNo">206</span>  /**<a name="line.206"></a>
-<span class="sourceLineNo">207</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.207"></a>
-<span class="sourceLineNo">208</span>   * inner-class so we can find associated properties.<a name="line.208"></a>
-<span class="sourceLineNo">209</span>   */<a name="line.209"></a>
-<span class="sourceLineNo">210</span>  protected static enum Counter {<a name="line.210"></a>
-<span class="sourceLineNo">211</span>    /** elapsed time */<a name="line.211"></a>
-<span class="sourceLineNo">212</span>    ELAPSED_TIME,<a name="line.212"></a>
-<span class="sourceLineNo">213</span>    /** number of rows */<a name="line.213"></a>
-<span class="sourceLineNo">214</span>    ROWS<a name="line.214"></a>
-<span class="sourceLineNo">215</span>  }<a name="line.215"></a>
-<span class="sourceLineNo">216</span><a name="line.216"></a>
-<span class="sourceLineNo">217</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.217"></a>
-<span class="sourceLineNo">218</span>    public RunResult(long duration, Histogram hist) {<a name="line.218"></a>
-<span class="sourceLineNo">219</span>      this.duration = duration;<a name="line.219"></a>
-<span class="sourceLineNo">220</span>      this.hist = hist;<a name="line.220"></a>
-<span class="sourceLineNo">221</span>    }<a name="line.221"></a>
-<span class="sourceLineNo">222</span><a name="line.222"></a>
-<span class="sourceLineNo">223</span>    public final long duration;<a name="line.223"></a>
-<span class="sourceLineNo">224</span>    public final Histogram hist;<a name="line.224"></a>
-<span class="sourceLineNo">225</span><a name="line.225"></a>
-<span class="sourceLineNo">226</span>    @Override<a name="line.226"></a>
-<span class="sourceLineNo">227</span>    public String toString() {<a name="line.227"></a>
-<span class="sourceLineNo">228</span>      return Long.toString(duration);<a name="line.228"></a>
-<span class="sourceLineNo">229</span>    }<a name="line.229"></a>
-<span class="sourceLineNo">230</span><a name="line.230"></a>
-<span class="sourceLineNo">231</span>    @Override public int compareTo(RunResult o) {<a name="line.231"></a>
-<span class="sourceLineNo">232</span>      return Long.compare(this.duration, o.duration);<a name="line.232"></a>
-<span class="sourceLineNo">233</span>    }<a name="line.233"></a>
-<span class="sourceLineNo">234</span>  }<a name="line.234"></a>
-<span class="sourceLineNo">235</span><a name="line.235"></a>
-<span class="sourceLineNo">236</span>  /**<a name="line.236"></a>
-<span class="sourceLineNo">237</span>   * Constructor<a name="line.237"></a>
-<span class="sourceLineNo">238</span>   * @param conf Configuration object<a name="line.238"></a>
-<span class="sourceLineNo">239</span>   */<a name="line.239"></a>
-<span class="sourceLineNo">240</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.240"></a>
-<span class="sourceLineNo">241</span>    super(conf);<a name="line.241"></a>
-<span class="sourceLineNo">242</span>  }<a name="line.242"></a>
-<span class="sourceLineNo">243</span><a name="line.243"></a>
-<span class="sourceLineNo">244</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.244"></a>
-<span class="sourceLineNo">245</span>      String name, String description) {<a name="line.245"></a>
-<span class="sourceLineNo">246</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.246"></a>
-<span class="sourceLineNo">247</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.247"></a>
-<span class="sourceLineNo">248</span>  }<a name="line.248"></a>
-<span class="sourceLineNo">249</span><a name="line.249"></a>
-<span class="sourceLineNo">250</span>  /**<a name="line.250"></a>
-<span class="sourceLineNo">251</span>   * Implementations can have their status set.<a name="line.251"></a>
-<span class="sourceLineNo">252</span>   */<a name="line.252"></a>
-<span class="sourceLineNo">253</span>  interface Status {<a name="line.253"></a>
-<span class="sourceLineNo">254</span>    /**<a name="line.254"></a>
-<span class="sourceLineNo">255</span>     * Sets status<a name="line.255"></a>
-<span class="sourceLineNo">256</span>     * @param msg status message<a name="line.256"></a>
-<span class="sourceLineNo">257</span>     * @throws IOException<a name="line.257"></a>
-<span class="sourceLineNo">258</span>     */<a name="line.258"></a>
-<span class="sourceLineNo">259</span>    void setStatus(final String msg) throws IOException;<a name="line.259"></a>
-<span class="sourceLineNo">260</span>  }<a name="line.260"></a>
-<span class="sourceLineNo">261</span><a name="line.261"></a>
-<span class="sourceLineNo">262</span>  /**<a name="line.262"></a>
-<span class="sourceLineNo">263</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.263"></a>
-<span class="sourceLineNo">264</span>   */<a name="line.264"></a>
-<span class="sourceLineNo">265</span>  public static class EvaluationMapTask<a name="line.265"></a>
-<span class="sourceLineNo">266</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.266"></a>
-<span class="sourceLineNo">267</span><a name="line.267"></a>
-<span class="sourceLineNo">268</span>    /** configuration parameter name that contains the command */<a name="line.268"></a>
-<span class="sourceLineNo">269</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.269"></a>
-<span class="sourceLineNo">270</span>    /** configuration parameter name that contains the PE impl */<a name="line.270"></a>
-<span class="sourceLineNo">271</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.271"></a>
-<span class="sourceLineNo">272</span><a name="line.272"></a>
-<span class="sourceLineNo">273</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.273"></a>
-<span class="sourceLineNo">274</span><a name="line.274"></a>
-<span class="sourceLineNo">275</span>    @Override<a name="line.275"></a>
-<span class="sourceLineNo">276</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.276"></a>
-<span class="sourceLineNo">277</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.277"></a>
-<span class="sourceLineNo">278</span><a name="line.278"></a>
-<span class="sourceLineNo">279</span>      // this is required so that extensions of PE are instantiated within the<a name="line.279"></a>
-<span class="sourceLineNo">280</span>      // map reduce task...<a name="line.280"></a>
-<span class="sourceLineNo">281</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.281"></a>
-<span class="sourceLineNo">282</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.282"></a>
-<span class="sourceLineNo">283</span>      try {<a name="line.283"></a>
-<span class="sourceLineNo">284</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.284"></a>
-<span class="sourceLineNo">285</span>      } catch (Exception e) {<a name="line.285"></a>
-<span class="sourceLineNo">286</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.286"></a>
-<span class="sourceLineNo">287</span>      }<a name="line.287"></a>
-<span class="sourceLineNo">288</span>    }<a name="line.288"></a>
-<span class="sourceLineNo">289</span><a name="line.289"></a>
-<span class="sourceLineNo">290</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.290"></a>
-<span class="sourceLineNo">291</span>      try {<a name="line.291"></a>
-<span class="sourceLineNo">292</span>        return Class.forName(className).asSubclass(type);<a name="line.292"></a>
-<span class="sourceLineNo">293</span>      } catch (ClassNotFoundException e) {<a name="line.293"></a>
-<span class="sourceLineNo">294</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.294"></a>
-<span class="sourceLineNo">295</span>      }<a name="line.295"></a>
-<span class="sourceLineNo">296</span>    }<a name="line.296"></a>
-<span class="sourceLineNo">297</span><a name="line.297"></a>
-<span class="sourceLineNo">298</span>    @Override<a name="line.298"></a>
-<span class="sourceLineNo">299</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.299"></a>
-<span class="sourceLineNo">300</span>           throws IOException, InterruptedException {<a name="line.300"></a>
-<span class="sourceLineNo">301</span><a name="line.301"></a>
-<span class="sourceLineNo">302</span>      Status status = new Status() {<a name="line.302"></a>
-<span class="sourceLineNo">303</span>        @Override<a name="line.303"></a>
-<span class="sourceLineNo">304</span>        public void setStatus(String msg) {<a name="line.304"></a>
-<span class="sourceLineNo">305</span>           context.setStatus(msg);<a name="line.305"></a>
-<span class="sourceLineNo">306</span>        }<a name="line.306"></a>
-<span class="sourceLineNo">307</span>      };<a name="line.307"></a>
-<span class="sourceLineNo">308</span><a name="line.308"></a>
-<span class="sourceLineNo">309</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.309"></a>
-<span class="sourceLineNo">310</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.310"></a>
-<span class="sourceLineNo">311</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.311"></a>
-<span class="sourceLineNo">312</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.312"></a>
-<span class="sourceLineNo">313</span>      AsyncConnection asyncCon = null;<a name="line.313"></a>
-<span class="sourceLineNo">314</span>      try {<a name="line.314"></a>
-<span class="sourceLineNo">315</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.315"></a>
-<span class="sourceLineNo">316</span>      } catch (ExecutionException e) {<a name="line.316"></a>
-<span class="sourceLineNo">317</span>        throw new IOException(e);<a name="line.317"></a>
-<span class="sourceLineNo">318</span>      }<a name="line.318"></a>
-<span class="sourceLineNo">319</span><a name="line.319"></a>
-<span class="sourceLineNo">320</span>      // Evaluation task<a name="line.320"></a>
-<span class="sourceLineNo">321</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.321"></a>
-<span class="sourceLineNo">322</span>      // Collect how much time the thing took. Report as map output and<a name="line.322"></a>
-<span class="sourceLineNo">323</span>      // to the ELAPSED_TIME counter.<a name="line.323"></a>
-<span class="sourceLineNo">324</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.324"></a>
-<span class="sourceLineNo">325</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.325"></a>
-<span class="sourceLineNo">326</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.326"></a>
-<span class="sourceLineNo">327</span>      context.progress();<a name="line.327"></a>
-<span class="sourceLineNo">328</span>    }<a name="line.328"></a>
-<span class="sourceLineNo">329</span>  }<a name="line.329"></a>
-<span class="sourceLineNo">330</span><a name="line.330"></a>
-<span class="sourceLineNo">331</span>  /*<a name="line.331"></a>
-<span class="sourceLineNo">332</span>   * If table does not already exist, create. Also create a table when<a name="line.332"></a>
-<span class="sourceLineNo">333</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.333"></a>
-<span class="sourceLineNo">334</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.334"></a>
-<span class="sourceLineNo">335</span>   */<a name="line.335"></a>
-<span class="sourceLineNo">336</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.336"></a>
-<span class="sourceLineNo">337</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.337"></a>
-<span class="sourceLineNo">338</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.338"></a>
-<span class="sourceLineNo">339</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.339"></a>
-<span class="sourceLineNo">340</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.340"></a>
-<span class="sourceLineNo">341</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.341"></a>
-<span class="sourceLineNo">342</span>      throw new IllegalStateException(<a name="line.342"></a>
-<span class="sourceLineNo">343</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.343"></a>
-<span class="sourceLineNo">344</span>    }<a name="line.344"></a>
-<span class="sourceLineNo">345</span>    HTableDescriptor desc =<a name="line.345"></a>
-<span class="sourceLineNo">346</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.346"></a>
-<span class="sourceLineNo">347</span>    byte[][] splits = getSplits(opts);<a name="line.347"></a>
-<span class="sourceLineNo">348</span><a name="line.348"></a>
-<span class="sourceLineNo">349</span>    // recreate the table when user has requested presplit or when existing<a name="line.349"></a>
-<span class="sourceLineNo">350</span>    // {RegionSplitPolicy,replica count} does not match requested.<a name="line.350"></a>
-<span class="sourceLineNo">351</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.351"></a>
-<span class="sourceLineNo">352</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.352"></a>
-<span class="sourceLineNo">353</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.353"></a>
-<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)) {<a name="line.354"></a>
-<span class="sourceLineNo">355</span>      needsDelete = true;<a name="line.355"></a>
-<span class="sourceLineNo">356</span>      // wait, why did it delete my table?!?<a name="line.356"></a>
-<span class="sourceLineNo">357</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.357"></a>
-<span class="sourceLineNo">358</span>        .add("needsDelete", needsDelete)<a name="line.358"></a>
-<span class="sourceLineNo">359</span>        .add("isReadCmd", isReadCmd)<a name="line.359"></a>
-<span class="sourceLineNo">360</span>        .add("exists", exists)<a name="line.360"></a>
-<span class="sourceLineNo">361</span>        .add("desc", desc)<a name="line.361"></a>
-<span class="sourceLineNo">362</span>        .add("presplit", opts.presplitRegions)<a name="line.362"></a>
-<span class="sourceLineNo">363</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.363"></a>
-<span class="sourceLineNo">364</span>        .add("replicas", opts.replicas)<a name="line.364"></a>
-<span class="sourceLineNo">365</span>        .toString());<a name="line.365"></a>
-<span class="sourceLineNo">366</span>    }<a name="line.366"></a>
-<span class="sourceLineNo">367</span><a name="line.367"></a>
-<span class="sourceLineNo">368</span>    // remove an existing table<a name="line.368"></a>
-<span class="sourceLineNo">369</span>    if (needsDelete) {<a name="line.369"></a>
-<span class="sourceLineNo">370</span>      if (admin.isTableEnabled(tableName)) {<a name="line.370"></a>
-<span class="sourceLineNo">371</span>        admin.disableTable(tableName);<a name="line.371"></a>
-<span class="sourceLineNo">372</span>      }<a name="line.372"></a>
-<span class="sourceLineNo">373</span>      admin.deleteTable(tableName);<a name="line.373"></a>
-<span class="sourceLineNo">374</span>    }<a name="line.374"></a>
-<span class="sourceLineNo">375</span><a name="line.375"></a>
-<span class="sourceLineNo">376</span>    // table creation is necessary<a name="line.376"></a>
-<span class="sourceLineNo">377</span>    if (!exists || needsDelete) {<a name="line.377"></a>
-<span class="sourceLineNo">378</span>      desc = getTableDescriptor(opts);<a name="line.378"></a>
-<span class="sourceLineNo">379</span>      if (splits != null) {<a name="line.379"></a>
-<span class="sourceLineNo">380</span>        if (LOG.isDebugEnabled()) {<a name="line.380"></a>
-<span class="sourceLineNo">381</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.381"></a>
-<span class="sourceLineNo">382</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.382"></a>
-<span class="sourceLineNo">383</span>          }<a name="line.383"></a>
-<span class="sourceLineNo">384</span>        }<a name="line.384"></a>
-<span class="sourceLineNo">385</span>      }<a name="line.385"></a>
-<span class="sourceLineNo">386</span>      admin.createTable(desc, splits);<a name="line.386"></a>
-<span class="sourceLineNo">387</span>      LOG.info("Table " + desc + " created");<a name="line.387"></a>
-<span class="sourceLineNo">388</span>    }<a name="line.388"></a>
-<span class="sourceLineNo">389</span>    return admin.tableExists(tableName);<a name="line.389"></a>
-<span class="sourceLineNo">390</span>  }<a name="line.390"></a>
-<span class="sourceLineNo">391</span><a name="line.391"></a>
-<span class="sourceLineNo">392</span>  /**<a name="line.392"></a>
-<span class="sourceLineNo">393</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.393"></a>
-<span class="sourceLineNo">394</span>   */<a name="line.394"></a>
-<span class="sourceLineNo">395</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.395"></a>
-<span class="sourceLineNo">396</span>    HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.396"></a>
-<span class="sourceLineNo">397</span>    HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);<a name="line.397"></a>
-<span class="sourceLineNo">398</span>    family.setDataBlockEncoding(opts.blockEncoding);<a name="line.398"></a>
-<span class="sourceLineNo">399</span>    family.setCompressionType(opts.compression);<a name="line.399"></a>
-<span class="sourceLineNo">400</span>    family.setBloomFilterType(opts.bloomType);<a name="line.400"></a>
-<span class="sourceLineNo">401</span>    family.setBlocksize(opts.blockSize);<a name="line.401"></a>
-<span class="sourceLineNo">402</span>    if (opts.inMemoryCF) {<a name="line.402"></a>
-<span class="sourceLineNo">403</span>      family.setInMemory(true);<a name="line.403"></a>
-<span class="sourceLineNo">404</span>    }<a name="line.404"></a>
-<span class="sourceLineNo">405</span>    family.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.405"></a>
-<span class="sourceLineNo">406</span>    desc.addFamily(family);<a name="line.406"></a>
-<span class="sourceLineNo">407</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.407"></a>
-<span class="sourceLineNo">408</span>      desc.setRegionReplication(opts.replicas);<a name="line.408"></a>
-<span class="sourceLineNo">409</span>    }<a name="line.409"></a>
-<span class="sourceLineNo">410</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.410"></a>
-<span class="sourceLineNo">411</span>      desc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.411"></a>
-<span class="sourceLineNo">412</span>    }<a name="line.412"></a>
-<span class="sourceLineNo">413</span>    return desc;<a name="line.413"></a>
-<span class="sourceLineNo">414</span>  }<a name="line.414"></a>
-<span class="sourceLineNo">415</span><a name="line.415"></a>
-<span class="sourceLineNo">416</span>  /**<a name="line.416"></a>
-<span class="sourceLineNo">417</span>   * generates splits based on total number of rows and specified split regions<a name="line.417"></a>
-<span class="sourceLineNo">418</span>   */<a name="line.418"></a>
-<span class="sourceLineNo">419</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.419"></a>
-<span class="sourceLineNo">420</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.420"></a>
-<span class="sourceLineNo">421</span>      return null;<a name="line.421"></a>
+<span class="sourceLineNo">142</span>  public static final String FAMILY_NAME_BASE = "info";<a name="line.142"></a>
+<span class="sourceLineNo">143</span>  public static final byte[] FAMILY_ZERO = Bytes.toBytes("info0");<a name="line.143"></a>
+<span class="sourceLineNo">144</span>  public static final byte[] COLUMN_ZERO = Bytes.toBytes("" + 0);<a name="line.144"></a>
+<span class="sourceLineNo">145</span>  public static final int DEFAULT_VALUE_LENGTH = 1000;<a name="line.145"></a>
+<span class="sourceLineNo">146</span>  public static final int ROW_LENGTH = 26;<a name="line.146"></a>
+<span class="sourceLineNo">147</span><a name="line.147"></a>
+<span class="sourceLineNo">148</span>  private static final int ONE_GB = 1024 * 1024 * 1000;<a name="line.148"></a>
+<span class="sourceLineNo">149</span>  private static final int DEFAULT_ROWS_PER_GB = ONE_GB / DEFAULT_VALUE_LENGTH;<a name="line.149"></a>
+<span class="sourceLineNo">150</span>  // TODO : should we make this configurable<a name="line.150"></a>
+<span class="sourceLineNo">151</span>  private static final int TAG_LENGTH = 256;<a name="line.151"></a>
+<span class="sourceLineNo">152</span>  private static final DecimalFormat FMT = new DecimalFormat("0.##");<a name="line.152"></a>
+<span class="sourceLineNo">153</span>  private static final MathContext CXT = MathContext.DECIMAL64;<a name="line.153"></a>
+<span class="sourceLineNo">154</span>  private static final BigDecimal MS_PER_SEC = BigDecimal.valueOf(1000);<a name="line.154"></a>
+<span class="sourceLineNo">155</span>  private static final BigDecimal BYTES_PER_MB = BigDecimal.valueOf(1024 * 1024);<a name="line.155"></a>
+<span class="sourceLineNo">156</span>  private static final TestOptions DEFAULT_OPTS = new TestOptions();<a name="line.156"></a>
+<span class="sourceLineNo">157</span><a name="line.157"></a>
+<span class="sourceLineNo">158</span>  private static Map&lt;String, CmdDescriptor&gt; COMMANDS = new TreeMap&lt;&gt;();<a name="line.158"></a>
+<span class="sourceLineNo">159</span>  private static final Path PERF_EVAL_DIR = new Path("performance_evaluation");<a name="line.159"></a>
+<span class="sourceLineNo">160</span><a name="line.160"></a>
+<span class="sourceLineNo">161</span>  static {<a name="line.161"></a>
+<span class="sourceLineNo">162</span>    addCommandDescriptor(AsyncRandomReadTest.class, "asyncRandomRead",<a name="line.162"></a>
+<span class="sourceLineNo">163</span>        "Run async random read test");<a name="line.163"></a>
+<span class="sourceLineNo">164</span>    addCommandDescriptor(AsyncRandomWriteTest.class, "asyncRandomWrite",<a name="line.164"></a>
+<span class="sourceLineNo">165</span>        "Run async random write test");<a name="line.165"></a>
+<span class="sourceLineNo">166</span>    addCommandDescriptor(AsyncSequentialReadTest.class, "asyncSequentialRead",<a name="line.166"></a>
+<span class="sourceLineNo">167</span>        "Run async sequential read test");<a name="line.167"></a>
+<span class="sourceLineNo">168</span>    addCommandDescriptor(AsyncSequentialWriteTest.class, "asyncSequentialWrite",<a name="line.168"></a>
+<span class="sourceLineNo">169</span>        "Run async sequential write test");<a name="line.169"></a>
+<span class="sourceLineNo">170</span>    addCommandDescriptor(AsyncScanTest.class, "asyncScan",<a name="line.170"></a>
+<span class="sourceLineNo">171</span>        "Run async scan test (read every row)");<a name="line.171"></a>
+<span class="sourceLineNo">172</span>    addCommandDescriptor(RandomReadTest.class, RANDOM_READ,<a name="line.172"></a>
+<span class="sourceLineNo">173</span>      "Run random read test");<a name="line.173"></a>
+<span class="sourceLineNo">174</span>    addCommandDescriptor(RandomSeekScanTest.class, RANDOM_SEEK_SCAN,<a name="line.174"></a>
+<span class="sourceLineNo">175</span>      "Run random seek and scan 100 test");<a name="line.175"></a>
+<span class="sourceLineNo">176</span>    addCommandDescriptor(RandomScanWithRange10Test.class, "scanRange10",<a name="line.176"></a>
+<span class="sourceLineNo">177</span>      "Run random seek scan with both start and stop row (max 10 rows)");<a name="line.177"></a>
+<span class="sourceLineNo">178</span>    addCommandDescriptor(RandomScanWithRange100Test.class, "scanRange100",<a name="line.178"></a>
+<span class="sourceLineNo">179</span>      "Run random seek scan with both start and stop row (max 100 rows)");<a name="line.179"></a>
+<span class="sourceLineNo">180</span>    addCommandDescriptor(RandomScanWithRange1000Test.class, "scanRange1000",<a name="line.180"></a>
+<span class="sourceLineNo">181</span>      "Run random seek scan with both start and stop row (max 1000 rows)");<a name="line.181"></a>
+<span class="sourceLineNo">182</span>    addCommandDescriptor(RandomScanWithRange10000Test.class, "scanRange10000",<a name="line.182"></a>
+<span class="sourceLineNo">183</span>      "Run random seek scan with both start and stop row (max 10000 rows)");<a name="line.183"></a>
+<span class="sourceLineNo">184</span>    addCommandDescriptor(RandomWriteTest.class, "randomWrite",<a name="line.184"></a>
+<span class="sourceLineNo">185</span>      "Run random write test");<a name="line.185"></a>
+<span class="sourceLineNo">186</span>    addCommandDescriptor(SequentialReadTest.class, "sequentialRead",<a name="line.186"></a>
+<span class="sourceLineNo">187</span>      "Run sequential read test");<a name="line.187"></a>
+<span class="sourceLineNo">188</span>    addCommandDescriptor(SequentialWriteTest.class, "sequentialWrite",<a name="line.188"></a>
+<span class="sourceLineNo">189</span>      "Run sequential write test");<a name="line.189"></a>
+<span class="sourceLineNo">190</span>    addCommandDescriptor(ScanTest.class, "scan",<a name="line.190"></a>
+<span class="sourceLineNo">191</span>      "Run scan test (read every row)");<a name="line.191"></a>
+<span class="sourceLineNo">192</span>    addCommandDescriptor(FilteredScanTest.class, "filterScan",<a name="line.192"></a>
+<span class="sourceLineNo">193</span>      "Run scan test using a filter to find a specific row based on it's value " +<a name="line.193"></a>
+<span class="sourceLineNo">194</span>      "(make sure to use --rows=20)");<a name="line.194"></a>
+<span class="sourceLineNo">195</span>    addCommandDescriptor(IncrementTest.class, "increment",<a name="line.195"></a>
+<span class="sourceLineNo">196</span>      "Increment on each row; clients overlap on keyspace so some concurrent operations");<a name="line.196"></a>
+<span class="sourceLineNo">197</span>    addCommandDescriptor(AppendTest.class, "append",<a name="line.197"></a>
+<span class="sourceLineNo">198</span>      "Append on each row; clients overlap on keyspace so some concurrent operations");<a name="line.198"></a>
+<span class="sourceLineNo">199</span>    addCommandDescriptor(CheckAndMutateTest.class, "checkAndMutate",<a name="line.199"></a>
+<span class="sourceLineNo">200</span>      "CheckAndMutate on each row; clients overlap on keyspace so some concurrent operations");<a name="line.200"></a>
+<span class="sourceLineNo">201</span>    addCommandDescriptor(CheckAndPutTest.class, "checkAndPut",<a name="line.201"></a>
+<span class="sourceLineNo">202</span>      "CheckAndPut on each row; clients overlap on keyspace so some concurrent operations");<a name="line.202"></a>
+<span class="sourceLineNo">203</span>    addCommandDescriptor(CheckAndDeleteTest.class, "checkAndDelete",<a name="line.203"></a>
+<span class="sourceLineNo">204</span>      "CheckAndDelete on each row; clients overlap on keyspace so some concurrent operations");<a name="line.204"></a>
+<span class="sourceLineNo">205</span>  }<a name="line.205"></a>
+<span class="sourceLineNo">206</span><a name="line.206"></a>
+<span class="sourceLineNo">207</span>  /**<a name="line.207"></a>
+<span class="sourceLineNo">208</span>   * Enum for map metrics.  Keep it out here rather than inside in the Map<a name="line.208"></a>
+<span class="sourceLineNo">209</span>   * inner-class so we can find associated properties.<a name="line.209"></a>
+<span class="sourceLineNo">210</span>   */<a name="line.210"></a>
+<span class="sourceLineNo">211</span>  protected static enum Counter {<a name="line.211"></a>
+<span class="sourceLineNo">212</span>    /** elapsed time */<a name="line.212"></a>
+<span class="sourceLineNo">213</span>    ELAPSED_TIME,<a name="line.213"></a>
+<span class="sourceLineNo">214</span>    /** number of rows */<a name="line.214"></a>
+<span class="sourceLineNo">215</span>    ROWS<a name="line.215"></a>
+<span class="sourceLineNo">216</span>  }<a name="line.216"></a>
+<span class="sourceLineNo">217</span><a name="line.217"></a>
+<span class="sourceLineNo">218</span>  protected static class RunResult implements Comparable&lt;RunResult&gt; {<a name="line.218"></a>
+<span class="sourceLineNo">219</span>    public RunResult(long duration, Histogram hist) {<a name="line.219"></a>
+<span class="sourceLineNo">220</span>      this.duration = duration;<a name="line.220"></a>
+<span class="sourceLineNo">221</span>      this.hist = hist;<a name="line.221"></a>
+<span class="sourceLineNo">222</span>    }<a name="line.222"></a>
+<span class="sourceLineNo">223</span><a name="line.223"></a>
+<span class="sourceLineNo">224</span>    public final long duration;<a name="line.224"></a>
+<span class="sourceLineNo">225</span>    public final Histogram hist;<a name="line.225"></a>
+<span class="sourceLineNo">226</span><a name="line.226"></a>
+<span class="sourceLineNo">227</span>    @Override<a name="line.227"></a>
+<span class="sourceLineNo">228</span>    public String toString() {<a name="line.228"></a>
+<span class="sourceLineNo">229</span>      return Long.toString(duration);<a name="line.229"></a>
+<span class="sourceLineNo">230</span>    }<a name="line.230"></a>
+<span class="sourceLineNo">231</span><a name="line.231"></a>
+<span class="sourceLineNo">232</span>    @Override public int compareTo(RunResult o) {<a name="line.232"></a>
+<span class="sourceLineNo">233</span>      return Long.compare(this.duration, o.duration);<a name="line.233"></a>
+<span class="sourceLineNo">234</span>    }<a name="line.234"></a>
+<span class="sourceLineNo">235</span>  }<a name="line.235"></a>
+<span class="sourceLineNo">236</span><a name="line.236"></a>
+<span class="sourceLineNo">237</span>  /**<a name="line.237"></a>
+<span class="sourceLineNo">238</span>   * Constructor<a name="line.238"></a>
+<span class="sourceLineNo">239</span>   * @param conf Configuration object<a name="line.239"></a>
+<span class="sourceLineNo">240</span>   */<a name="line.240"></a>
+<span class="sourceLineNo">241</span>  public PerformanceEvaluation(final Configuration conf) {<a name="line.241"></a>
+<span class="sourceLineNo">242</span>    super(conf);<a name="line.242"></a>
+<span class="sourceLineNo">243</span>  }<a name="line.243"></a>
+<span class="sourceLineNo">244</span><a name="line.244"></a>
+<span class="sourceLineNo">245</span>  protected static void addCommandDescriptor(Class&lt;? extends TestBase&gt; cmdClass,<a name="line.245"></a>
+<span class="sourceLineNo">246</span>      String name, String description) {<a name="line.246"></a>
+<span class="sourceLineNo">247</span>    CmdDescriptor cmdDescriptor = new CmdDescriptor(cmdClass, name, description);<a name="line.247"></a>
+<span class="sourceLineNo">248</span>    COMMANDS.put(name, cmdDescriptor);<a name="line.248"></a>
+<span class="sourceLineNo">249</span>  }<a name="line.249"></a>
+<span class="sourceLineNo">250</span><a name="line.250"></a>
+<span class="sourceLineNo">251</span>  /**<a name="line.251"></a>
+<span class="sourceLineNo">252</span>   * Implementations can have their status set.<a name="line.252"></a>
+<span class="sourceLineNo">253</span>   */<a name="line.253"></a>
+<span class="sourceLineNo">254</span>  interface Status {<a name="line.254"></a>
+<span class="sourceLineNo">255</span>    /**<a name="line.255"></a>
+<span class="sourceLineNo">256</span>     * Sets status<a name="line.256"></a>
+<span class="sourceLineNo">257</span>     * @param msg status message<a name="line.257"></a>
+<span class="sourceLineNo">258</span>     * @throws IOException<a name="line.258"></a>
+<span class="sourceLineNo">259</span>     */<a name="line.259"></a>
+<span class="sourceLineNo">260</span>    void setStatus(final String msg) throws IOException;<a name="line.260"></a>
+<span class="sourceLineNo">261</span>  }<a name="line.261"></a>
+<span class="sourceLineNo">262</span><a name="line.262"></a>
+<span class="sourceLineNo">263</span>  /**<a name="line.263"></a>
+<span class="sourceLineNo">264</span>   * MapReduce job that runs a performance evaluation client in each map task.<a name="line.264"></a>
+<span class="sourceLineNo">265</span>   */<a name="line.265"></a>
+<span class="sourceLineNo">266</span>  public static class EvaluationMapTask<a name="line.266"></a>
+<span class="sourceLineNo">267</span>      extends Mapper&lt;LongWritable, Text, LongWritable, LongWritable&gt; {<a name="line.267"></a>
+<span class="sourceLineNo">268</span><a name="line.268"></a>
+<span class="sourceLineNo">269</span>    /** configuration parameter name that contains the command */<a name="line.269"></a>
+<span class="sourceLineNo">270</span>    public final static String CMD_KEY = "EvaluationMapTask.command";<a name="line.270"></a>
+<span class="sourceLineNo">271</span>    /** configuration parameter name that contains the PE impl */<a name="line.271"></a>
+<span class="sourceLineNo">272</span>    public static final String PE_KEY = "EvaluationMapTask.performanceEvalImpl";<a name="line.272"></a>
+<span class="sourceLineNo">273</span><a name="line.273"></a>
+<span class="sourceLineNo">274</span>    private Class&lt;? extends Test&gt; cmd;<a name="line.274"></a>
+<span class="sourceLineNo">275</span><a name="line.275"></a>
+<span class="sourceLineNo">276</span>    @Override<a name="line.276"></a>
+<span class="sourceLineNo">277</span>    protected void setup(Context context) throws IOException, InterruptedException {<a name="line.277"></a>
+<span class="sourceLineNo">278</span>      this.cmd = forName(context.getConfiguration().get(CMD_KEY), Test.class);<a name="line.278"></a>
+<span class="sourceLineNo">279</span><a name="line.279"></a>
+<span class="sourceLineNo">280</span>      // this is required so that extensions of PE are instantiated within the<a name="line.280"></a>
+<span class="sourceLineNo">281</span>      // map reduce task...<a name="line.281"></a>
+<span class="sourceLineNo">282</span>      Class&lt;? extends PerformanceEvaluation&gt; peClass =<a name="line.282"></a>
+<span class="sourceLineNo">283</span>          forName(context.getConfiguration().get(PE_KEY), PerformanceEvaluation.class);<a name="line.283"></a>
+<span class="sourceLineNo">284</span>      try {<a name="line.284"></a>
+<span class="sourceLineNo">285</span>        peClass.getConstructor(Configuration.class).newInstance(context.getConfiguration());<a name="line.285"></a>
+<span class="sourceLineNo">286</span>      } catch (Exception e) {<a name="line.286"></a>
+<span class="sourceLineNo">287</span>        throw new IllegalStateException("Could not instantiate PE instance", e);<a name="line.287"></a>
+<span class="sourceLineNo">288</span>      }<a name="line.288"></a>
+<span class="sourceLineNo">289</span>    }<a name="line.289"></a>
+<span class="sourceLineNo">290</span><a name="line.290"></a>
+<span class="sourceLineNo">291</span>    private &lt;Type&gt; Class&lt;? extends Type&gt; forName(String className, Class&lt;Type&gt; type) {<a name="line.291"></a>
+<span class="sourceLineNo">292</span>      try {<a name="line.292"></a>
+<span class="sourceLineNo">293</span>        return Class.forName(className).asSubclass(type);<a name="line.293"></a>
+<span class="sourceLineNo">294</span>      } catch (ClassNotFoundException e) {<a name="line.294"></a>
+<span class="sourceLineNo">295</span>        throw new IllegalStateException("Could not find class for name: " + className, e);<a name="line.295"></a>
+<span class="sourceLineNo">296</span>      }<a name="line.296"></a>
+<span class="sourceLineNo">297</span>    }<a name="line.297"></a>
+<span class="sourceLineNo">298</span><a name="line.298"></a>
+<span class="sourceLineNo">299</span>    @Override<a name="line.299"></a>
+<span class="sourceLineNo">300</span>    protected void map(LongWritable key, Text value, final Context context)<a name="line.300"></a>
+<span class="sourceLineNo">301</span>           throws IOException, InterruptedException {<a name="line.301"></a>
+<span class="sourceLineNo">302</span><a name="line.302"></a>
+<span class="sourceLineNo">303</span>      Status status = new Status() {<a name="line.303"></a>
+<span class="sourceLineNo">304</span>        @Override<a name="line.304"></a>
+<span class="sourceLineNo">305</span>        public void setStatus(String msg) {<a name="line.305"></a>
+<span class="sourceLineNo">306</span>           context.setStatus(msg);<a name="line.306"></a>
+<span class="sourceLineNo">307</span>        }<a name="line.307"></a>
+<span class="sourceLineNo">308</span>      };<a name="line.308"></a>
+<span class="sourceLineNo">309</span><a name="line.309"></a>
+<span class="sourceLineNo">310</span>      ObjectMapper mapper = new ObjectMapper();<a name="line.310"></a>
+<span class="sourceLineNo">311</span>      TestOptions opts = mapper.readValue(value.toString(), TestOptions.class);<a name="line.311"></a>
+<span class="sourceLineNo">312</span>      Configuration conf = HBaseConfiguration.create(context.getConfiguration());<a name="line.312"></a>
+<span class="sourceLineNo">313</span>      final Connection con = ConnectionFactory.createConnection(conf);<a name="line.313"></a>
+<span class="sourceLineNo">314</span>      AsyncConnection asyncCon = null;<a name="line.314"></a>
+<span class="sourceLineNo">315</span>      try {<a name="line.315"></a>
+<span class="sourceLineNo">316</span>        asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.316"></a>
+<span class="sourceLineNo">317</span>      } catch (ExecutionException e) {<a name="line.317"></a>
+<span class="sourceLineNo">318</span>        throw new IOException(e);<a name="line.318"></a>
+<span class="sourceLineNo">319</span>      }<a name="line.319"></a>
+<span class="sourceLineNo">320</span><a name="line.320"></a>
+<span class="sourceLineNo">321</span>      // Evaluation task<a name="line.321"></a>
+<span class="sourceLineNo">322</span>      RunResult result = PerformanceEvaluation.runOneClient(this.cmd, conf, con, asyncCon, opts, status);<a name="line.322"></a>
+<span class="sourceLineNo">323</span>      // Collect how much time the thing took. Report as map output and<a name="line.323"></a>
+<span class="sourceLineNo">324</span>      // to the ELAPSED_TIME counter.<a name="line.324"></a>
+<span class="sourceLineNo">325</span>      context.getCounter(Counter.ELAPSED_TIME).increment(result.duration);<a name="line.325"></a>
+<span class="sourceLineNo">326</span>      context.getCounter(Counter.ROWS).increment(opts.perClientRunRows);<a name="line.326"></a>
+<span class="sourceLineNo">327</span>      context.write(new LongWritable(opts.startRow), new LongWritable(result.duration));<a name="line.327"></a>
+<span class="sourceLineNo">328</span>      context.progress();<a name="line.328"></a>
+<span class="sourceLineNo">329</span>    }<a name="line.329"></a>
+<span class="sourceLineNo">330</span>  }<a name="line.330"></a>
+<span class="sourceLineNo">331</span><a name="line.331"></a>
+<span class="sourceLineNo">332</span>  /*<a name="line.332"></a>
+<span class="sourceLineNo">333</span>   * If table does not already exist, create. Also create a table when<a name="line.333"></a>
+<span class="sourceLineNo">334</span>   * {@code opts.presplitRegions} is specified or when the existing table's<a name="line.334"></a>
+<span class="sourceLineNo">335</span>   * region replica count doesn't match {@code opts.replicas}.<a name="line.335"></a>
+<span class="sourceLineNo">336</span>   */<a name="line.336"></a>
+<span class="sourceLineNo">337</span>  static boolean checkTable(Admin admin, TestOptions opts) throws IOException {<a name="line.337"></a>
+<span class="sourceLineNo">338</span>    TableName tableName = TableName.valueOf(opts.tableName);<a name="line.338"></a>
+<span class="sourceLineNo">339</span>    boolean needsDelete = false, exists = admin.tableExists(tableName);<a name="line.339"></a>
+<span class="sourceLineNo">340</span>    boolean isReadCmd = opts.cmdName.toLowerCase(Locale.ROOT).contains("read")<a name="line.340"></a>
+<span class="sourceLineNo">341</span>      || opts.cmdName.toLowerCase(Locale.ROOT).contains("scan");<a name="line.341"></a>
+<span class="sourceLineNo">342</span>    if (!exists &amp;&amp; isReadCmd) {<a name="line.342"></a>
+<span class="sourceLineNo">343</span>      throw new IllegalStateException(<a name="line.343"></a>
+<span class="sourceLineNo">344</span>        "Must specify an existing table for read commands. Run a write command first.");<a name="line.344"></a>
+<span class="sourceLineNo">345</span>    }<a name="line.345"></a>
+<span class="sourceLineNo">346</span>    HTableDescriptor desc =<a name="line.346"></a>
+<span class="sourceLineNo">347</span>      exists ? admin.getTableDescriptor(TableName.valueOf(opts.tableName)) : null;<a name="line.347"></a>
+<span class="sourceLineNo">348</span>    byte[][] splits = getSplits(opts);<a name="line.348"></a>
+<span class="sourceLineNo">349</span><a name="line.349"></a>
+<span class="sourceLineNo">350</span>    // recreate the table when user has requested presplit or when existing<a name="line.350"></a>
+<span class="sourceLineNo">351</span>    // {RegionSplitPolicy,replica count} does not match requested, or when the<a name="line.351"></a>
+<span class="sourceLineNo">352</span>    // number of column families does not match requested.<a name="line.352"></a>
+<span class="sourceLineNo">353</span>    if ((exists &amp;&amp; opts.presplitRegions != DEFAULT_OPTS.presplitRegions)<a name="line.353"></a>
+<span class="sourceLineNo">354</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp;<a name="line.354"></a>
+<span class="sourceLineNo">355</span>          !StringUtils.equals(desc.getRegionSplitPolicyClassName(), opts.splitPolicy))<a name="line.355"></a>
+<span class="sourceLineNo">356</span>      || (!isReadCmd &amp;&amp; desc != null &amp;&amp; desc.getRegionReplication() != opts.replicas)<a name="line.356"></a>
+<span class="sourceLineNo">357</span>      || (desc != null &amp;&amp; desc.getColumnFamilyCount() != opts.families)) {<a name="line.357"></a>
+<span class="sourceLineNo">358</span>      needsDelete = true;<a name="line.358"></a>
+<span class="sourceLineNo">359</span>      // wait, why did it delete my table?!?<a name="line.359"></a>
+<span class="sourceLineNo">360</span>      LOG.debug(MoreObjects.toStringHelper("needsDelete")<a name="line.360"></a>
+<span class="sourceLineNo">361</span>        .add("needsDelete", needsDelete)<a name="line.361"></a>
+<span class="sourceLineNo">362</span>        .add("isReadCmd", isReadCmd)<a name="line.362"></a>
+<span class="sourceLineNo">363</span>        .add("exists", exists)<a name="line.363"></a>
+<span class="sourceLineNo">364</span>        .add("desc", desc)<a name="line.364"></a>
+<span class="sourceLineNo">365</span>        .add("presplit", opts.presplitRegions)<a name="line.365"></a>
+<span class="sourceLineNo">366</span>        .add("splitPolicy", opts.splitPolicy)<a name="line.366"></a>
+<span class="sourceLineNo">367</span>        .add("replicas", opts.replicas)<a name="line.367"></a>
+<span class="sourceLineNo">368</span>        .add("families", opts.families)<a name="line.368"></a>
+<span class="sourceLineNo">369</span>        .toString());<a name="line.369"></a>
+<span class="sourceLineNo">370</span>    }<a name="line.370"></a>
+<span class="sourceLineNo">371</span><a name="line.371"></a>
+<span class="sourceLineNo">372</span>    // remove an existing table<a name="line.372"></a>
+<span class="sourceLineNo">373</span>    if (needsDelete) {<a name="line.373"></a>
+<span class="sourceLineNo">374</span>      if (admin.isTableEnabled(tableName)) {<a name="line.374"></a>
+<span class="sourceLineNo">375</span>        admin.disableTable(tableName);<a name="line.375"></a>
+<span class="sourceLineNo">376</span>      }<a name="line.376"></a>
+<span class="sourceLineNo">377</span>      admin.deleteTable(tableName);<a name="line.377"></a>
+<span class="sourceLineNo">378</span>    }<a name="line.378"></a>
+<span class="sourceLineNo">379</span><a name="line.379"></a>
+<span class="sourceLineNo">380</span>    // table creation is necessary<a name="line.380"></a>
+<span class="sourceLineNo">381</span>    if (!exists || needsDelete) {<a name="line.381"></a>
+<span class="sourceLineNo">382</span>      desc = getTableDescriptor(opts);<a name="line.382"></a>
+<span class="sourceLineNo">383</span>      if (splits != null) {<a name="line.383"></a>
+<span class="sourceLineNo">384</span>        if (LOG.isDebugEnabled()) {<a name="line.384"></a>
+<span class="sourceLineNo">385</span>          for (int i = 0; i &lt; splits.length; i++) {<a name="line.385"></a>
+<span class="sourceLineNo">386</span>            LOG.debug(" split " + i + ": " + Bytes.toStringBinary(splits[i]));<a name="line.386"></a>
+<span class="sourceLineNo">387</span>          }<a name="line.387"></a>
+<span class="sourceLineNo">388</span>        }<a name="line.388"></a>
+<span class="sourceLineNo">389</span>      }<a name="line.389"></a>
+<span class="sourceLineNo">390</span>      admin.createTable(desc, splits);<a name="line.390"></a>
+<span class="sourceLineNo">391</span>      LOG.info("Table " + desc + " created");<a name="line.391"></a>
+<span class="sourceLineNo">392</span>    }<a name="line.392"></a>
+<span class="sourceLineNo">393</span>    return admin.tableExists(tableName);<a name="line.393"></a>
+<span class="sourceLineNo">394</span>  }<a name="line.394"></a>
+<span class="sourceLineNo">395</span><a name="line.395"></a>
+<span class="sourceLineNo">396</span>  /**<a name="line.396"></a>
+<span class="sourceLineNo">397</span>   * Create an HTableDescriptor from provided TestOptions.<a name="line.397"></a>
+<span class="sourceLineNo">398</span>   */<a name="line.398"></a>
+<span class="sourceLineNo">399</span>  protected static HTableDescriptor getTableDescriptor(TestOptions opts) {<a name="line.399"></a>
+<span class="sourceLineNo">400</span>    HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(opts.tableName));<a name="line.400"></a>
+<span class="sourceLineNo">401</span>    for (int family = 0; family &lt; opts.families; family++) {<a name="line.401"></a>
+<span class="sourceLineNo">402</span>      byte[] familyName = Bytes.toBytes(FAMILY_NAME_BASE + family);<a name="line.402"></a>
+<span class="sourceLineNo">403</span>      HColumnDescriptor familyDesc = new HColumnDescriptor(familyName);<a name="line.403"></a>
+<span class="sourceLineNo">404</span>      familyDesc.setDataBlockEncoding(opts.blockEncoding);<a name="line.404"></a>
+<span class="sourceLineNo">405</span>      familyDesc.setCompressionType(opts.compression);<a name="line.405"></a>
+<span class="sourceLineNo">406</span>      familyDesc.setBloomFilterType(opts.bloomType);<a name="line.406"></a>
+<span class="sourceLineNo">407</span>      familyDesc.setBlocksize(opts.blockSize);<a name="line.407"></a>
+<span class="sourceLineNo">408</span>      if (opts.inMemoryCF) {<a name="line.408"></a>
+<span class="sourceLineNo">409</span>        familyDesc.setInMemory(true);<a name="line.409"></a>
+<span class="sourceLineNo">410</span>      }<a name="line.410"></a>
+<span class="sourceLineNo">411</span>      familyDesc.setInMemoryCompaction(opts.inMemoryCompaction);<a name="line.411"></a>
+<span class="sourceLineNo">412</span>      tableDesc.addFamily(familyDesc);<a name="line.412"></a>
+<span class="sourceLineNo">413</span>    }<a name="line.413"></a>
+<span class="sourceLineNo">414</span>    if (opts.replicas != DEFAULT_OPTS.replicas) {<a name="line.414"></a>
+<span class="sourceLineNo">415</span>      tableDesc.setRegionReplication(opts.replicas);<a name="line.415"></a>
+<span class="sourceLineNo">416</span>    }<a name="line.416"></a>
+<span class="sourceLineNo">417</span>    if (opts.splitPolicy != null &amp;&amp; !opts.splitPolicy.equals(DEFAULT_OPTS.splitPolicy)) {<a name="line.417"></a>
+<span class="sourceLineNo">418</span>      tableDesc.setRegionSplitPolicyClassName(opts.splitPolicy);<a name="line.418"></a>
+<span class="sourceLineNo">419</span>    }<a name="line.419"></a>
+<span class="sourceLineNo">420</span>    return tableDesc;<a name="line.420"></a>
+<span class="sourceLineNo">421</span>  }<a name="line.421"></a>
 <span class="sourceLineNo">422</span><a name="line.422"></a>
-<span class="sourceLineNo">423</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.423"></a>
-<span class="sourceLineNo">424</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.424"></a>
-<span class="sourceLineNo">425</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.425"></a>
-<span class="sourceLineNo">426</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.426"></a>
-<span class="sourceLineNo">427</span>      int rowkey = jump * (1 + i);<a name="line.427"></a>
-<span class="sourceLineNo">428</span>      splits[i] = format(rowkey);<a name="line.428"></a>
-<span class="sourceLineNo">429</span>    }<a name="line.429"></a>
-<span class="sourceLineNo">430</span>    return splits;<a name="line.430"></a>
-<span class="sourceLineNo">431</span>  }<a name="line.431"></a>
-<span class="sourceLineNo">432</span><a name="line.432"></a>
-<span class="sourceLineNo">433</span>  /*<a name="line.433"></a>
-<span class="sourceLineNo">434</span>   * Run all clients in this vm each to its own thread.<a name="line.434"></a>
-<span class="sourceLineNo">435</span>   */<a name="line.435"></a>
-<span class="sourceLineNo">436</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.436"></a>
-<span class="sourceLineNo">437</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.437"></a>
-<span class="sourceLineNo">438</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.438"></a>
-<span class="sourceLineNo">439</span>    assert cmd != null;<a name="line.439"></a>
-<span class="sourceLineNo">440</span>    @SuppressWarnings("unchecked")<a name="line.440"></a>
-<span class="sourceLineNo">441</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.441"></a>
-<span class="sourceLineNo">442</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.442"></a>
-<span class="sourceLineNo">443</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.443"></a>
-<span class="sourceLineNo">444</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.444"></a>
-<span class="sourceLineNo">445</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.445"></a>
-<span class="sourceLineNo">446</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.446"></a>
-<span class="sourceLineNo">447</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.447"></a>
-<span class="sourceLineNo">448</span>      final int index = i;<a name="line.448"></a>
-<span class="sourceLineNo">449</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.449"></a>
-<span class="sourceLineNo">450</span>        @Override<a name="line.450"></a>
-<span class="sourceLineNo">451</span>        public RunResult call() throws Exception {<a name="line.451"></a>
-<span class="sourceLineNo">452</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.452"></a>
-<span class="sourceLineNo">453</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.453"></a>
-<span class="sourceLineNo">454</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.454"></a>
-<span class="sourceLineNo">455</span>            @Override<a name="line.455"></a>
-<span class="sourceLineNo">456</span>            public void setStatus(final String msg) throws IOException {<a name="line.456"></a>
-<span class="sourceLineNo">457</span>              LOG.info(msg);<a name="line.457"></a>
-<span class="sourceLineNo">458</span>            }<a name="line.458"></a>
-<span class="sourceLineNo">459</span>          });<a name="line.459"></a>
-<span class="sourceLineNo">460</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.460"></a>
-<span class="sourceLineNo">461</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.461"></a>
-<span class="sourceLineNo">462</span>          return run;<a name="line.462"></a>
-<span class="sourceLineNo">463</span>        }<a name="line.463"></a>
-<span class="sourceLineNo">464</span>      });<a name="line.464"></a>
-<span class="sourceLineNo">465</span>    }<a name="line.465"></a>
-<span class="sourceLineNo">466</span>    pool.shutdown();<a name="line.466"></a>
-<span class="sourceLineNo">467</span><a name="line.467"></a>
-<span class="sourceLineNo">468</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.468"></a>
-<span class="sourceLineNo">469</span>      try {<a name="line.469"></a>
-<span class="sourceLineNo">470</span>        results[i] = threads[i].get();<a name="line.470"></a>
-<span class="sourceLineNo">471</span>      } catch (ExecutionException e) {<a name="line.471"></a>
-<span class="sourceLineNo">472</span>        throw new IOException(e.getCause());<a name="line.472"></a>
-<span class="sourceLineNo">473</span>      }<a name="line.473"></a>
-<span class="sourceLineNo">474</span>    }<a name="line.474"></a>
-<span class="sourceLineNo">475</span>    final String test = cmd.getSimpleName();<a name="line.475"></a>
-<span class="sourceLineNo">476</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.476"></a>
-<span class="sourceLineNo">477</span>             + Arrays.toString(results));<a name="line.477"></a>
-<span class="sourceLineNo">478</span>    Arrays.sort(results);<a name="line.478"></a>
-<span class="sourceLineNo">479</span>    long total = 0;<a name="line.479"></a>
-<span class="sourceLineNo">480</span>    for (RunResult result : results) {<a name="line.480"></a>
-<span class="sourceLineNo">481</span>      total += result.duration;<a name="line.481"></a>
-<span class="sourceLineNo">482</span>    }<a name="line.482"></a>
-<span class="sourceLineNo">483</span>    LOG.info("[" + test + "]"<a name="line.483"></a>
-<span class="sourceLineNo">484</span>      + "\tMin: " + results[0] + "ms"<a name="line.484"></a>
-<span class="sourceLineNo">485</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.485"></a>
-<span class="sourceLineNo">486</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.486"></a>
-<span class="sourceLineNo">487</span><a name="line.487"></a>
-<span class="sourceLineNo">488</span>    con.close();<a name="line.488"></a>
-<span class="sourceLineNo">489</span>    asyncCon.close();<a name="line.489"></a>
-<span class="sourceLineNo">490</span><a name="line.490"></a>
-<span class="sourceLineNo">491</span>    return results;<a name="line.491"></a>
-<span class="sourceLineNo">492</span>  }<a name="line.492"></a>
-<span class="sourceLineNo">493</span><a name="line.493"></a>
-<span class="sourceLineNo">494</span>  /*<a name="line.494"></a>
-<span class="sourceLineNo">495</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.495"></a>
-<span class="sourceLineNo">496</span>   * Before we start up the job, write out an input file with instruction<a name="line.496"></a>
-<span class="sourceLineNo">497</span>   * per client regards which row they are to start on.<a name="line.497"></a>
-<span class="sourceLineNo">498</span>   * @param cmd Command to run.<a name="line.498"></a>
-<span class="sourceLineNo">499</span>   * @throws IOException<a name="line.499"></a>
-<span class="sourceLineNo">500</span>   */<a name="line.500"></a>
-<span class="sourceLineNo">501</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.501"></a>
-<span class="sourceLineNo">502</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.502"></a>
-<span class="sourceLineNo">503</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.503"></a>
-<span class="sourceLineNo">504</span>    assert cmd != null;<a name="line.504"></a>
-<span class="sourceLineNo">505</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.505"></a>
-<span class="sourceLineNo">506</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.506"></a>
-<span class="sourceLineNo">507</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.507"></a>
-<span class="sourceLineNo">508</span>    Job job = Job.getInstance(conf);<a name="line.508"></a>
-<span class="sourceLineNo">509</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.509"></a>
-<span class="sourceLineNo">510</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.510"></a>
-<span class="sourceLineNo">511</span><a name="line.511"></a>
-<span class="sourceLineNo">512</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.512"></a>
-<span class="sourceLineNo">513</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.513"></a>
-<span class="sourceLineNo">514</span>    // this is default, but be explicit about it just in case.<a name="line.514"></a>
-<span class="sourceLineNo">515</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.515"></a>
-<span class="sourceLineNo">516</span><a name="line.516"></a>
-<span class="sourceLineNo">517</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.517"></a>
-<span class="sourceLineNo">518</span>    job.setOutputValueClass(LongWritable.class);<a name="line.518"></a>
-<span class="sourceLineNo">519</span><a name="line.519"></a>
-<span class="sourceLineNo">520</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.520"></a>
-<span class="sourceLineNo">521</span>    job.setReducerClass(LongSumReducer.class);<a name="line.521"></a>
-<span class="sourceLineNo">522</span><a name="line.522"></a>
-<span class="sourceLineNo">523</span>    job.setNumReduceTasks(1);<a name="line.523"></a>
-<span class="sourceLineNo">524</span><a name="line.524"></a>
-<span class="sourceLineNo">525</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.525"></a>
-<span class="sourceLineNo">526</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.526"></a>
-<span class="sourceLineNo">527</span><a name="line.527"></a>
-<span class="sourceLineNo">528</span>    TableMapReduceUtil.addDependencyJars(job);<a name="line.528"></a>
-<span class="sourceLineNo">529</span>    TableMapReduceUtil.addDependencyJarsForClasses(job.getConfiguration(),<a name="line.529"></a>
-<span class="sourceLineNo">530</span>      Histogram.class,     // yammer metrics<a name="line.530"></a>
-<span class="sourceLineNo">531</span>      ObjectMapper.class,  // jackson-mapper-asl<a name="line.531"></a>
-<span class="sourceLineNo">532</span>      FilterAllFilter.class // hbase-server tests jar<a name="line.532"></a>
-<span class="sourceLineNo">533</span>      );<a name="line.533"></a>
+<span class="sourceLineNo">423</span>  /**<a name="line.423"></a>
+<span class="sourceLineNo">424</span>   * generates splits based on total number of rows and specified split regions<a name="line.424"></a>
+<span class="sourceLineNo">425</span>   */<a name="line.425"></a>
+<span class="sourceLineNo">426</span>  protected static byte[][] getSplits(TestOptions opts) {<a name="line.426"></a>
+<span class="sourceLineNo">427</span>    if (opts.presplitRegions == DEFAULT_OPTS.presplitRegions)<a name="line.427"></a>
+<span class="sourceLineNo">428</span>      return null;<a name="line.428"></a>
+<span class="sourceLineNo">429</span><a name="line.429"></a>
+<span class="sourceLineNo">430</span>    int numSplitPoints = opts.presplitRegions - 1;<a name="line.430"></a>
+<span class="sourceLineNo">431</span>    byte[][] splits = new byte[numSplitPoints][];<a name="line.431"></a>
+<span class="sourceLineNo">432</span>    int jump = opts.totalRows / opts.presplitRegions;<a name="line.432"></a>
+<span class="sourceLineNo">433</span>    for (int i = 0; i &lt; numSplitPoints; i++) {<a name="line.433"></a>
+<span class="sourceLineNo">434</span>      int rowkey = jump * (1 + i);<a name="line.434"></a>
+<span class="sourceLineNo">435</span>      splits[i] = format(rowkey);<a name="line.435"></a>
+<span class="sourceLineNo">436</span>    }<a name="line.436"></a>
+<span class="sourceLineNo">437</span>    return splits;<a name="line.437"></a>
+<span class="sourceLineNo">438</span>  }<a name="line.438"></a>
+<span class="sourceLineNo">439</span><a name="line.439"></a>
+<span class="sourceLineNo">440</span>  /*<a name="line.440"></a>
+<span class="sourceLineNo">441</span>   * Run all clients in this vm each to its own thread.<a name="line.441"></a>
+<span class="sourceLineNo">442</span>   */<a name="line.442"></a>
+<span class="sourceLineNo">443</span>  static RunResult[] doLocalClients(final TestOptions opts, final Configuration conf)<a name="line.443"></a>
+<span class="sourceLineNo">444</span>      throws IOException, InterruptedException, ExecutionException {<a name="line.444"></a>
+<span class="sourceLineNo">445</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.445"></a>
+<span class="sourceLineNo">446</span>    assert cmd != null;<a name="line.446"></a>
+<span class="sourceLineNo">447</span>    @SuppressWarnings("unchecked")<a name="line.447"></a>
+<span class="sourceLineNo">448</span>    Future&lt;RunResult&gt;[] threads = new Future[opts.numClientThreads];<a name="line.448"></a>
+<span class="sourceLineNo">449</span>    RunResult[] results = new RunResult[opts.numClientThreads];<a name="line.449"></a>
+<span class="sourceLineNo">450</span>    ExecutorService pool = Executors.newFixedThreadPool(opts.numClientThreads,<a name="line.450"></a>
+<span class="sourceLineNo">451</span>      new ThreadFactoryBuilder().setNameFormat("TestClient-%s").build());<a name="line.451"></a>
+<span class="sourceLineNo">452</span>    final Connection con = ConnectionFactory.createConnection(conf);<a name="line.452"></a>
+<span class="sourceLineNo">453</span>    final AsyncConnection asyncCon = ConnectionFactory.createAsyncConnection(conf).get();<a name="line.453"></a>
+<span class="sourceLineNo">454</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.454"></a>
+<span class="sourceLineNo">455</span>      final int index = i;<a name="line.455"></a>
+<span class="sourceLineNo">456</span>      threads[i] = pool.submit(new Callable&lt;RunResult&gt;() {<a name="line.456"></a>
+<span class="sourceLineNo">457</span>        @Override<a name="line.457"></a>
+<span class="sourceLineNo">458</span>        public RunResult call() throws Exception {<a name="line.458"></a>
+<span class="sourceLineNo">459</span>          TestOptions threadOpts = new TestOptions(opts);<a name="line.459"></a>
+<span class="sourceLineNo">460</span>          if (threadOpts.startRow == 0) threadOpts.startRow = index * threadOpts.perClientRunRows;<a name="line.460"></a>
+<span class="sourceLineNo">461</span>          RunResult run = runOneClient(cmd, conf, con, asyncCon, threadOpts, new Status() {<a name="line.461"></a>
+<span class="sourceLineNo">462</span>            @Override<a name="line.462"></a>
+<span class="sourceLineNo">463</span>            public void setStatus(final String msg) throws IOException {<a name="line.463"></a>
+<span class="sourceLineNo">464</span>              LOG.info(msg);<a name="line.464"></a>
+<span class="sourceLineNo">465</span>            }<a name="line.465"></a>
+<span class="sourceLineNo">466</span>          });<a name="line.466"></a>
+<span class="sourceLineNo">467</span>          LOG.info("Finished " + Thread.currentThread().getName() + " in " + run.duration +<a name="line.467"></a>
+<span class="sourceLineNo">468</span>            "ms over " + threadOpts.perClientRunRows + " rows");<a name="line.468"></a>
+<span class="sourceLineNo">469</span>          return run;<a name="line.469"></a>
+<span class="sourceLineNo">470</span>        }<a name="line.470"></a>
+<span class="sourceLineNo">471</span>      });<a name="line.471"></a>
+<span class="sourceLineNo">472</span>    }<a name="line.472"></a>
+<span class="sourceLineNo">473</span>    pool.shutdown();<a name="line.473"></a>
+<span class="sourceLineNo">474</span><a name="line.474"></a>
+<span class="sourceLineNo">475</span>    for (int i = 0; i &lt; threads.length; i++) {<a name="line.475"></a>
+<span class="sourceLineNo">476</span>      try {<a name="line.476"></a>
+<span class="sourceLineNo">477</span>        results[i] = threads[i].get();<a name="line.477"></a>
+<span class="sourceLineNo">478</span>      } catch (ExecutionException e) {<a name="line.478"></a>
+<span class="sourceLineNo">479</span>        throw new IOException(e.getCause());<a name="line.479"></a>
+<span class="sourceLineNo">480</span>      }<a name="line.480"></a>
+<span class="sourceLineNo">481</span>    }<a name="line.481"></a>
+<span class="sourceLineNo">482</span>    final String test = cmd.getSimpleName();<a name="line.482"></a>
+<span class="sourceLineNo">483</span>    LOG.info("[" + test + "] Summary of timings (ms): "<a name="line.483"></a>
+<span class="sourceLineNo">484</span>             + Arrays.toString(results));<a name="line.484"></a>
+<span class="sourceLineNo">485</span>    Arrays.sort(results);<a name="line.485"></a>
+<span class="sourceLineNo">486</span>    long total = 0;<a name="line.486"></a>
+<span class="sourceLineNo">487</span>    for (RunResult result : results) {<a name="line.487"></a>
+<span class="sourceLineNo">488</span>      total += result.duration;<a name="line.488"></a>
+<span class="sourceLineNo">489</span>    }<a name="line.489"></a>
+<span class="sourceLineNo">490</span>    LOG.info("[" + test + "]"<a name="line.490"></a>
+<span class="sourceLineNo">491</span>      + "\tMin: " + results[0] + "ms"<a name="line.491"></a>
+<span class="sourceLineNo">492</span>      + "\tMax: " + results[results.length - 1] + "ms"<a name="line.492"></a>
+<span class="sourceLineNo">493</span>      + "\tAvg: " + (total / results.length) + "ms");<a name="line.493"></a>
+<span class="sourceLineNo">494</span><a name="line.494"></a>
+<span class="sourceLineNo">495</span>    con.close();<a name="line.495"></a>
+<span class="sourceLineNo">496</span>    asyncCon.close();<a name="line.496"></a>
+<span class="sourceLineNo">497</span><a name="line.497"></a>
+<span class="sourceLineNo">498</span>    return results;<a name="line.498"></a>
+<span class="sourceLineNo">499</span>  }<a name="line.499"></a>
+<span class="sourceLineNo">500</span><a name="line.500"></a>
+<span class="sourceLineNo">501</span>  /*<a name="line.501"></a>
+<span class="sourceLineNo">502</span>   * Run a mapreduce job.  Run as many maps as asked-for clients.<a name="line.502"></a>
+<span class="sourceLineNo">503</span>   * Before we start up the job, write out an input file with instruction<a name="line.503"></a>
+<span class="sourceLineNo">504</span>   * per client regards which row they are to start on.<a name="line.504"></a>
+<span class="sourceLineNo">505</span>   * @param cmd Command to run.<a name="line.505"></a>
+<span class="sourceLineNo">506</span>   * @throws IOException<a name="line.506"></a>
+<span class="sourceLineNo">507</span>   */<a name="line.507"></a>
+<span class="sourceLineNo">508</span>  static Job doMapReduce(TestOptions opts, final Configuration conf)<a name="line.508"></a>
+<span class="sourceLineNo">509</span>      throws IOException, InterruptedException, ClassNotFoundException {<a name="line.509"></a>
+<span class="sourceLineNo">510</span>    final Class&lt;? extends TestBase&gt; cmd = determineCommandClass(opts.cmdName);<a name="line.510"></a>
+<span class="sourceLineNo">511</span>    assert cmd != null;<a name="line.511"></a>
+<span class="sourceLineNo">512</span>    Path inputDir = writeInputFile(conf, opts);<a name="line.512"></a>
+<span class="sourceLineNo">513</span>    conf.set(EvaluationMapTask.CMD_KEY, cmd.getName());<a name="line.513"></a>
+<span class="sourceLineNo">514</span>    conf.set(EvaluationMapTask.PE_KEY, PerformanceEvaluation.class.getName());<a name="line.514"></a>
+<span class="sourceLineNo">515</span>    Job job = Job.getInstance(conf);<a name="line.515"></a>
+<span class="sourceLineNo">516</span>    job.setJarByClass(PerformanceEvaluation.class);<a name="line.516"></a>
+<span class="sourceLineNo">517</span>    job.setJobName("HBase Performance Evaluation - " + opts.cmdName);<a name="line.517"></a>
+<span class="sourceLineNo">518</span><a name="line.518"></a>
+<span class="sourceLineNo">519</span>    job.setInputFormatClass(NLineInputFormat.class);<a name="line.519"></a>
+<span class="sourceLineNo">520</span>    NLineInputFormat.setInputPaths(job, inputDir);<a name="line.520"></a>
+<span class="sourceLineNo">521</span>    // this is default, but be explicit about it just in case.<a name="line.521"></a>
+<span class="sourceLineNo">522</span>    NLineInputFormat.setNumLinesPerSplit(job, 1);<a name="line.522"></a>
+<span class="sourceLineNo">523</span><a name="line.523"></a>
+<span class="sourceLineNo">524</span>    job.setOutputKeyClass(LongWritable.class);<a name="line.524"></a>
+<span class="sourceLineNo">525</span>    job.setOutputValueClass(LongWritable.class);<a name="line.525"></a>
+<span class="sourceLineNo">526</span><a name="line.526"></a>
+<span class="sourceLineNo">527</span>    job.setMapperClass(EvaluationMapTask.class);<a name="line.527"></a>
+<span class="sourceLineNo">528</span>    job.setReducerClass(LongSumReducer.class);<a name="line.528"></a>
+<span class="sourceLineNo">529</span><a name="line.529"></a>
+<span class="sourceLineNo">530</span>    job.setNumReduceTasks(1);<a name="line.530"></a>
+<span class="sourceLineNo">531</span><a name="line.531"></a>
+<span class="sourceLineNo">532</span>    job.setOutputFormatClass(TextOutputFormat.class);<a name="line.532"></a>
+<span class="sourceLineNo">533</span>    TextOutputFormat.setOutputPath(job, new Path(inputDir.getParent(), "outputs"));<a name="line.533"></a>
 <span class="sourceLineNo">534</span><a name="line.534"></a>
-<span class="sourceLineNo">535</span>    TableMapReduceUtil.initCredentials(job);<a name="line.535"></a>
-<span class="sourceLineNo">536</span><a name="line.536"></a>
-<span class="sourceLineNo">537</span>    job.waitForCompletion(true);<a name="line.537"></a>
-<span class="sourceLineNo">538</span>    return job;<a name="line.538"></a>
-<span class="sourceLineNo">539</span>  }<a name="line.539"></a>
-<span class="sourceLineNo">540</span><a name="line.540"></a>
-<span class="sourceLineNo">541</span>  /**<a name="line.541"></a>
-<span class="sourceLineNo">542</span>   * Each client has one mapper to do the work,  and client do the resulting count in a map task.<a name="line.542"></a>
-<span class="sourceLineNo">543</span>   */<a name="line.543"></a>
-<span class="sourceLineNo">544</span><a name="line.544"></a>
-<span class="sourceLineNo">545</span>  static String JOB_INPUT_FILENAME = "input.txt";<a name="line.545"></a>
-<span class="sourceLineNo">546</span><a name="line.546"></a>
-<span class="sourceLineNo">547</span>  /*<a name="line.547"></a>
-<span class="sourceLineNo">548</span>   * Write input file of offsets-per-client for the mapreduce job.<a name="line.548"></a>
-<span class="sourceLineNo">549</span>   * @param c Configuration<a name="line.549"></a>
-<span class="sourceLineNo">550</span>   * @return Directory that contains file written whose name is JOB_INPUT_FILENAME<a name="line.550"></a>
-<span class="sourceLineNo">551</span>   * @throws IOException<a name="line.551"></a>
-<span class="sourceLineNo">552</span>   */<a name="line.552"></a>
-<span class="sourceLineNo">553</span>  static Path writeInputFile(final Configuration c, final TestOptions opts) throws IOException {<a name="line.553"></a>
-<span class="sourceLineNo">554</span>    return writeInputFile(c, opts, new Path("."));<a name="line.554"></a>
-<span class="sourceLineNo">555</span>  }<a name="line.555"></a>
-<span class="sourceLineNo">556</span><a name="line.556"></a>
-<span class="sourceLineNo">557</span>  static Path writeInputFile(final Configuration c, final TestOptions opts, final Path basedir)<a name="line.557"></a>
-<span class="sourceLineNo">558</span>  throws IOException {<a name="line.558"></a>
-<span class="sourceLineNo">559</span>    SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMddHHmmss");<a name="line.559"></a>
-<span class="sourceLineNo">560</span>    Path jobdir = new Path(new Path(basedir, PERF_EVAL_DIR), formatter.format(new Date()));<a name="line.560"></a>
-<span class="sourceLineNo">561</span>    Path inputDir = new Path(jobdir, "inputs");<a name="line.561"></a>
-<span class="sourceLineNo">562</span><a name="line.562"></a>
-<span class="sourceLineNo">563</span>    FileSystem fs = FileSystem.get(c);<a name="line.563"></a>
-<span class="sourceLineNo">564</span>    fs.mkdirs(inputDir);<a name="line.564"></a>
-<span class="sourceLineNo">565</span><a name="line.565"></a>
-<span class="sourceLineNo">566</span>    Path inputFile = new Path(inputDir, JOB_INPUT_FILENAME);<a name="line.566"></a>
-<span class="sourceLineNo">567</span>    PrintStream out = new PrintStream(fs.create(inputFile));<a name="line.567"></a>
-<span class="sourceLineNo">568</span>    // Make input random.<a name="line.568"></a>
-<span class="sourceLineNo">569</span>    Map&lt;Integer, String&gt; m = new TreeMap&lt;&gt;();<a name="line.569"></a>
-<span class="sourceLineNo">570</span>    Hash h = MurmurHash.getInstance();<a name="line.570"></a>
-<span class="sourceLineNo">571</span>    int perClientRows = (opts.totalRows / opts.numClientThreads);<a name="line.571"></a>
-<span class="sourceLineNo">572</span>    try {<a name="line.572"></a>
-<span class="sourceLineNo">573</span>      for (int j = 0; j &lt; opts.numClientThreads; j++) {<a name="line.573"></a>
-<span class="sourceLineNo">574</span>        TestOptions next = new TestOptions(opts);<a name="line.574"></a>
-<span class="sourceLineNo">575</span>        next.startRow = j * perClientRows;<a name="line.575"></a>
-<span class="sourceLineNo">576</span>        next.perClientRunRows = perClientRows;<a name="line.576"></a>
-<span class="sourceLineNo">577</span>        String s = MAPPER.writeValueAsString(next);<a name="line.577"></a>
-<span class="sourceLineNo">578</span>        LOG.info("Client=" + j + ", input=" + s);<a name="line.578"></a>
-<span class="sourceLineNo">579</span>        byte[] b = Bytes.toBytes(s);<a name="line.579"></a>
-<span class="sourceLineNo">580</span>        int hash = h.hash(new ByteArrayHashKey(b, 0, b.length), -1);<a name="line.580"></a>
-<span class="sourceLineNo">581</span>        m.put(hash, s);<a name="line.581"></a>
-<span class="sourceLineNo">582</span>      }<a name="line.582"></a>
-<span class="sourceLineNo">583</span>      for (Map.Entry&lt;Integer, String&gt; e: m.entrySet()) {<a name="line.583"></a>
-<span class="sourceLineNo">584</span>        out.println(e.getValue());<a name="line.584"></a>
-<span class="sourceLineNo">585</span>      }<a name="line.585"></a>
-<span class="sourceLineNo">586</span>    } finally {<a name="line.586"></a>
-<span class="sourceLineNo">587</span>      out.close();<a name="line.587"></a>
-<span class="sourceLineNo">588</span>    }<a name="line.588"></a>
-<span class="sourceLineNo">589</span>    return inputDir;<a name="line.589"></a>
-<span class="sourceLineNo">590</span>  }<a name="line.590"></a>
-<span class="sourceLineNo">591</span><a name="line.591"></a>
-<span class="sourceLineNo">592</span>  /**<a name="line.592"></a>
-<span class="sourceLineNo">593</span>   * Describes a command.<a name="line.593"></a>
-<span class="sourceLineNo">594</span>   */<a name="line.594"></a>
-<span class="sourceLineNo">595</span>  static class CmdDescriptor {<a name="line.595"></a>
-<span class="sourceLineNo">596</span>    private Class&lt;? extends TestBase&gt; cmdClass;<a name="line.596"></a>
-<span class="sourceLineNo">597</span>    private String name;<a name="line.597"></a>
-<span class="sourceLineNo">598</span>    private String description;<a name="line.598"></a>
-<span class="sourceLineNo">599</span><a name="line.599"></a>
-<span class="sourceLineNo">600</span>    CmdDescriptor(Class&lt;? extends TestBase&gt; cmdClass, String name, String description) {<a name="line.600"></a>
-<span class="sourceLineNo">601</span>      this.cmdClass = cmdClass;<a name="line.601"></a>
-<span class="sourceLineNo">602</span>      this.name = name;<a name="line.602"></a>
-<span class="sourceLineNo">603</span>      this.description = description;<a name="line.603"></a>
-<span class="sourceLineNo">604</span>    }<a name="line.604"></a>
-<span class="sourceLineNo">605</span><a name="line.605"></a>
-<span class="sourceLineNo">606</span>    public Class&lt;? extends TestBase&gt; getCmdClass() {<a name="line.606"></a>
-<span class="sourceLineNo">607</span>      return cmdClass;<a name="line.607"></a>
-<span class="sourceLineNo">608</span>    }<a name="line.608"></a>
-<span class="sourceLineNo">609</span><a name="line.609"></a>
-<span class="sourceLineNo">610</span>    public String getName() {<a name="line.610"></a>
-<span class="sourceLineNo">611</span>      return name;<a name="line.611"></a>
-<span class="sourceLineNo">612</span>    }<a name="line.612"></a>
-<span class="sourceLineNo">613</span><a name="line.613"></a>
-<span class="sourceLineNo">614</span>    public String getDescription() {<a name="line.614"></a>
-<span class="sourceLineNo">615</span>      return description;<a name="line.615"></a>
-<span class="sourceLineNo">616</span>    }<a name="line.616"></a>
-<span class="sourceLineNo">617</span>  }<a name="line.617"></a>
-<span class="sourceLineNo">618</span><a name="line.618"></a>
-<span class="sourceLineNo">619</span>  /**<a name="line.619"></a>
-<span class="sourceLineNo">620</span>   * Wraps up options passed to {@link org.apache.hadoop.hbase.PerformanceEvaluation}.<a name="line.620"></a>
-<span class="sourceLineNo">621</span>   * This makes tracking all these arguments a little easier.<a name="line.621"></a>
-<span class="sourceLineNo">622</span>   * NOTE: ADDING AN OPTION, you need to add a data member, a getter/setter (to make JSON<a name="line.622"></a>
-<span class="sourceLineNo">623</span>   * serialization of this TestOptions class behave), and you need to add to the clone constructor<a name="line.623"></a>
-<span class="sourceLineNo">624</span>   * below copying your new option from the 'that' to the 'this'.  Look for 'clone' below.<a name="line.624"></a>
-<span class="sourceLineNo">625</span>   */<a name="line.625"></a>
-<span class="sourceLineNo">626</span>  static class TestOptions {<a name="line.626"></a>
-<span class="sourceLineNo">627</spa

<TRUNCATED>

[40/45] hbase-site git commit: Published site at 1825af45b328cd54680c5c552f07bb12c4705fdb.

Posted by gi...@apache.org.
http://git-wip-us.apache.org/repos/asf/hbase-site/blob/d70bb89e/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
----------------------------------------------------------------------
diff --git a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
index 377b938..6313ac8 100644
--- a/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
+++ b/testdevapidocs/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html
@@ -18,7 +18,7 @@
     catch(err) {
     }
 //-->
-var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10};
+var methods = {"i0":10,"i1":10,"i2":10,"i3":10,"i4":10,"i5":10,"i6":10,"i7":10,"i8":10,"i9":10,"i10":10,"i11":10,"i12":10,"i13":10,"i14":10,"i15":10,"i16":10,"i17":10,"i18":10,"i19":10,"i20":10,"i21":10,"i22":10,"i23":10,"i24":10,"i25":10,"i26":10,"i27":10,"i28":10,"i29":10,"i30":10,"i31":10,"i32":10,"i33":10,"i34":10,"i35":10,"i36":10,"i37":10,"i38":10,"i39":10,"i40":10,"i41":10,"i42":10,"i43":10,"i44":10,"i45":10,"i46":10,"i47":10,"i48":10,"i49":10,"i50":10,"i51":10,"i52":10,"i53":10,"i54":10,"i55":10,"i56":10,"i57":10,"i58":10,"i59":10,"i60":10,"i61":10,"i62":10,"i63":10,"i64":10,"i65":10,"i66":10,"i67":10,"i68":10,"i69":10,"i70":10,"i71":10,"i72":10,"i73":10,"i74":10,"i75":10,"i76":10,"i77":10,"i78":10,"i79":10};
 var tabs = {65535:["t0","All Methods"],2:["t2","Instance Methods"],8:["t4","Concrete Methods"]};
 var altColor = "altColor";
 var rowColor = "rowColor";
@@ -113,7 +113,7 @@ var activeTableTab = "activeTableTab";
 </dl>
 <hr>
 <br>
-<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.626">PerformanceEvaluation.TestOptions</a>
+<pre>static class <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.html#line.633">PerformanceEvaluation.TestOptions</a>
 extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html?is-external=true" title="class or interface in java.lang">Object</a></pre>
 <div class="block">Wraps up options passed to <a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.html" title="class in org.apache.hadoop.hbase"><code>PerformanceEvaluation</code></a>.
  This makes tracking all these arguments a little easier.
@@ -191,118 +191,122 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#cycles">cycles</a></span></code>&nbsp;</td>
 </tr>
 <tr class="rowColor">
+<td class="colFirst"><code>(package private) int</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#families">families</a></span></code>&nbsp;</td>
+</tr>
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#filterAll">filterAll</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#flushCommits">flushCommits</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#inMemoryCF">inMemoryCF</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) org.apache.hadoop.hbase.MemoryCompactionPolicy</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#inMemoryCompaction">inMemoryCompaction</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#measureAfter">measureAfter</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#multiGet">multiGet</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#nomapred">nomapred</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#noOfTags">noOfTags</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#numClientThreads">numClientThreads</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#oneCon">oneCon</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#perClientRunRows">perClientRunRows</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#period">period</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#presplitRegions">presplitRegions</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#randomSleep">randomSleep</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#replicas">replicas</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#reportLatency">reportLatency</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) float</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#sampleRate">sampleRate</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) org.apache.hadoop.hbase.client.Scan.ReadType</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#scanReadType">scanReadType</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) float</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#size">size</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#splitPolicy">splitPolicy</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#startRow">startRow</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#tableName">tableName</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#totalRows">totalRows</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) double</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#traceRate">traceRate</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#useTags">useTags</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#valueRandom">valueRandom</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#valueSize">valueSize</a></span></code>&nbsp;</td>
 </tr>
-<tr class="altColor">
+<tr class="rowColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#valueZipf">valueZipf</a></span></code>&nbsp;</td>
 </tr>
-<tr class="rowColor">
+<tr class="altColor">
 <td class="colFirst"><code>(package private) boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#writeToWAL">writeToWAL</a></span></code>&nbsp;</td>
 </tr>
@@ -384,274 +388,282 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getCycles--">getCycles</a></span>()</code>&nbsp;</td>
 </tr>
 <tr id="i10" class="altColor">
+<td class="colFirst"><code>int</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getFamilies--">getFamilies</a></span>()</code>&nbsp;</td>
+</tr>
+<tr id="i11" class="rowColor">
 <td class="colFirst"><code>org.apache.hadoop.hbase.MemoryCompactionPolicy</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getInMemoryCompaction--">getInMemoryCompaction</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i11" class="rowColor">
+<tr id="i12" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getMeasureAfter--">getMeasureAfter</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i12" class="altColor">
+<tr id="i13" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getMultiGet--">getMultiGet</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i13" class="rowColor">
+<tr id="i14" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getNoOfTags--">getNoOfTags</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i14" class="altColor">
+<tr id="i15" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getNumClientThreads--">getNumClientThreads</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i15" class="rowColor">
+<tr id="i16" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getPerClientRunRows--">getPerClientRunRows</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i16" class="altColor">
+<tr id="i17" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getPeriod--">getPeriod</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i17" class="rowColor">
+<tr id="i18" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getPresplitRegions--">getPresplitRegions</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i18" class="altColor">
+<tr id="i19" class="rowColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getRandomSleep--">getRandomSleep</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i19" class="rowColor">
+<tr id="i20" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getReplicas--">getReplicas</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i20" class="altColor">
+<tr id="i21" class="rowColor">
 <td class="colFirst"><code>float</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getSampleRate--">getSampleRate</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i21" class="rowColor">
+<tr id="i22" class="altColor">
 <td class="colFirst"><code>float</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getSize--">getSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i22" class="altColor">
+<tr id="i23" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getSplitPolicy--">getSplitPolicy</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i23" class="rowColor">
+<tr id="i24" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getStartRow--">getStartRow</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i24" class="altColor">
+<tr id="i25" class="rowColor">
 <td class="colFirst"><code><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a></code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getTableName--">getTableName</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i25" class="rowColor">
+<tr id="i26" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getTotalRows--">getTotalRows</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i26" class="altColor">
+<tr id="i27" class="rowColor">
 <td class="colFirst"><code>double</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getTraceRate--">getTraceRate</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i27" class="rowColor">
+<tr id="i28" class="altColor">
 <td class="colFirst"><code>int</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#getValueSize--">getValueSize</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i28" class="altColor">
+<tr id="i29" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isAutoFlush--">isAutoFlush</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i29" class="rowColor">
+<tr id="i30" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isFilterAll--">isFilterAll</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i30" class="altColor">
+<tr id="i31" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isFlushCommits--">isFlushCommits</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i31" class="rowColor">
+<tr id="i32" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isInMemoryCF--">isInMemoryCF</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i32" class="altColor">
+<tr id="i33" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isNomapred--">isNomapred</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i33" class="rowColor">
+<tr id="i34" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isOneCon--">isOneCon</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i34" class="altColor">
+<tr id="i35" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isReportLatency--">isReportLatency</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i35" class="rowColor">
+<tr id="i36" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isUseTags--">isUseTags</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i36" class="altColor">
+<tr id="i37" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isValueRandom--">isValueRandom</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i37" class="rowColor">
+<tr id="i38" class="altColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isValueZipf--">isValueZipf</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i38" class="altColor">
+<tr id="i39" class="rowColor">
 <td class="colFirst"><code>boolean</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#isWriteToWAL--">isWriteToWAL</a></span>()</code>&nbsp;</td>
 </tr>
-<tr id="i39" class="rowColor">
+<tr id="i40" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setAddColumns-boolean-">setAddColumns</a></span>(boolean&nbsp;addColumns)</code>&nbsp;</td>
 </tr>
-<tr id="i40" class="altColor">
+<tr id="i41" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setAutoFlush-boolean-">setAutoFlush</a></span>(boolean&nbsp;autoFlush)</code>&nbsp;</td>
 </tr>
-<tr id="i41" class="rowColor">
+<tr id="i42" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setBlockEncoding-org.apache.hadoop.hbase.io.encoding.DataBlockEncoding-">setBlockEncoding</a></span>(org.apache.hadoop.hbase.io.encoding.DataBlockEncoding&nbsp;blockEncoding)</code>&nbsp;</td>
 </tr>
-<tr id="i42" class="altColor">
+<tr id="i43" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setBlockSize-int-">setBlockSize</a></span>(int&nbsp;blockSize)</code>&nbsp;</td>
 </tr>
-<tr id="i43" class="rowColor">
+<tr id="i44" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setBloomType-org.apache.hadoop.hbase.regionserver.BloomType-">setBloomType</a></span>(org.apache.hadoop.hbase.regionserver.BloomType&nbsp;bloomType)</code>&nbsp;</td>
 </tr>
-<tr id="i44" class="altColor">
+<tr id="i45" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setBufferSize-long-">setBufferSize</a></span>(long&nbsp;bufferSize)</code>&nbsp;</td>
 </tr>
-<tr id="i45" class="rowColor">
+<tr id="i46" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setCaching-int-">setCaching</a></span>(int&nbsp;caching)</code>&nbsp;</td>
 </tr>
-<tr id="i46" class="altColor">
+<tr id="i47" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setCmdName-java.lang.String-">setCmdName</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmdName)</code>&nbsp;</td>
 </tr>
-<tr id="i47" class="rowColor">
+<tr id="i48" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setColumns-int-">setColumns</a></span>(int&nbsp;columns)</code>&nbsp;</td>
 </tr>
-<tr id="i48" class="altColor">
+<tr id="i49" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setCompression-org.apache.hadoop.hbase.io.compress.Compression.Algorithm-">setCompression</a></span>(org.apache.hadoop.hbase.io.compress.Compression.Algorithm&nbsp;compression)</code>&nbsp;</td>
 </tr>
-<tr id="i49" class="rowColor">
+<tr id="i50" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setCycles-int-">setCycles</a></span>(int&nbsp;cycles)</code>&nbsp;</td>
 </tr>
-<tr id="i50" class="altColor">
+<tr id="i51" class="rowColor">
+<td class="colFirst"><code>void</code></td>
+<td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setFamilies-int-">setFamilies</a></span>(int&nbsp;families)</code>&nbsp;</td>
+</tr>
+<tr id="i52" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setFilterAll-boolean-">setFilterAll</a></span>(boolean&nbsp;filterAll)</code>&nbsp;</td>
 </tr>
-<tr id="i51" class="rowColor">
+<tr id="i53" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setFlushCommits-boolean-">setFlushCommits</a></span>(boolean&nbsp;flushCommits)</code>&nbsp;</td>
 </tr>
-<tr id="i52" class="altColor">
+<tr id="i54" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setInMemoryCF-boolean-">setInMemoryCF</a></span>(boolean&nbsp;inMemoryCF)</code>&nbsp;</td>
 </tr>
-<tr id="i53" class="rowColor">
+<tr id="i55" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setInMemoryCompaction-org.apache.hadoop.hbase.MemoryCompactionPolicy-">setInMemoryCompaction</a></span>(org.apache.hadoop.hbase.MemoryCompactionPolicy&nbsp;inMemoryCompaction)</code>&nbsp;</td>
 </tr>
-<tr id="i54" class="altColor">
+<tr id="i56" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setMeasureAfter-int-">setMeasureAfter</a></span>(int&nbsp;measureAfter)</code>&nbsp;</td>
 </tr>
-<tr id="i55" class="rowColor">
+<tr id="i57" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setMultiGet-int-">setMultiGet</a></span>(int&nbsp;multiGet)</code>&nbsp;</td>
 </tr>
-<tr id="i56" class="altColor">
+<tr id="i58" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setNomapred-boolean-">setNomapred</a></span>(boolean&nbsp;nomapred)</code>&nbsp;</td>
 </tr>
-<tr id="i57" class="rowColor">
+<tr id="i59" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setNoOfTags-int-">setNoOfTags</a></span>(int&nbsp;noOfTags)</code>&nbsp;</td>
 </tr>
-<tr id="i58" class="altColor">
+<tr id="i60" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setNumClientThreads-int-">setNumClientThreads</a></span>(int&nbsp;numClientThreads)</code>&nbsp;</td>
 </tr>
-<tr id="i59" class="rowColor">
+<tr id="i61" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setOneCon-boolean-">setOneCon</a></span>(boolean&nbsp;oneCon)</code>&nbsp;</td>
 </tr>
-<tr id="i60" class="altColor">
+<tr id="i62" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setPerClientRunRows-int-">setPerClientRunRows</a></span>(int&nbsp;perClientRunRows)</code>&nbsp;</td>
 </tr>
-<tr id="i61" class="rowColor">
+<tr id="i63" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setPeriod-int-">setPeriod</a></span>(int&nbsp;period)</code>&nbsp;</td>
 </tr>
-<tr id="i62" class="altColor">
+<tr id="i64" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setPresplitRegions-int-">setPresplitRegions</a></span>(int&nbsp;presplitRegions)</code>&nbsp;</td>
 </tr>
-<tr id="i63" class="rowColor">
+<tr id="i65" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setRandomSleep-int-">setRandomSleep</a></span>(int&nbsp;randomSleep)</code>&nbsp;</td>
 </tr>
-<tr id="i64" class="altColor">
+<tr id="i66" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setReplicas-int-">setReplicas</a></span>(int&nbsp;replicas)</code>&nbsp;</td>
 </tr>
-<tr id="i65" class="rowColor">
+<tr id="i67" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setReportLatency-boolean-">setReportLatency</a></span>(boolean&nbsp;reportLatency)</code>&nbsp;</td>
 </tr>
-<tr id="i66" class="altColor">
+<tr id="i68" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setSampleRate-float-">setSampleRate</a></span>(float&nbsp;sampleRate)</code>&nbsp;</td>
 </tr>
-<tr id="i67" class="rowColor">
+<tr id="i69" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setSize-float-">setSize</a></span>(float&nbsp;size)</code>&nbsp;</td>
 </tr>
-<tr id="i68" class="altColor">
+<tr id="i70" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setSplitPolicy-java.lang.String-">setSplitPolicy</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;splitPolicy)</code>&nbsp;</td>
 </tr>
-<tr id="i69" class="rowColor">
+<tr id="i71" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setStartRow-int-">setStartRow</a></span>(int&nbsp;startRow)</code>&nbsp;</td>
 </tr>
-<tr id="i70" class="altColor">
+<tr id="i72" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setTableName-java.lang.String-">setTableName</a></span>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName)</code>&nbsp;</td>
 </tr>
-<tr id="i71" class="rowColor">
+<tr id="i73" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setTotalRows-int-">setTotalRows</a></span>(int&nbsp;totalRows)</code>&nbsp;</td>
 </tr>
-<tr id="i72" class="altColor">
+<tr id="i74" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setTraceRate-double-">setTraceRate</a></span>(double&nbsp;traceRate)</code>&nbsp;</td>
 </tr>
-<tr id="i73" class="rowColor">
+<tr id="i75" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setUseTags-boolean-">setUseTags</a></span>(boolean&nbsp;useTags)</code>&nbsp;</td>
 </tr>
-<tr id="i74" class="altColor">
+<tr id="i76" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setValueRandom-boolean-">setValueRandom</a></span>(boolean&nbsp;valueRandom)</code>&nbsp;</td>
 </tr>
-<tr id="i75" class="rowColor">
+<tr id="i77" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setValueSize-int-">setValueSize</a></span>(int&nbsp;valueSize)</code>&nbsp;</td>
 </tr>
-<tr id="i76" class="altColor">
+<tr id="i78" class="altColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setValueZipf-boolean-">setValueZipf</a></span>(boolean&nbsp;valueZipf)</code>&nbsp;</td>
 </tr>
-<tr id="i77" class="rowColor">
+<tr id="i79" class="rowColor">
 <td class="colFirst"><code>void</code></td>
 <td class="colLast"><code><span class="memberNameLink"><a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#setWriteToWAL-boolean-">setWriteToWAL</a></span>(boolean&nbsp;writeToWAL)</code>&nbsp;</td>
 </tr>
@@ -683,7 +695,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cmdName</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.627">cmdName</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.634">cmdName</a></pre>
 </li>
 </ul>
 <a name="nomapred">
@@ -692,7 +704,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>nomapred</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.628">nomapred</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.635">nomapred</a></pre>
 </li>
 </ul>
 <a name="filterAll">
@@ -701,7 +713,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>filterAll</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.629">filterAll</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.636">filterAll</a></pre>
 </li>
 </ul>
 <a name="startRow">
@@ -710,7 +722,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>startRow</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.630">startRow</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.637">startRow</a></pre>
 </li>
 </ul>
 <a name="size">
@@ -719,7 +731,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>size</h4>
-<pre>float <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.631">size</a></pre>
+<pre>float <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.638">size</a></pre>
 </li>
 </ul>
 <a name="perClientRunRows">
@@ -728,7 +740,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>perClientRunRows</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.632">perClientRunRows</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.639">perClientRunRows</a></pre>
 </li>
 </ul>
 <a name="numClientThreads">
@@ -737,7 +749,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>numClientThreads</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.633">numClientThreads</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.640">numClientThreads</a></pre>
 </li>
 </ul>
 <a name="totalRows">
@@ -746,7 +758,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>totalRows</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.634">totalRows</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.641">totalRows</a></pre>
 </li>
 </ul>
 <a name="measureAfter">
@@ -755,7 +767,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>measureAfter</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.635">measureAfter</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.642">measureAfter</a></pre>
 </li>
 </ul>
 <a name="sampleRate">
@@ -764,7 +776,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>sampleRate</h4>
-<pre>float <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.636">sampleRate</a></pre>
+<pre>float <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.643">sampleRate</a></pre>
 </li>
 </ul>
 <a name="traceRate">
@@ -773,7 +785,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>traceRate</h4>
-<pre>double <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.637">traceRate</a></pre>
+<pre>double <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.644">traceRate</a></pre>
 </li>
 </ul>
 <a name="tableName">
@@ -782,7 +794,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>tableName</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.638">tableName</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.645">tableName</a></pre>
 </li>
 </ul>
 <a name="flushCommits">
@@ -791,7 +803,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>flushCommits</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.639">flushCommits</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.646">flushCommits</a></pre>
 </li>
 </ul>
 <a name="writeToWAL">
@@ -800,7 +812,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>writeToWAL</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.640">writeToWAL</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.647">writeToWAL</a></pre>
 </li>
 </ul>
 <a name="autoFlush">
@@ -809,7 +821,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>autoFlush</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.641">autoFlush</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.648">autoFlush</a></pre>
 </li>
 </ul>
 <a name="oneCon">
@@ -818,7 +830,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>oneCon</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.642">oneCon</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.649">oneCon</a></pre>
 </li>
 </ul>
 <a name="useTags">
@@ -827,7 +839,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>useTags</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.643">useTags</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.650">useTags</a></pre>
 </li>
 </ul>
 <a name="noOfTags">
@@ -836,7 +848,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>noOfTags</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.644">noOfTags</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.651">noOfTags</a></pre>
 </li>
 </ul>
 <a name="reportLatency">
@@ -845,7 +857,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>reportLatency</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.645">reportLatency</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.652">reportLatency</a></pre>
 </li>
 </ul>
 <a name="multiGet">
@@ -854,7 +866,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>multiGet</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.646">multiGet</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.653">multiGet</a></pre>
 </li>
 </ul>
 <a name="randomSleep">
@@ -863,7 +875,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>randomSleep</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.647">randomSleep</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.654">randomSleep</a></pre>
 </li>
 </ul>
 <a name="inMemoryCF">
@@ -872,7 +884,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>inMemoryCF</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.648">inMemoryCF</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.655">inMemoryCF</a></pre>
 </li>
 </ul>
 <a name="presplitRegions">
@@ -881,7 +893,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>presplitRegions</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.649">presplitRegions</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.656">presplitRegions</a></pre>
 </li>
 </ul>
 <a name="replicas">
@@ -890,7 +902,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>replicas</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.650">replicas</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.657">replicas</a></pre>
 </li>
 </ul>
 <a name="splitPolicy">
@@ -899,7 +911,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>splitPolicy</h4>
-<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.651">splitPolicy</a></pre>
+<pre><a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a> <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.658">splitPolicy</a></pre>
 </li>
 </ul>
 <a name="compression">
@@ -908,7 +920,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>compression</h4>
-<pre>org.apache.hadoop.hbase.io.compress.Compression.Algorithm <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.652">compression</a></pre>
+<pre>org.apache.hadoop.hbase.io.compress.Compression.Algorithm <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.659">compression</a></pre>
 </li>
 </ul>
 <a name="bloomType">
@@ -917,7 +929,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>bloomType</h4>
-<pre>org.apache.hadoop.hbase.regionserver.BloomType <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.653">bloomType</a></pre>
+<pre>org.apache.hadoop.hbase.regionserver.BloomType <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.660">bloomType</a></pre>
 </li>
 </ul>
 <a name="blockSize">
@@ -926,7 +938,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>blockSize</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.654">blockSize</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.661">blockSize</a></pre>
 </li>
 </ul>
 <a name="blockEncoding">
@@ -935,7 +947,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>blockEncoding</h4>
-<pre>org.apache.hadoop.hbase.io.encoding.DataBlockEncoding <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.655">blockEncoding</a></pre>
+<pre>org.apache.hadoop.hbase.io.encoding.DataBlockEncoding <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.662">blockEncoding</a></pre>
 </li>
 </ul>
 <a name="valueRandom">
@@ -944,7 +956,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>valueRandom</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.656">valueRandom</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.663">valueRandom</a></pre>
 </li>
 </ul>
 <a name="valueZipf">
@@ -953,7 +965,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>valueZipf</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.657">valueZipf</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.664">valueZipf</a></pre>
 </li>
 </ul>
 <a name="valueSize">
@@ -962,7 +974,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>valueSize</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.658">valueSize</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.665">valueSize</a></pre>
 </li>
 </ul>
 <a name="period">
@@ -971,7 +983,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>period</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.659">period</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.666">period</a></pre>
 </li>
 </ul>
 <a name="cycles">
@@ -980,7 +992,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cycles</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.660">cycles</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.667">cycles</a></pre>
 </li>
 </ul>
 <a name="columns">
@@ -989,7 +1001,16 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>columns</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.661">columns</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.668">columns</a></pre>
+</li>
+</ul>
+<a name="families">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>families</h4>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.669">families</a></pre>
 </li>
 </ul>
 <a name="caching">
@@ -998,7 +1019,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>caching</h4>
-<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.662">caching</a></pre>
+<pre>int <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.670">caching</a></pre>
 </li>
 </ul>
 <a name="addColumns">
@@ -1007,7 +1028,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>addColumns</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.663">addColumns</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.671">addColumns</a></pre>
 </li>
 </ul>
 <a name="inMemoryCompaction">
@@ -1016,7 +1037,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>inMemoryCompaction</h4>
-<pre>org.apache.hadoop.hbase.MemoryCompactionPolicy <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.664">inMemoryCompaction</a></pre>
+<pre>org.apache.hadoop.hbase.MemoryCompactionPolicy <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.672">inMemoryCompaction</a></pre>
 </li>
 </ul>
 <a name="asyncPrefetch">
@@ -1025,7 +1046,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>asyncPrefetch</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.667">asyncPrefetch</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.675">asyncPrefetch</a></pre>
 </li>
 </ul>
 <a name="cacheBlocks">
@@ -1034,7 +1055,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>cacheBlocks</h4>
-<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.668">cacheBlocks</a></pre>
+<pre>boolean <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.676">cacheBlocks</a></pre>
 </li>
 </ul>
 <a name="scanReadType">
@@ -1043,7 +1064,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>scanReadType</h4>
-<pre>org.apache.hadoop.hbase.client.Scan.ReadType <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.669">scanReadType</a></pre>
+<pre>org.apache.hadoop.hbase.client.Scan.ReadType <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.677">scanReadType</a></pre>
 </li>
 </ul>
 <a name="bufferSize">
@@ -1052,7 +1073,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>bufferSize</h4>
-<pre>long <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.670">bufferSize</a></pre>
+<pre>long <a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.678">bufferSize</a></pre>
 </li>
 </ul>
 </li>
@@ -1069,7 +1090,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>TestOptions</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.672">TestOptions</a>()</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.680">TestOptions</a>()</pre>
 </li>
 </ul>
 <a name="TestOptions-org.apache.hadoop.hbase.PerformanceEvaluation.TestOptions-">
@@ -1078,7 +1099,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockListLast">
 <li class="blockList">
 <h4>TestOptions</h4>
-<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.678">TestOptions</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;that)</pre>
+<pre>public&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.686">TestOptions</a>(<a href="../../../../org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html" title="class in org.apache.hadoop.hbase">PerformanceEvaluation.TestOptions</a>&nbsp;that)</pre>
 <div class="block">Clone constructor.</div>
 <dl>
 <dt><span class="paramLabel">Parameters:</span></dt>
@@ -1100,7 +1121,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getCaching</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.723">getCaching</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.732">getCaching</a>()</pre>
 </li>
 </ul>
 <a name="setCaching-int-">
@@ -1109,7 +1130,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setCaching</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.727">setCaching</a>(int&nbsp;caching)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.736">setCaching</a>(int&nbsp;caching)</pre>
 </li>
 </ul>
 <a name="getColumns--">
@@ -1118,7 +1139,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getColumns</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.731">getColumns</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.740">getColumns</a>()</pre>
 </li>
 </ul>
 <a name="setColumns-int-">
@@ -1127,7 +1148,25 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setColumns</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.735">setColumns</a>(int&nbsp;columns)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.744">setColumns</a>(int&nbsp;columns)</pre>
+</li>
+</ul>
+<a name="getFamilies--">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>getFamilies</h4>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.748">getFamilies</a>()</pre>
+</li>
+</ul>
+<a name="setFamilies-int-">
+<!--   -->
+</a>
+<ul class="blockList">
+<li class="blockList">
+<h4>setFamilies</h4>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.752">setFamilies</a>(int&nbsp;families)</pre>
 </li>
 </ul>
 <a name="getCycles--">
@@ -1136,7 +1175,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getCycles</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.739">getCycles</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.756">getCycles</a>()</pre>
 </li>
 </ul>
 <a name="setCycles-int-">
@@ -1145,7 +1184,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setCycles</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.743">setCycles</a>(int&nbsp;cycles)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.760">setCycles</a>(int&nbsp;cycles)</pre>
 </li>
 </ul>
 <a name="isValueZipf--">
@@ -1154,7 +1193,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isValueZipf</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.747">isValueZipf</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.764">isValueZipf</a>()</pre>
 </li>
 </ul>
 <a name="setValueZipf-boolean-">
@@ -1163,7 +1202,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setValueZipf</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.751">setValueZipf</a>(boolean&nbsp;valueZipf)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.768">setValueZipf</a>(boolean&nbsp;valueZipf)</pre>
 </li>
 </ul>
 <a name="getCmdName--">
@@ -1172,7 +1211,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getCmdName</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.755">getCmdName</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.772">getCmdName</a>()</pre>
 </li>
 </ul>
 <a name="setCmdName-java.lang.String-">
@@ -1181,7 +1220,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setCmdName</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.759">setCmdName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmdName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.776">setCmdName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;cmdName)</pre>
 </li>
 </ul>
 <a name="getRandomSleep--">
@@ -1190,7 +1229,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getRandomSleep</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.763">getRandomSleep</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.780">getRandomSleep</a>()</pre>
 </li>
 </ul>
 <a name="setRandomSleep-int-">
@@ -1199,7 +1238,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setRandomSleep</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.767">setRandomSleep</a>(int&nbsp;randomSleep)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.784">setRandomSleep</a>(int&nbsp;randomSleep)</pre>
 </li>
 </ul>
 <a name="getReplicas--">
@@ -1208,7 +1247,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getReplicas</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.771">getReplicas</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.788">getReplicas</a>()</pre>
 </li>
 </ul>
 <a name="setReplicas-int-">
@@ -1217,7 +1256,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setReplicas</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.775">setReplicas</a>(int&nbsp;replicas)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.792">setReplicas</a>(int&nbsp;replicas)</pre>
 </li>
 </ul>
 <a name="getSplitPolicy--">
@@ -1226,7 +1265,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getSplitPolicy</h4>
-<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.779">getSplitPolicy</a>()</pre>
+<pre>public&nbsp;<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.796">getSplitPolicy</a>()</pre>
 </li>
 </ul>
 <a name="setSplitPolicy-java.lang.String-">
@@ -1235,7 +1274,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setSplitPolicy</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.783">setSplitPolicy</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;splitPolicy)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.800">setSplitPolicy</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;splitPolicy)</pre>
 </li>
 </ul>
 <a name="setNomapred-boolean-">
@@ -1244,7 +1283,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setNomapred</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.787">setNomapred</a>(boolean&nbsp;nomapred)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.804">setNomapred</a>(boolean&nbsp;nomapred)</pre>
 </li>
 </ul>
 <a name="setFilterAll-boolean-">
@@ -1253,7 +1292,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setFilterAll</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.791">setFilterAll</a>(boolean&nbsp;filterAll)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.808">setFilterAll</a>(boolean&nbsp;filterAll)</pre>
 </li>
 </ul>
 <a name="setStartRow-int-">
@@ -1262,7 +1301,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setStartRow</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.795">setStartRow</a>(int&nbsp;startRow)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.812">setStartRow</a>(int&nbsp;startRow)</pre>
 </li>
 </ul>
 <a name="setSize-float-">
@@ -1271,7 +1310,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.799">setSize</a>(float&nbsp;size)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.816">setSize</a>(float&nbsp;size)</pre>
 </li>
 </ul>
 <a name="setPerClientRunRows-int-">
@@ -1280,7 +1319,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setPerClientRunRows</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.803">setPerClientRunRows</a>(int&nbsp;perClientRunRows)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.820">setPerClientRunRows</a>(int&nbsp;perClientRunRows)</pre>
 </li>
 </ul>
 <a name="setNumClientThreads-int-">
@@ -1289,7 +1328,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setNumClientThreads</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.807">setNumClientThreads</a>(int&nbsp;numClientThreads)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.824">setNumClientThreads</a>(int&nbsp;numClientThreads)</pre>
 </li>
 </ul>
 <a name="setTotalRows-int-">
@@ -1298,7 +1337,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setTotalRows</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.811">setTotalRows</a>(int&nbsp;totalRows)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.828">setTotalRows</a>(int&nbsp;totalRows)</pre>
 </li>
 </ul>
 <a name="setSampleRate-float-">
@@ -1307,7 +1346,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setSampleRate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.815">setSampleRate</a>(float&nbsp;sampleRate)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.832">setSampleRate</a>(float&nbsp;sampleRate)</pre>
 </li>
 </ul>
 <a name="setTraceRate-double-">
@@ -1316,7 +1355,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setTraceRate</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.819">setTraceRate</a>(double&nbsp;traceRate)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.836">setTraceRate</a>(double&nbsp;traceRate)</pre>
 </li>
 </ul>
 <a name="setTableName-java.lang.String-">
@@ -1325,7 +1364,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setTableName</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.823">setTableName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.840">setTableName</a>(<a href="https://docs.oracle.com/javase/8/docs/api/java/lang/String.html?is-external=true" title="class or interface in java.lang">String</a>&nbsp;tableName)</pre>
 </li>
 </ul>
 <a name="setFlushCommits-boolean-">
@@ -1334,7 +1373,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setFlushCommits</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.827">setFlushCommits</a>(boolean&nbsp;flushCommits)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.844">setFlushCommits</a>(boolean&nbsp;flushCommits)</pre>
 </li>
 </ul>
 <a name="setWriteToWAL-boolean-">
@@ -1343,7 +1382,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setWriteToWAL</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.831">setWriteToWAL</a>(boolean&nbsp;writeToWAL)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.848">setWriteToWAL</a>(boolean&nbsp;writeToWAL)</pre>
 </li>
 </ul>
 <a name="setAutoFlush-boolean-">
@@ -1352,7 +1391,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setAutoFlush</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.835">setAutoFlush</a>(boolean&nbsp;autoFlush)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.852">setAutoFlush</a>(boolean&nbsp;autoFlush)</pre>
 </li>
 </ul>
 <a name="setOneCon-boolean-">
@@ -1361,7 +1400,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setOneCon</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.839">setOneCon</a>(boolean&nbsp;oneCon)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.856">setOneCon</a>(boolean&nbsp;oneCon)</pre>
 </li>
 </ul>
 <a name="setUseTags-boolean-">
@@ -1370,7 +1409,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setUseTags</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.843">setUseTags</a>(boolean&nbsp;useTags)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.860">setUseTags</a>(boolean&nbsp;useTags)</pre>
 </li>
 </ul>
 <a name="setNoOfTags-int-">
@@ -1379,7 +1418,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setNoOfTags</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.847">setNoOfTags</a>(int&nbsp;noOfTags)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.864">setNoOfTags</a>(int&nbsp;noOfTags)</pre>
 </li>
 </ul>
 <a name="setReportLatency-boolean-">
@@ -1388,7 +1427,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setReportLatency</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.851">setReportLatency</a>(boolean&nbsp;reportLatency)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.868">setReportLatency</a>(boolean&nbsp;reportLatency)</pre>
 </li>
 </ul>
 <a name="setMultiGet-int-">
@@ -1397,7 +1436,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setMultiGet</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.855">setMultiGet</a>(int&nbsp;multiGet)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.872">setMultiGet</a>(int&nbsp;multiGet)</pre>
 </li>
 </ul>
 <a name="setInMemoryCF-boolean-">
@@ -1406,7 +1445,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setInMemoryCF</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.859">setInMemoryCF</a>(boolean&nbsp;inMemoryCF)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.876">setInMemoryCF</a>(boolean&nbsp;inMemoryCF)</pre>
 </li>
 </ul>
 <a name="setPresplitRegions-int-">
@@ -1415,7 +1454,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setPresplitRegions</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.863">setPresplitRegions</a>(int&nbsp;presplitRegions)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.880">setPresplitRegions</a>(int&nbsp;presplitRegions)</pre>
 </li>
 </ul>
 <a name="setCompression-org.apache.hadoop.hbase.io.compress.Compression.Algorithm-">
@@ -1424,7 +1463,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setCompression</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.867">setCompression</a>(org.apache.hadoop.hbase.io.compress.Compression.Algorithm&nbsp;compression)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.884">setCompression</a>(org.apache.hadoop.hbase.io.compress.Compression.Algorithm&nbsp;compression)</pre>
 </li>
 </ul>
 <a name="setBloomType-org.apache.hadoop.hbase.regionserver.BloomType-">
@@ -1433,7 +1472,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setBloomType</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.871">setBloomType</a>(org.apache.hadoop.hbase.regionserver.BloomType&nbsp;bloomType)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.888">setBloomType</a>(org.apache.hadoop.hbase.regionserver.BloomType&nbsp;bloomType)</pre>
 </li>
 </ul>
 <a name="setBlockSize-int-">
@@ -1442,7 +1481,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setBlockSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.875">setBlockSize</a>(int&nbsp;blockSize)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.892">setBlockSize</a>(int&nbsp;blockSize)</pre>
 </li>
 </ul>
 <a name="setBlockEncoding-org.apache.hadoop.hbase.io.encoding.DataBlockEncoding-">
@@ -1451,7 +1490,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setBlockEncoding</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.879">setBlockEncoding</a>(org.apache.hadoop.hbase.io.encoding.DataBlockEncoding&nbsp;blockEncoding)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.896">setBlockEncoding</a>(org.apache.hadoop.hbase.io.encoding.DataBlockEncoding&nbsp;blockEncoding)</pre>
 </li>
 </ul>
 <a name="setValueRandom-boolean-">
@@ -1460,7 +1499,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setValueRandom</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.883">setValueRandom</a>(boolean&nbsp;valueRandom)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.900">setValueRandom</a>(boolean&nbsp;valueRandom)</pre>
 </li>
 </ul>
 <a name="setValueSize-int-">
@@ -1469,7 +1508,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setValueSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.887">setValueSize</a>(int&nbsp;valueSize)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.904">setValueSize</a>(int&nbsp;valueSize)</pre>
 </li>
 </ul>
 <a name="setBufferSize-long-">
@@ -1478,7 +1517,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setBufferSize</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.891">setBufferSize</a>(long&nbsp;bufferSize)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.908">setBufferSize</a>(long&nbsp;bufferSize)</pre>
 </li>
 </ul>
 <a name="setPeriod-int-">
@@ -1487,7 +1526,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>setPeriod</h4>
-<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.895">setPeriod</a>(int&nbsp;period)</pre>
+<pre>public&nbsp;void&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.912">setPeriod</a>(int&nbsp;period)</pre>
 </li>
 </ul>
 <a name="isNomapred--">
@@ -1496,7 +1535,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isNomapred</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.899">isNomapred</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.916">isNomapred</a>()</pre>
 </li>
 </ul>
 <a name="isFilterAll--">
@@ -1505,7 +1544,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>isFilterAll</h4>
-<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.903">isFilterAll</a>()</pre>
+<pre>public&nbsp;boolean&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.920">isFilterAll</a>()</pre>
 </li>
 </ul>
 <a name="getStartRow--">
@@ -1514,7 +1553,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class="blockList">
 <li class="blockList">
 <h4>getStartRow</h4>
-<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.907">getStartRow</a>()</pre>
+<pre>public&nbsp;int&nbsp;<a href="../../../../src-html/org/apache/hadoop/hbase/PerformanceEvaluation.TestOptions.html#line.924">getStartRow</a>()</pre>
 </li>
 </ul>
 <a name="getSize--">
@@ -1523,7 +1562,7 @@ extends <a href="https://docs.oracle.com/javase/8/docs/api/java/lang/Object.html
 <ul class

<TRUNCATED>